mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-10-30 19:43:52 +00:00 
			
		
		
		
	Compare commits
	
		
			457 Commits
		
	
	
		
			osmith/fix
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | ebc38e4f26 | ||
|  | e2ab44a439 | ||
|  | 8b3cced773 | ||
|  | 3d1b0770f4 | ||
|  | 99743fb7ec | ||
|  | a2a42a7561 | ||
|  | ebd57da87d | ||
|  | b0ee082bb0 | ||
|  | 81f6a4c0bf | ||
|  | 3978de52c1 | ||
|  | 7faf692cb7 | ||
|  | 0cf25d5154 | ||
|  | 08db178271 | ||
|  | 936d8c1b64 | ||
|  | 3170305e56 | ||
|  | 0f3490dd03 | ||
|  | 61e5e7bd8b | ||
|  | f7b06fbe0c | ||
|  | 45403b1804 | ||
|  | 6782cea4bf | ||
|  | ec7ecab66f | ||
|  | d1287e379b | ||
|  | 3fb44f3e61 | ||
|  | d48bfe0e93 | ||
|  | 41cdaf520d | ||
|  | f94418a129 | ||
|  | 88b299ca24 | ||
|  | 58a2758e78 | ||
|  | be3fdc2c6e | ||
|  | 6a8d765334 | ||
|  | adebbfdfa7 | ||
|  | afccfb9380 | ||
|  | 0f7a8258f0 | ||
|  | 2aa7f10939 | ||
|  | 37ba5b3e35 | ||
|  | 9f63d2b4ad | ||
|  | d21b5de8c0 | ||
|  | 12b63716e2 | ||
|  | 184961ea3e | ||
|  | a9ec86029f | ||
|  | d1b19f3308 | ||
|  | 33f531fd12 | ||
|  | b051b3b161 | ||
|  | 479a3aa707 | ||
|  | fd2a877e25 | ||
|  | 53f797305f | ||
|  | 691b40e834 | ||
|  | e511d54dd0 | ||
|  | 6edf7b9a51 | ||
|  | e4045679a8 | ||
|  | 52ae9a461b | ||
|  | 5bd9493257 | ||
|  | c92fd5d9d3 | ||
|  | 01cf14d679 | ||
|  | 840447e2bf | ||
|  | 3f7586d571 | ||
|  | b74a9f13e5 | ||
|  | bbc2c6e765 | ||
|  | 7e3724ad18 | ||
|  | 569dccf947 | ||
|  | 89a378e9aa | ||
|  | 4a78c7b250 | ||
|  | c71013091a | ||
|  | 4b1cde10fe | ||
|  | 0f5a2345d1 | ||
|  | ae81ff95ea | ||
|  | e5981edf6a | ||
|  | 93cc16ae4f | ||
|  | 119a1976f5 | ||
|  | c53c2ab524 | ||
|  | 32423500f6 | ||
|  | c3a6a1dbe5 | ||
|  | f4f090ee36 | ||
|  | 2a554bfcc4 | ||
|  | a12dea66ca | ||
|  | ec59bb04df | ||
|  | 4417f7f477 | ||
|  | 39563af27c | ||
|  | 242faaafd1 | ||
|  | f77c0cd428 | ||
|  | 4103a3e5b9 | ||
|  | 4aca7f621f | ||
|  | 507d536ce8 | ||
|  | cb618c7980 | ||
|  | 3c0702d3c5 | ||
|  | caf24567d1 | ||
|  | 1d34c6ac5a | ||
|  | 1506f8e465 | ||
|  | f044c585e2 | ||
|  | 6d17dd1314 | ||
|  | 7cb6867ea3 | ||
|  | d8138c43a1 | ||
|  | 46d9b94477 | ||
|  | 4f705b9f99 | ||
|  | c592e697ce | ||
|  | ebb6b99c63 | ||
|  | e08253a3f7 | ||
|  | 5e86095364 | ||
|  | a7c144888d | ||
|  | 7897c4446b | ||
|  | ff9e09b2bc | ||
|  | ecf5cc294d | ||
|  | 82126763a7 | ||
|  | a380c89a9c | ||
|  | bedaf5da64 | ||
|  | 2b08aa35a6 | ||
|  | c24632930a | ||
|  | f140348eff | ||
|  | b5de1b0781 | ||
|  | b022cc3b8e | ||
|  | e8396c9663 | ||
|  | 941839b300 | ||
|  | 23a0e46f11 | ||
|  | cb8fd6e99e | ||
|  | e66bea8ad7 | ||
|  | e8a9f471ef | ||
|  | c2d66bdf5a | ||
|  | 80b584bbe7 | ||
|  | 15c21e8eec | ||
|  | c0a1fff064 | ||
|  | 77fa4d2386 | ||
|  | 9be8752541 | ||
|  | 2b57b3cea4 | ||
|  | 00c531709a | ||
|  | a094108f84 | ||
|  | 61e73eec3f | ||
|  | 1aa2798919 | ||
|  | b829eac9bc | ||
|  | 7b1719327d | ||
|  | 493645eda9 | ||
|  | 8614cd0be7 | ||
|  | 19bd74d093 | ||
|  | 4821b5a847 | ||
|  | 84df56d577 | ||
|  | 4e23d5f87f | ||
|  | 4346424987 | ||
|  | 520656e004 | ||
|  | 9dac231fe4 | ||
|  | 2bb518a3bd | ||
|  | 476940f747 | ||
|  | 8deab8cdee | ||
|  | a54f9e81c8 | ||
|  | ed4390747f | ||
|  | 242d098d32 | ||
|  | f795164f04 | ||
|  | b6c6d43daa | ||
|  | 82df124c8e | ||
|  | 189587f428 | ||
|  | 45ab581f37 | ||
|  | f48776ea6a | ||
|  | 7fc17cff64 | ||
|  | a5a7075fe5 | ||
|  | 2b4e366083 | ||
|  | bf1eb64b02 | ||
|  | f0fbae94ea | ||
|  | 8fe4df503c | ||
|  | 8da7103070 | ||
|  | f73f6fad8c | ||
|  | 25cb84be12 | ||
|  | d9ae25c1bf | ||
|  | 5c011366c9 | ||
|  | 79e2d4230d | ||
|  | 8ecd029b12 | ||
|  | 3c0508e94a | ||
|  | f535aad612 | ||
|  | d0ac8866f1 | ||
|  | 73f9a65f12 | ||
|  | b2c55c49a8 | ||
|  | 8dc241959c | ||
|  | f99709430a | ||
|  | b9bc45b1b0 | ||
|  | 65d10c1320 | ||
|  | 414ba77f75 | ||
|  | 59f2470650 | ||
|  | 339dfdb624 | ||
|  | 9e2e2e04d1 | ||
|  | 2ab6db0153 | ||
|  | 6cb97bdebe | ||
|  | 8c3694a282 | ||
|  | 191d23a889 | ||
|  | a5963097ac | ||
|  | 221fb37518 | ||
|  | 4ec8a390cc | ||
|  | cf3f1c8b3d | ||
|  | 984f3b8047 | ||
|  | ec1f15d513 | ||
|  | b76cd5ed7e | ||
|  | 1592550d98 | ||
|  | 5cdf42b1a4 | ||
|  | 3a6b1a41fb | ||
|  | 1b5b3bbfdb | ||
|  | 3a67035411 | ||
|  | cb1937a4c5 | ||
|  | 3cfd5d6a02 | ||
|  | 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 | 
							
								
								
									
										63
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,63 +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 | ||||
| @@ -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> | ||||
							
								
								
									
										35
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,35 +0,0 @@ | ||||
| AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6 | ||||
|  | ||||
| ## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac | ||||
| ## remove line below when OE toolchain is updated to version which include those | ||||
| ACLOCAL_AMFLAGS = -I m4 | ||||
| AM_CPPFLAGS = \ | ||||
| 	$(all_includes) \ | ||||
| 	-I$(top_srcdir)/include \ | ||||
| 	$(NULL) | ||||
|  | ||||
| SUBDIRS = \ | ||||
| 	doc \ | ||||
| 	include \ | ||||
| 	src \ | ||||
| 	tests \ | ||||
| 	contrib \ | ||||
| 	$(NULL) | ||||
|  | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = \ | ||||
| 	libosmo-mgcp-client.pc \ | ||||
| 	$(NULL) | ||||
|  | ||||
| BUILT_SOURCES = $(top_srcdir)/.version | ||||
| EXTRA_DIST = git-version-gen osmoappdesc.py .version | ||||
|  | ||||
| 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 | ||||
							
								
								
									
										26
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,26 +0,0 @@ | ||||
| # When cleaning up this file upon a release: | ||||
| # | ||||
| # - Note that the release version number is entirely unrelated to the API | ||||
| #   versions. A release version 5.2.3 may happily have an API version of 42:7:5. | ||||
| # | ||||
| # - Bump API version in src/lib*/Makefile.am files according to chapter | ||||
| #   "Library interface versions" of the libtool documentation. | ||||
| #   https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html | ||||
| # | ||||
| # - Iff the 'current' API version has changed, rename debian/lib*.install | ||||
| # | ||||
| # API version bumping for the impatient: | ||||
| # LIBVERSION=c:r:a  (current:revision_of_current:backwards_compat_age) | ||||
| # 5:2:4 means that | ||||
| # - this implements version 5 of the API; | ||||
| # - this is the 2nd (compatible) revision of API version 5; | ||||
| # - this is backwards compatible to all APIs since 4 versions ago, | ||||
| #   i.e. callers that need API versions from 1 to 5 can use this. | ||||
| # | ||||
| # Bumping API versions recipe: | ||||
| # If the library source code has changed at all since the last update, r++; | ||||
| # If any interfaces have been added, removed, or changed since the last update, c++, r=0; | ||||
| # If any interfaces have been added since the last public release, a++; | ||||
| # If any interfaces have been removed or changed since the last public release, a=0. | ||||
| # | ||||
| #library		what		description / commit summary line | ||||
							
								
								
									
										203
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,203 +0,0 @@ | ||||
| dnl Process this file with autoconf to produce a configure script | ||||
| AC_INIT([osmo-mgw], | ||||
| 	m4_esyscmd([./git-version-gen .tarball-version]), | ||||
| 	[openbsc@lists.osmocom.org]) | ||||
|  | ||||
| dnl *This* is the root dir, even if an install-sh exists in ../ or ../../ | ||||
| AC_CONFIG_AUX_DIR([.]) | ||||
|  | ||||
| AM_INIT_AUTOMAKE([dist-bzip2]) | ||||
| AC_CONFIG_TESTDIR(tests) | ||||
|  | ||||
| dnl kernel style compile messages | ||||
| m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||||
|  | ||||
| dnl include release helper | ||||
| RELMAKE='-include osmo-release.mk' | ||||
| AC_SUBST([RELMAKE]) | ||||
|  | ||||
| dnl checks for programs | ||||
| AC_PROG_MAKE_SET | ||||
| AC_PROG_CC | ||||
| AC_PROG_INSTALL | ||||
| LT_INIT | ||||
|  | ||||
| dnl check for pkg-config (explained in detail in libosmocore/configure.ac) | ||||
| AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no) | ||||
| if test "x$PKG_CONFIG_INSTALLED" = "xno"; then | ||||
|         AC_MSG_WARN([You need to install pkg-config]) | ||||
| fi | ||||
| PKG_PROG_PKG_CONFIG([0.20]) | ||||
|  | ||||
| dnl check for AX_CHECK_COMPILE_FLAG | ||||
| m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [ | ||||
| 	AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.]) | ||||
| 	]) | ||||
|  | ||||
| dnl checks for libraries | ||||
| AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""]) | ||||
| AC_SUBST(LIBRARY_DL) | ||||
|  | ||||
|  | ||||
| PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.0.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.0.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.0.0) | ||||
| PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.6.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 | ||||
|     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,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 | ||||
							
								
								
									
										434
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										434
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							| @@ -1,434 +0,0 @@ | ||||
| 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 | ||||
							
								
								
									
										45
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							| @@ -1,45 +0,0 @@ | ||||
| Source: osmo-mgw | ||||
| Section: net | ||||
| Priority: extra | ||||
| Maintainer: Alexander Couzens <lynxis@fe80.eu> | ||||
| Build-Depends: debhelper (>=9), | ||||
|                dh-autoreconf, | ||||
|                pkg-config, | ||||
|                autotools-dev, | ||||
|                libosmocore-dev, | ||||
|                libosmo-netif-dev, | ||||
|                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 | ||||
							
								
								
									
										4
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +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 | ||||
							
								
								
									
										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,18 +0,0 @@ | ||||
| ! | ||||
| ! MGCP configuration example | ||||
| ! | ||||
| mgcp | ||||
|   bind ip 127.0.0.1 | ||||
|   rtp port-range 4002 16000 | ||||
|   rtp bind-ip 10.9.1.122 | ||||
|   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,18 +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 | ||||
|  | ||||
|   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,33 +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/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> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										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,19 +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/mgcp_internal.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,10 +0,0 @@ | ||||
| noinst_HEADERS = \ | ||||
| 	vty.h \ | ||||
| 	mgcp_msg.h \ | ||||
| 	mgcp_conn.h \ | ||||
| 	mgcp_stat.h \ | ||||
| 	mgcp_endp.h \ | ||||
| 	mgcp_sdp.h \ | ||||
| 	mgcp_codec.h \ | ||||
| 	debug.h \ | ||||
| 	$(NULL) | ||||
| @@ -1,35 +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, | ||||
| 	Debug_LastEntry, | ||||
| }; | ||||
|  | ||||
| extern const struct log_info log_info; | ||||
| @@ -1,303 +0,0 @@ | ||||
| /* A Media Gateway Control Protocol Media Gateway: RFC 3435 */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * (C) 2009-2012 by On-Waves | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/core/msgb.h> | ||||
| #include <osmocom/core/write_queue.h> | ||||
| #include <osmocom/core/timer.h> | ||||
| #include <osmocom/core/logging.h> | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
|  | ||||
| #define RTP_PORT_DEFAULT_RANGE_START 16002 | ||||
| #define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64 | ||||
|  | ||||
| /* | ||||
|  * Handling of MGCP Endpoints and the MGCP Config | ||||
|  */ | ||||
| struct mgcp_endpoint; | ||||
| struct mgcp_config; | ||||
| struct mgcp_trunk_config; | ||||
| struct mgcp_rtp_end; | ||||
|  | ||||
| #define MGCP_ENDP_CRCX 1 | ||||
| #define MGCP_ENDP_DLCX 2 | ||||
| #define MGCP_ENDP_MDCX 3 | ||||
|  | ||||
| /* | ||||
|  * what to do with the msg? | ||||
|  *	- continue as usual? | ||||
|  *	- reject and send a failure code? | ||||
|  *	- defer? do not send anything | ||||
|  */ | ||||
| #define MGCP_POLICY_CONT	4 | ||||
| #define MGCP_POLICY_REJECT	5 | ||||
| #define MGCP_POLICY_DEFER	6 | ||||
|  | ||||
| typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint); | ||||
| typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state); | ||||
| typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id); | ||||
| typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg); | ||||
| typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone); | ||||
|  | ||||
| /** | ||||
|  * Return: | ||||
|  *   <  0 in case no audio was processed | ||||
|  *   >= 0 in case audio was processed. The remaining payload | ||||
|  *   length will be returned. | ||||
|  */ | ||||
| typedef int (*mgcp_processing)(struct mgcp_endpoint *endp, | ||||
| 			       struct mgcp_rtp_end *dst_end, | ||||
| 			       char *data, int *len, int buf_size); | ||||
|  | ||||
| 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; | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| /* 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, | ||||
| }; | ||||
|  | ||||
| /* 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 | ||||
| }; | ||||
|  | ||||
| /* 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, | ||||
| }; | ||||
|  | ||||
| struct mgcp_trunk_config { | ||||
| 	struct llist_head entry; | ||||
|  | ||||
| 	struct mgcp_config *cfg; | ||||
|  | ||||
| 	int trunk_nr; | ||||
| 	int trunk_type; | ||||
|  | ||||
| 	char *audio_fmtp_extra; | ||||
| 	char *audio_name; | ||||
| 	int audio_payload; | ||||
| 	int audio_send_ptime; | ||||
| 	int audio_send_name; | ||||
| 	int audio_loop; | ||||
|  | ||||
| 	int no_audio_transcoding; | ||||
|  | ||||
| 	int omit_rtcp; | ||||
| 	int keepalive_interval; | ||||
|  | ||||
| 	/* RTP patching */ | ||||
| 	int force_constant_ssrc; /* 0: don't, 1: once */ | ||||
| 	int force_aligned_timing; | ||||
| 	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; | ||||
| 	int vty_number_endpoints; | ||||
| 	struct mgcp_endpoint *endpoints; | ||||
|  | ||||
| 	/* 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; | ||||
| }; | ||||
|  | ||||
| enum mgcp_role { | ||||
| 	MGCP_BSC = 0, | ||||
| 	MGCP_BSC_NAT, | ||||
| }; | ||||
|  | ||||
| struct mgcp_config { | ||||
| 	int source_port; | ||||
| 	char *local_ip; | ||||
| 	char *source_addr; | ||||
| 	char *call_agent_addr; | ||||
|  | ||||
| 	/* RTP processing */ | ||||
| 	mgcp_processing rtp_processing_cb; | ||||
| 	mgcp_processing_setup setup_rtp_processing_cb; | ||||
|  | ||||
| 	mgcp_get_format get_net_downlink_format_cb; | ||||
|  | ||||
| 	struct osmo_wqueue gw_fd; | ||||
|  | ||||
| 	struct mgcp_port_range net_ports; | ||||
| 	int endp_dscp; | ||||
|  | ||||
| 	int force_ptime; | ||||
|  | ||||
| 	mgcp_change change_cb; | ||||
| 	mgcp_policy policy_cb; | ||||
| 	mgcp_reset reset_cb; | ||||
| 	mgcp_realloc realloc_cb; | ||||
| 	mgcp_rqnt rqnt_cb; | ||||
| 	void *data; | ||||
|  | ||||
| 	uint32_t last_call_id; | ||||
|  | ||||
| 	/* trunk handling */ | ||||
| 	struct mgcp_trunk_config trunk; | ||||
| 	struct llist_head trunks; | ||||
|  | ||||
| 	enum mgcp_role role; | ||||
|  | ||||
| 	/* osmux translator: 0 means disabled, 1 means enabled */ | ||||
| 	int osmux; | ||||
| 	/* addr to bind the server to */ | ||||
| 	char *osmux_addr; | ||||
| 	/* The BSC-NAT may ask for enabling osmux on demand. This tells us if | ||||
| 	 * the osmux socket is already initialized. | ||||
| 	 */ | ||||
| 	int osmux_init; | ||||
| 	/* osmux batch factor: from 1 to 4 maximum */ | ||||
| 	int osmux_batch; | ||||
| 	/* osmux batch size (in bytes) */ | ||||
| 	int osmux_batch_size; | ||||
| 	/* osmux port */ | ||||
| 	uint16_t osmux_port; | ||||
| 	/* Pad circuit with dummy messages until we see the first voice | ||||
| 	 * message. | ||||
| 	 */ | ||||
| 	uint16_t osmux_dummy; | ||||
| 	/* domain name of the media gateway */ | ||||
| 	char domain[255+1]; | ||||
|  | ||||
| 	/* time after which inactive connections (CIs) get closed */ | ||||
| 	int conn_timeout; | ||||
| }; | ||||
|  | ||||
| /* config management */ | ||||
| struct mgcp_config *mgcp_config_alloc(void); | ||||
| int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg, | ||||
| 		      enum mgcp_role role); | ||||
| int mgcp_vty_init(void); | ||||
| int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg); | ||||
| void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval); | ||||
|  | ||||
| /* | ||||
|  * format helper functions | ||||
|  */ | ||||
| struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg); | ||||
|  | ||||
|  | ||||
| int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint); | ||||
| int mgcp_send_reset_all(struct mgcp_config *cfg); | ||||
|  | ||||
|  | ||||
| int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port); | ||||
| int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len); | ||||
| @@ -1,7 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| 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); | ||||
| @@ -1,107 +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/" | ||||
|  | ||||
| /* Maximal number of payload types / codecs that can be negotiated via SDP at | ||||
|  * at once. */ | ||||
| #define MGCP_MAX_CODECS 10 | ||||
|  | ||||
| #endif | ||||
| @@ -1,80 +0,0 @@ | ||||
| /* Message connection list handling */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Philipp Maier | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_internal.h> | ||||
| #include <osmocom/core/linuxlist.h> | ||||
| #include <osmocom/core/rate_ctr.h> | ||||
| #include <inttypes.h> | ||||
|  | ||||
| /* 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."} | ||||
| }; | ||||
|  | ||||
| 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); | ||||
| @@ -1,101 +0,0 @@ | ||||
| /* Endpoint types */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Philipp Maier | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| struct sockaddr_in; | ||||
| struct mgcp_conn; | ||||
| struct mgcp_endpoint; | ||||
|  | ||||
| /* Callback type for RTP dispatcher functions | ||||
|    (e.g mgcp_dispatch_rtp_bridge_cb, see below) */ | ||||
| typedef int (*mgcp_dispatch_rtp_cb) (int proto, struct sockaddr_in *addr, | ||||
| 				     char *buf, unsigned int buf_size, | ||||
| 				     struct mgcp_conn *conn); | ||||
|  | ||||
| /* 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; | ||||
| }; | ||||
|  | ||||
| /*! static MGCP endpoint typeset (pre-initalized, read-only) */ | ||||
| extern const struct mgcp_endpoint_typeset ep_typeset; | ||||
|  | ||||
| /*! MGCP endpoint model */ | ||||
| struct mgcp_endpoint { | ||||
|  | ||||
| 	/*! 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 specific configuration */ | ||||
| 	struct mgcp_trunk_config *tcfg; | ||||
|  | ||||
| 	/*! 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; | ||||
| }; | ||||
|  | ||||
| /*! Extract endpoint number for a given endpoint */ | ||||
| #define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints)) | ||||
|  | ||||
| void mgcp_endp_release(struct mgcp_endpoint *endp); | ||||
| @@ -1,352 +0,0 @@ | ||||
| /* MGCP Private Data */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * (C) 2009-2012 by On-Waves | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <string.h> | ||||
| #include <inttypes.h> | ||||
| #include <osmocom/core/select.h> | ||||
| #include <osmocom/mgcp/mgcp.h> | ||||
| #include <osmocom/core/linuxlist.h> | ||||
| #include <osmocom/core/counter.h> | ||||
| #include <osmocom/core/rate_ctr.h> | ||||
|  | ||||
| #define CI_UNUSED 0 | ||||
|  | ||||
| /* FIXME: This this is only needed to compile the currently | ||||
|  * broken OSMUX support. Remove when fixed */ | ||||
| #define CONN_ID_BTS "0" | ||||
| #define CONN_ID_NET "1" | ||||
|  | ||||
| enum mgcp_trunk_type { | ||||
| 	MGCP_TRUNK_VIRTUAL, | ||||
| 	MGCP_TRUNK_E1, | ||||
| }; | ||||
|  | ||||
| struct mgcp_rtp_stream_state { | ||||
| 	uint32_t ssrc; | ||||
| 	uint16_t last_seq; | ||||
| 	uint32_t last_timestamp; | ||||
| 	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; | ||||
|  | ||||
| 	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; | ||||
|  | ||||
| 	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 { | ||||
| 	/* local IP address of the RTP socket */ | ||||
| 	struct in_addr 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; | ||||
| }; | ||||
|  | ||||
| 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 sockaddr_in forward; | ||||
| }; | ||||
|  | ||||
| struct mgcp_lco { | ||||
| 	char *string; | ||||
| 	char *codec; | ||||
| 	int pkt_period_min; /* time in ms */ | ||||
| 	int pkt_period_max; /* time in ms */ | ||||
| }; | ||||
|  | ||||
| /* Specific rtp connection type (see struct mgcp_conn_rtp) */ | ||||
| enum mgcp_conn_rtp_type { | ||||
| 	MGCP_RTP_DEFAULT	= 0, | ||||
| 	MGCP_OSMUX_BSC, | ||||
| 	MGCP_OSMUX_BSC_NAT, | ||||
| }; | ||||
|  | ||||
| #include <osmocom/mgcp/osmux.h> | ||||
| struct mgcp_conn; | ||||
|  | ||||
| /* MGCP connection (RTP) */ | ||||
| struct mgcp_conn_rtp { | ||||
|  | ||||
| 	/* Backpointer to conn struct */ | ||||
| 	struct mgcp_conn *conn; | ||||
|  | ||||
| 	/* Specific connection type */ | ||||
| 	enum mgcp_conn_rtp_type type; | ||||
|  | ||||
| 	/* Port status */ | ||||
| 	struct mgcp_rtp_end end; | ||||
|  | ||||
| 	/* Sequence bits */ | ||||
| 	struct mgcp_rtp_state state; | ||||
|  | ||||
| 	/* taps for the rtp connection; 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; | ||||
| }; | ||||
|  | ||||
| /*! Connection type, specifies which member of the union "u" in mgcp_conn | ||||
|  *  contains a useful connection description (currently only RTP) */ | ||||
| enum mgcp_conn_type { | ||||
| 	MGCP_CONN_TYPE_RTP, | ||||
| }; | ||||
|  | ||||
| /*! MGCP connection (untyped) */ | ||||
| struct mgcp_conn { | ||||
| 	/*! list head */ | ||||
| 	struct llist_head entry; | ||||
|  | ||||
| 	/*! Backpointer to the endpoint where the conn belongs to */ | ||||
| 	struct mgcp_endpoint *endp; | ||||
|  | ||||
| 	/*! type of the connection (union) */ | ||||
| 	enum mgcp_conn_type type; | ||||
|  | ||||
| 	/*! mode of the connection */ | ||||
| 	enum mgcp_connection_mode mode; | ||||
|  | ||||
| 	/*! copy of the mode to restore the original setting (VTY) */ | ||||
| 	enum mgcp_connection_mode mode_orig; | ||||
|  | ||||
| 	/*! connection id to identify the 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; | ||||
| }; | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_conn.h> | ||||
|  | ||||
| struct mgcp_endpoint_type; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Internal structure while parsing a request | ||||
|  */ | ||||
| struct mgcp_parse_data { | ||||
| 	struct mgcp_config *cfg; | ||||
| 	struct mgcp_endpoint *endp; | ||||
| 	char *trans; | ||||
| 	char *save; | ||||
| }; | ||||
|  | ||||
| int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct sockaddr_in *addr, | ||||
| 	      char *buf, int rc, struct mgcp_conn_rtp *conn_src, | ||||
| 	      struct mgcp_conn_rtp *conn_dst); | ||||
| int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn); | ||||
| int mgcp_dispatch_rtp_bridge_cb(int proto, struct sockaddr_in *addr, char *buf, | ||||
| 				unsigned int buf_size, struct mgcp_conn *conn); | ||||
| void mgcp_cleanup_rtp_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); | ||||
|  | ||||
| /* For transcoding we need to manage an in and an output that are connected */ | ||||
| static inline int endp_back_channel(int endpoint) | ||||
| { | ||||
| 	return endpoint + 60; | ||||
| } | ||||
|  | ||||
| struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index); | ||||
| struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index); | ||||
|  | ||||
| char *get_lco_identifier(const char *options); | ||||
| int check_local_cx_options(void *ctx, const char *options); | ||||
| void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change, | ||||
| 			 struct mgcp_rtp_end *rtp); | ||||
| uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp, | ||||
| 				  struct mgcp_rtp_end *rtp); | ||||
|  | ||||
| /* payload processing default functions */ | ||||
| int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end, | ||||
| 				char *data, int *len, int buf_size); | ||||
|  | ||||
| int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp, | ||||
| 				      struct mgcp_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); | ||||
|  | ||||
| int mgcp_set_ip_tos(int fd, int tos); | ||||
|  | ||||
| /* 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; | ||||
| } | ||||
|  | ||||
| enum { | ||||
| 	MGCP_DEST_NET = 0, | ||||
| 	MGCP_DEST_BTS, | ||||
| }; | ||||
|  | ||||
|  | ||||
| #define MGCP_DUMMY_LOAD 0x23 | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * SDP related information | ||||
|  */ | ||||
| /* Assume audio frame length of 20ms */ | ||||
| #define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20 | ||||
| #define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000 | ||||
| #define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20 | ||||
| #define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000 | ||||
| #define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1 | ||||
|  | ||||
| #define PTYPE_UNDEFINED (-1) | ||||
|  | ||||
| void mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn); | ||||
| void mgcp_conn_watchdog_kick(struct mgcp_conn *conn); | ||||
|  | ||||
| #define LOGPENDP(endp, cat, level, fmt, args...) \ | ||||
| LOGP(cat, level, "endpoint:0x%x " fmt, \ | ||||
|      endp ? ENDPOINT_NUMBER(endp) : -1, \ | ||||
|      ## args) | ||||
|  | ||||
| #define LOGPCONN(conn, cat, level, fmt, args...) \ | ||||
| LOGPENDP((conn)->endp, cat, level, "CI:%s " fmt, \ | ||||
|          (conn)->id, \ | ||||
|          ## args) | ||||
| @@ -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,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,36 +0,0 @@ | ||||
| /* A Media Gateway Control Protocol Media Gateway: RFC 3435 */ | ||||
| /* The statistics generator */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * (C) 2009-2012 by On-Waves | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_internal.h> | ||||
| #include <inttypes.h> | ||||
|  | ||||
| void mgcp_format_stats(char *str, size_t str_len,  struct mgcp_conn *conn); | ||||
|  | ||||
| /* Exposed for test purposes only, do not use actively */ | ||||
| void calc_loss(struct mgcp_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,39 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
|  | ||||
| #include <osmocom/netif/osmux.h> | ||||
| struct mgcp_conn_rtp; | ||||
|  | ||||
| #define OSMUX_PORT	1984 | ||||
|  | ||||
| enum { | ||||
| 	OSMUX_ROLE_BSC = 0, | ||||
| 	OSMUX_ROLE_BSC_NAT, | ||||
| }; | ||||
|  | ||||
| int osmux_init(int role, struct mgcp_config *cfg); | ||||
| int osmux_enable_conn(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn, | ||||
| 		      struct in_addr *addr, uint16_t port); | ||||
| void 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,8 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/vty/command.h> | ||||
|  | ||||
| enum mgcp_vty_node { | ||||
| 	MGCP_NODE = _LAST_OSMOVTY_NODE + 1, | ||||
| 	TRUNK_NODE, | ||||
| }; | ||||
| @@ -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,165 +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 "0.0.0.0" | ||||
| #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[INET_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); | ||||
|  | ||||
| const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp); | ||||
| const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp); | ||||
|  | ||||
| /* 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[INET_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,35 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/core/write_queue.h> | ||||
|  | ||||
| #define MSGB_CB_MGCP_TRANS_ID 0 | ||||
|  | ||||
| struct mgcp_client { | ||||
| 	struct mgcp_client_conf actual; | ||||
| 	uint32_t remote_addr; | ||||
| 	struct osmo_wqueue wq; | ||||
| 	mgcp_trans_id_t next_trans_id; | ||||
| 	struct llist_head responses_pending; | ||||
| 	struct llist_head inuse_endpoints; | ||||
| }; | ||||
|  | ||||
| struct mgcp_inuse_endpoint { | ||||
| 	struct llist_head entry; | ||||
| 	uint16_t id; | ||||
| }; | ||||
|  | ||||
| struct mgcp_response_pending { | ||||
| 	struct llist_head entry; | ||||
|  | ||||
| 	mgcp_trans_id_t trans_id; | ||||
| 	mgcp_response_cb_t response_cb; | ||||
| 	void *priv; | ||||
| }; | ||||
|  | ||||
| int mgcp_client_rx(struct mgcp_client *mgcp, struct msgb *msg); | ||||
|  | ||||
| struct mgcp_response_pending * mgcp_client_pending_add( | ||||
| 					struct mgcp_client *mgcp, | ||||
| 					mgcp_trans_id_t trans_id, | ||||
| 					mgcp_response_cb_t response_cb, | ||||
| 					void *priv); | ||||
							
								
								
									
										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 */ | ||||
							
								
								
									
										192
									
								
								libosmocore/include/osmocore/talloc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								libosmocore/include/osmocore/talloc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | ||||
| #ifndef _TALLOC_H_ | ||||
| #define _TALLOC_H_ | ||||
| /*  | ||||
|    Unix SMB/CIFS implementation. | ||||
|    Samba temporary memory allocation functions | ||||
|  | ||||
|    Copyright (C) Andrew Tridgell 2004-2005 | ||||
|    Copyright (C) Stefan Metzmacher 2006 | ||||
|     | ||||
|      ** NOTE! The following LGPL license applies to the talloc | ||||
|      ** library. This does NOT imply that all of Samba is released | ||||
|      ** under the LGPL | ||||
|     | ||||
|    This library is free software; you can redistribute it and/or | ||||
|    modify it under the terms of the GNU Lesser General Public | ||||
|    License as published by the Free Software Foundation; either | ||||
|    version 3 of the License, or (at your option) any later version. | ||||
|  | ||||
|    This library is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|    Lesser General Public License for more details. | ||||
|  | ||||
|    You should have received a copy of the GNU Lesser General Public | ||||
|    License along with this library; if not, see <http://www.gnu.org/licenses/>. | ||||
| */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| #define HAVE_VA_COPY | ||||
|  | ||||
| /* this is only needed for compatibility with the old talloc */ | ||||
| typedef void TALLOC_CTX; | ||||
|  | ||||
| /* | ||||
|   this uses a little trick to allow __LINE__ to be stringified | ||||
| */ | ||||
| #ifndef __location__ | ||||
| #define __TALLOC_STRING_LINE1__(s)    #s | ||||
| #define __TALLOC_STRING_LINE2__(s)   __TALLOC_STRING_LINE1__(s) | ||||
| #define __TALLOC_STRING_LINE3__  __TALLOC_STRING_LINE2__(__LINE__) | ||||
| #define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ | ||||
| #endif | ||||
|  | ||||
| #ifndef TALLOC_DEPRECATED | ||||
| #define TALLOC_DEPRECATED 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef PRINTF_ATTRIBUTE | ||||
| #if (__GNUC__ >= 3) | ||||
| /** Use gcc attribute to check printf fns.  a1 is the 1-based index of | ||||
|  * the parameter containing the format, and a2 the index of the first | ||||
|  * argument. Note that some gcc 2.x versions don't handle this | ||||
|  * properly **/ | ||||
| #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) | ||||
| #else | ||||
| #define PRINTF_ATTRIBUTE(a1, a2) | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| /* try to make talloc_set_destructor() and talloc_steal() type safe, | ||||
|    if we have a recent gcc */ | ||||
| #if (__GNUC__ >= 3) | ||||
| #define _TALLOC_TYPEOF(ptr) __typeof__(ptr) | ||||
| #define talloc_set_destructor(ptr, function)				      \ | ||||
| 	do {								      \ | ||||
| 		int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function);	      \ | ||||
| 		_talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructor_fn); \ | ||||
| 	} while(0) | ||||
| /* this extremely strange macro is to avoid some braindamaged warning | ||||
|    stupidity in gcc 4.1.x */ | ||||
| #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) | ||||
| #else | ||||
| #define talloc_set_destructor(ptr, function) \ | ||||
| 	_talloc_set_destructor((ptr), (int (*)(void *))(function)) | ||||
| #define _TALLOC_TYPEOF(ptr) void * | ||||
| #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) | ||||
| #endif | ||||
|  | ||||
| #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) | ||||
| #define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr)) | ||||
|  | ||||
| /* useful macros for creating type checked pointers */ | ||||
| #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) | ||||
| #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) | ||||
| #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) | ||||
|  | ||||
| #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) | ||||
|  | ||||
| #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) | ||||
| #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) | ||||
|  | ||||
| #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) | ||||
| #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) | ||||
| #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) | ||||
| #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) | ||||
| #define talloc_array_length(ctx) (talloc_get_size(ctx)/sizeof(*ctx)) | ||||
|  | ||||
| #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) | ||||
| #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) | ||||
|  | ||||
| #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) | ||||
|  | ||||
| #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) | ||||
| #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) | ||||
| #define talloc_get_type_abort(ptr, type) (type *)_talloc_get_type_abort(ptr, #type, __location__) | ||||
|  | ||||
| #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) | ||||
|  | ||||
| #if TALLOC_DEPRECATED | ||||
| #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) | ||||
| #define talloc_p(ctx, type) talloc(ctx, type) | ||||
| #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) | ||||
| #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) | ||||
| #define talloc_destroy(ctx) talloc_free(ctx) | ||||
| #define talloc_append_string(c, s, a) (s?talloc_strdup_append(s,a):talloc_strdup(c, a)) | ||||
| #endif | ||||
|  | ||||
| #define TALLOC_FREE(ctx) do { talloc_free(ctx); ctx=NULL; } while(0) | ||||
|  | ||||
| /* The following definitions come from talloc.c  */ | ||||
| void *_talloc(const void *context, size_t size); | ||||
| void *talloc_pool(const void *context, size_t size); | ||||
| void _talloc_set_destructor(const void *ptr, int (*_destructor)(void *)); | ||||
| int talloc_increase_ref_count(const void *ptr); | ||||
| size_t talloc_reference_count(const void *ptr); | ||||
| void *_talloc_reference(const void *context, const void *ptr); | ||||
| int talloc_unlink(const void *context, void *ptr); | ||||
| const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); | ||||
| void talloc_set_name_const(const void *ptr, const char *name); | ||||
| void *talloc_named(const void *context, size_t size,  | ||||
| 		   const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); | ||||
| void *talloc_named_const(const void *context, size_t size, const char *name); | ||||
| const char *talloc_get_name(const void *ptr); | ||||
| void *talloc_check_name(const void *ptr, const char *name); | ||||
| void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location); | ||||
| void *talloc_parent(const void *ptr); | ||||
| const char *talloc_parent_name(const void *ptr); | ||||
| void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); | ||||
| int talloc_free(void *ptr); | ||||
| void talloc_free_children(void *ptr); | ||||
| void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); | ||||
| void *_talloc_steal(const void *new_ctx, const void *ptr); | ||||
| void *_talloc_move(const void *new_ctx, const void *pptr); | ||||
| size_t talloc_total_size(const void *ptr); | ||||
| size_t talloc_total_blocks(const void *ptr); | ||||
| void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, | ||||
| 			    void (*callback)(const void *ptr, | ||||
| 			  		     int depth, int max_depth, | ||||
| 					     int is_ref, | ||||
| 					     void *private_data), | ||||
| 			    void *private_data); | ||||
| void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f); | ||||
| void talloc_report_full(const void *ptr, FILE *f); | ||||
| void talloc_report(const void *ptr, FILE *f); | ||||
| void talloc_enable_null_tracking(void); | ||||
| void talloc_disable_null_tracking(void); | ||||
| void talloc_enable_leak_report(void); | ||||
| void talloc_enable_leak_report_full(void); | ||||
| void *_talloc_zero(const void *ctx, size_t size, const char *name); | ||||
| void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); | ||||
| void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); | ||||
| void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); | ||||
| void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); | ||||
| void *talloc_realloc_fn(const void *context, void *ptr, size_t size); | ||||
| void *talloc_autofree_context(void); | ||||
| size_t talloc_get_size(const void *ctx); | ||||
| void *talloc_find_parent_byname(const void *ctx, const char *name); | ||||
| void talloc_show_parents(const void *context, FILE *file); | ||||
| int talloc_is_parent(const void *context, const void *ptr); | ||||
|  | ||||
| char *talloc_strdup(const void *t, const char *p); | ||||
| char *talloc_strdup_append(char *s, const char *a); | ||||
| char *talloc_strdup_append_buffer(char *s, const char *a); | ||||
|  | ||||
| char *talloc_strndup(const void *t, const char *p, size_t n); | ||||
| char *talloc_strndup_append(char *s, const char *a, size_t n); | ||||
| char *talloc_strndup_append_buffer(char *s, const char *a, size_t n); | ||||
|  | ||||
| char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); | ||||
| char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); | ||||
| char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); | ||||
|  | ||||
| char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); | ||||
| char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); | ||||
| char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); | ||||
|  | ||||
| void talloc_set_abort_fn(void (*abort_fn)(const char *reason)); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										72
									
								
								libosmocore/include/osmocore/timer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								libosmocore/include/osmocore/timer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| /* | ||||
|  * (C) 2008, 2009 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef TIMER_H | ||||
| #define TIMER_H | ||||
|  | ||||
| #include <sys/time.h> | ||||
|  | ||||
| #include "linuxlist.h" | ||||
|  | ||||
| /** | ||||
|  * Timer management: | ||||
|  *      - Create a struct timer_list | ||||
|  *      - Fill out timeout and use add_timer or | ||||
|  *        use schedule_timer to schedule a timer in | ||||
|  *        x seconds and microseconds from now... | ||||
|  *      - Use del_timer to remove the timer | ||||
|  * | ||||
|  *  Internally: | ||||
|  *      - We hook into select.c to give a timeval of the | ||||
|  *        nearest timer. On already passed timers we give | ||||
|  *        it a 0 to immediately fire after the select | ||||
|  *      - update_timers will call the callbacks and remove | ||||
|  *        the timers. | ||||
|  * | ||||
|  */ | ||||
| struct timer_list { | ||||
| 	struct llist_head entry; | ||||
| 	struct timeval timeout; | ||||
| 	unsigned int active  : 1; | ||||
| 	unsigned int handled : 1; | ||||
| 	unsigned int in_list : 1; | ||||
|  | ||||
| 	void (*cb)(void*); | ||||
| 	void *data; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * timer management | ||||
|  */ | ||||
| void bsc_add_timer(struct timer_list *timer); | ||||
| void bsc_schedule_timer(struct timer_list *timer, int seconds, int microseconds); | ||||
| void bsc_del_timer(struct timer_list *timer); | ||||
| int bsc_timer_pending(struct timer_list *timer); | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * internal timer list management | ||||
|  */ | ||||
| struct timeval *bsc_nearest_timer(); | ||||
| void bsc_prepare_timers(); | ||||
| int bsc_update_timers(); | ||||
| int bsc_timer_check(void); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										244
									
								
								libosmocore/include/osmocore/tlv.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								libosmocore/include/osmocore/tlv.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | ||||
| #ifndef _TLV_H | ||||
| #define _TLV_H | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <osmocore/msgb.h> | ||||
|  | ||||
| /* Terminology / wording | ||||
| 		tag	length		value	(in bits) | ||||
|  | ||||
| 	    V	-	-		8 | ||||
| 	   LV	-	8		N * 8 | ||||
| 	  TLV	8	8		N * 8 | ||||
| 	TL16V	8	16		N * 8 | ||||
| 	TLV16	8	8		N * 16 | ||||
| 	 TvLV	8	8/16		N * 8 | ||||
|  | ||||
| */ | ||||
|  | ||||
| #define LV_GROSS_LEN(x)		(x+1) | ||||
| #define TLV_GROSS_LEN(x)	(x+2) | ||||
| #define TLV16_GROSS_LEN(x)	((2*x)+2) | ||||
| #define TL16V_GROSS_LEN(x)	(x+3) | ||||
| #define L16TV_GROSS_LEN(x)	(x+3) | ||||
|  | ||||
| #define TVLV_MAX_ONEBYTE	0x7f | ||||
|  | ||||
| static inline uint16_t TVLV_GROSS_LEN(uint16_t len) | ||||
| { | ||||
| 	if (len <= TVLV_MAX_ONEBYTE) | ||||
| 		return TLV_GROSS_LEN(len); | ||||
| 	else | ||||
| 		return TL16V_GROSS_LEN(len); | ||||
| } | ||||
|  | ||||
| /* TLV generation */ | ||||
|  | ||||
| static inline uint8_t *lv_put(uint8_t *buf, uint8_t len, | ||||
| 				const uint8_t *val) | ||||
| { | ||||
| 	*buf++ = len; | ||||
| 	memcpy(buf, val, len); | ||||
| 	return buf + len; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *tlv_put(uint8_t *buf, uint8_t tag, uint8_t len, | ||||
| 				const uint8_t *val) | ||||
| { | ||||
| 	*buf++ = tag; | ||||
| 	*buf++ = len; | ||||
| 	memcpy(buf, val, len); | ||||
| 	return buf + len; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *tlv16_put(uint8_t *buf, uint8_t tag, uint8_t len, | ||||
| 				const uint16_t *val) | ||||
| { | ||||
| 	*buf++ = tag; | ||||
| 	*buf++ = len; | ||||
| 	memcpy(buf, val, len*2); | ||||
| 	return buf + len*2; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *tl16v_put(uint8_t *buf, uint8_t tag, uint16_t len, | ||||
| 				const uint8_t *val) | ||||
| { | ||||
| 	*buf++ = tag; | ||||
| 	*buf++ = len >> 8; | ||||
| 	*buf++ = len & 0xff; | ||||
| 	memcpy(buf, val, len); | ||||
| 	return buf + len*2; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *tvlv_put(uint8_t *buf, uint8_t tag, uint16_t len, | ||||
| 				 const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *ret; | ||||
|  | ||||
| 	if (len <= TVLV_MAX_ONEBYTE) { | ||||
| 		ret = tlv_put(buf, tag, len, val); | ||||
| 		buf[1] |= 0x80; | ||||
| 	} else | ||||
| 		ret = tl16v_put(buf, tag, len, val); | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tlv16_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint16_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, TLV16_GROSS_LEN(len)); | ||||
| 	return tlv16_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tl16v_put(struct msgb *msg, uint8_t tag, uint16_t len, | ||||
| 					const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, TL16V_GROSS_LEN(len)); | ||||
| 	return tl16v_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tvlv_put(struct msgb *msg, uint8_t tag, uint16_t len, | ||||
| 				      const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, TVLV_GROSS_LEN(len)); | ||||
| 	return tvlv_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_l16tv_put(struct msgb *msg, uint16_t len, uint8_t tag, | ||||
|                                        const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, L16TV_GROSS_LEN(len)); | ||||
|  | ||||
| 	*buf++ = len >> 8; | ||||
| 	*buf++ = len & 0xff; | ||||
| 	*buf++ = tag; | ||||
| 	memcpy(buf, val, len); | ||||
| 	return buf + len; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *v_put(uint8_t *buf, uint8_t val) | ||||
| { | ||||
| 	*buf++ = val; | ||||
| 	return buf; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *tv_put(uint8_t *buf, uint8_t tag,  | ||||
| 				uint8_t val) | ||||
| { | ||||
| 	*buf++ = tag; | ||||
| 	*buf++ = val; | ||||
| 	return buf; | ||||
| } | ||||
|  | ||||
| /* 'val' is still in host byte order! */ | ||||
| static inline uint8_t *tv16_put(uint8_t *buf, uint8_t tag,  | ||||
| 				 uint16_t val) | ||||
| { | ||||
| 	*buf++ = tag; | ||||
| 	*buf++ = val >> 8; | ||||
| 	*buf++ = val & 0xff; | ||||
| 	return buf; | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_lv_put(struct msgb *msg, uint8_t len, const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, LV_GROSS_LEN(len)); | ||||
| 	return lv_put(buf, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tlv_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(len)); | ||||
| 	return tlv_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tv_put(struct msgb *msg, uint8_t tag, uint8_t val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, 2); | ||||
| 	return tv_put(buf, tag, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_v_put(struct msgb *msg, uint8_t val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, 1); | ||||
| 	return v_put(buf, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tv16_put(struct msgb *msg, uint8_t tag, uint16_t val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_put(msg, 3); | ||||
| 	return tv16_put(buf, tag, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tlv_push(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_push(msg, TLV_GROSS_LEN(len)); | ||||
| 	return tlv_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tv_push(struct msgb *msg, uint8_t tag, uint8_t val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_push(msg, 2); | ||||
| 	return tv_put(buf, tag, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tv16_push(struct msgb *msg, uint8_t tag, uint16_t val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_push(msg, 3); | ||||
| 	return tv16_put(buf, tag, val); | ||||
| } | ||||
|  | ||||
| static inline uint8_t *msgb_tvlv_push(struct msgb *msg, uint8_t tag, uint16_t len, | ||||
| 				      const uint8_t *val) | ||||
| { | ||||
| 	uint8_t *buf = msgb_push(msg, TVLV_GROSS_LEN(len)); | ||||
| 	return tvlv_put(buf, tag, len, val); | ||||
| } | ||||
|  | ||||
| /* TLV parsing */ | ||||
|  | ||||
| struct tlv_p_entry { | ||||
| 	uint16_t len; | ||||
| 	const uint8_t *val; | ||||
| }; | ||||
|  | ||||
| enum tlv_type { | ||||
| 	TLV_TYPE_NONE, | ||||
| 	TLV_TYPE_FIXED, | ||||
| 	TLV_TYPE_T, | ||||
| 	TLV_TYPE_TV, | ||||
| 	TLV_TYPE_TLV, | ||||
| 	TLV_TYPE_TL16V, | ||||
| 	TLV_TYPE_TvLV, | ||||
| }; | ||||
|  | ||||
| struct tlv_def { | ||||
| 	enum tlv_type type; | ||||
| 	uint8_t fixed_len; | ||||
| }; | ||||
|  | ||||
| struct tlv_definition { | ||||
| 	struct tlv_def def[0xff]; | ||||
| }; | ||||
|  | ||||
| struct tlv_parsed { | ||||
| 	struct tlv_p_entry lv[0xff]; | ||||
| }; | ||||
|  | ||||
| extern struct tlv_definition tvlv_att_def; | ||||
|  | ||||
| int tlv_parse_one(uint8_t *o_tag, uint16_t *o_len, const uint8_t **o_val, | ||||
|                   const struct tlv_definition *def, | ||||
|                   const uint8_t *buf, int buf_len); | ||||
| int tlv_parse(struct tlv_parsed *dec, const struct tlv_definition *def, | ||||
| 	      const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2); | ||||
| /* take a master (src) tlvdev and fill up all empty slots in 'dst' */ | ||||
| void tlv_def_patch(struct tlv_definition *dst, const struct tlv_definition *src); | ||||
|  | ||||
| #define TLVP_PRESENT(x, y)	((x)->lv[y].val) | ||||
| #define TLVP_LEN(x, y)		(x)->lv[y].len | ||||
| #define TLVP_VAL(x, y)		(x)->lv[y].val | ||||
|  | ||||
| #endif /* _TLV_H */ | ||||
							
								
								
									
										20
									
								
								libosmocore/include/osmocore/utils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								libosmocore/include/osmocore/utils.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #ifndef OSMOCORE_UTIL_H | ||||
| #define OSMOCORE_UTIL_H | ||||
|  | ||||
| #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| struct value_string { | ||||
| 	unsigned int value; | ||||
| 	const char *str; | ||||
| }; | ||||
|  | ||||
| const char *get_value_string(const struct value_string *vs, uint32_t val); | ||||
| int get_string_value(const struct value_string *vs, const char *str); | ||||
|  | ||||
| char bcd2char(uint8_t bcd); | ||||
| /* only works for numbers in ascci */ | ||||
| uint8_t char2bcd(char c); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										45
									
								
								libosmocore/include/osmocore/write_queue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libosmocore/include/osmocore/write_queue.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* Generic write queue implementation */ | ||||
| /* | ||||
|  * (C) 2010 by Holger Hans Peter Freyther | ||||
|  * (C) 2010 by On-Waves | ||||
|  * | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU 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 write_queue_h | ||||
| #define write_queue_h | ||||
|  | ||||
| #include "select.h" | ||||
| #include "msgb.h" | ||||
|  | ||||
| struct write_queue { | ||||
| 	struct bsc_fd bfd; | ||||
| 	unsigned int max_length; | ||||
| 	unsigned int current_length; | ||||
|  | ||||
| 	struct llist_head msg_queue; | ||||
|  | ||||
| 	int (*read_cb)(struct bsc_fd *fd); | ||||
| 	int (*write_cb)(struct bsc_fd *fd, struct msgb *msg); | ||||
| }; | ||||
|  | ||||
| void write_queue_init(struct write_queue *queue, int max_length); | ||||
| void write_queue_clear(struct write_queue *queue); | ||||
| int write_queue_enqueue(struct write_queue *queue, struct msgb *data); | ||||
| int write_queue_bfd_cb(struct bsc_fd *fd, unsigned int what); | ||||
|  | ||||
| #endif | ||||
| @@ -3,8 +3,9 @@ exec_prefix=@exec_prefix@ | ||||
| libdir=@libdir@ | ||||
| includedir=@includedir@ | ||||
| 
 | ||||
| Name: Osmocom Media Gateway Control Protocol Client library | ||||
| Name: Osmocom Core Library | ||||
| Description: C Utility Library | ||||
| Version: @VERSION@ | ||||
| Libs: -L${libdir} -losmo-mgcp-client | ||||
| Libs: -L${libdir} -losmocore | ||||
| Cflags: -I${includedir}/ | ||||
| 
 | ||||
							
								
								
									
										1
									
								
								libosmocore/m4/DUMMY
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libosmocore/m4/DUMMY
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| Dummply placeholder. | ||||
							
								
								
									
										17
									
								
								libosmocore/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								libosmocore/src/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| # This is _NOT_ the library release version, it's an API version. | ||||
| # Please read Chapter 6 "Library interface versions" of the libtool documentation before making any modification | ||||
| LIBVERSION=0:0:0 | ||||
|  | ||||
| INCLUDES = $(all_includes) -I$(top_srcdir)/include | ||||
| AM_CFLAGS = -fPIC -Wall | ||||
|  | ||||
| lib_LTLIBRARIES = libosmocore.la | ||||
|  | ||||
| libosmocore_la_SOURCES = timer.c select.c signal.c msgb.c rxlev_stat.c \ | ||||
| 			 tlv_parser.c bitvec.c comp128.c gsm_utils.c statistics.c \ | ||||
| 			 write_queue.c utils.c rsl.c gsm48.c gsm48_ie.c \ | ||||
| 			 logging.c | ||||
|  | ||||
| if ENABLE_TALLOC | ||||
| libosmocore_la_SOURCES += talloc.c | ||||
| endif | ||||
							
								
								
									
										170
									
								
								libosmocore/src/bitvec.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								libosmocore/src/bitvec.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| /* 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. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include <osmocore/bitvec.h> | ||||
|  | ||||
| #define BITNUM_FROM_COMP(byte, bit)	((byte*8)+bit) | ||||
|  | ||||
| static inline unsigned int bytenum_from_bitnum(unsigned int bitnum) | ||||
| { | ||||
| 	unsigned int bytenum = bitnum / 8; | ||||
|  | ||||
| 	return bytenum; | ||||
| } | ||||
|  | ||||
| /* convert ZERO/ONE/L/H to a bitmask at given pos in a byte */ | ||||
| static uint8_t bitval2mask(enum bit_value bit, uint8_t bitnum) | ||||
| { | ||||
| 	int bitval; | ||||
|  | ||||
| 	switch (bit) { | ||||
| 	case ZERO: | ||||
| 		bitval = (0 << bitnum); | ||||
| 		break; | ||||
| 	case ONE: | ||||
| 		bitval = (1 << bitnum); | ||||
| 		break; | ||||
| 	case L: | ||||
| 		bitval = ((0x2b ^ (0 << bitnum)) & (1 << bitnum)); | ||||
| 		break; | ||||
| 	case H: | ||||
| 		bitval = ((0x2b ^ (1 << bitnum)) & (1 << bitnum)); | ||||
| 		break; | ||||
| 	default: | ||||
| 		return 0; | ||||
| 	} | ||||
| 	return bitval; | ||||
| } | ||||
|  | ||||
| /* 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) | ||||
| { | ||||
| 	unsigned int bytenum = bytenum_from_bitnum(bitnr); | ||||
| 	unsigned int bitnum = 7 - (bitnr % 8); | ||||
| 	uint8_t bitval; | ||||
|  | ||||
| 	if (bytenum >= bv->data_len) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	bitval = bitval2mask(ONE, bitnum); | ||||
|  | ||||
| 	if (bv->data[bytenum] & bitval) | ||||
| 		return ONE; | ||||
|  | ||||
| 	return ZERO; | ||||
| } | ||||
|  | ||||
| /* get the Nth set bit inside the bit vector */ | ||||
| unsigned int bitvec_get_nth_set_bit(const struct bitvec *bv, unsigned int n) | ||||
| { | ||||
| 	unsigned int i, k = 0; | ||||
|  | ||||
| 	for (i = 0; i < bv->data_len*8; i++) { | ||||
| 		if (bitvec_get_bit_pos(bv, i) == ONE) { | ||||
| 			k++; | ||||
| 			if (k == n) | ||||
| 				return i; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* set the bit at a given position inside a bitvec */ | ||||
| int bitvec_set_bit_pos(struct bitvec *bv, unsigned int bitnr, | ||||
| 			enum bit_value bit) | ||||
| { | ||||
| 	unsigned int bytenum = bytenum_from_bitnum(bitnr); | ||||
| 	unsigned int bitnum = 7 - (bitnr % 8); | ||||
| 	uint8_t bitval; | ||||
|  | ||||
| 	if (bytenum >= bv->data_len) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	/* first clear the bit */ | ||||
| 	bitval = bitval2mask(ONE, bitnum); | ||||
| 	bv->data[bytenum] &= ~bitval; | ||||
|  | ||||
| 	/* then set it to desired value */ | ||||
| 	bitval = bitval2mask(bit, bitnum); | ||||
| 	bv->data[bytenum] |= bitval; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* set the next bit inside a bitvec */ | ||||
| int bitvec_set_bit(struct bitvec *bv, enum bit_value bit) | ||||
| { | ||||
| 	int rc; | ||||
|  | ||||
| 	rc = bitvec_set_bit_pos(bv, bv->cur_bit, bit); | ||||
| 	if (!rc) | ||||
| 		bv->cur_bit++; | ||||
|  | ||||
| 	return rc; | ||||
| } | ||||
|  | ||||
| /* set multiple bits (based on array of bitvals) at current pos */ | ||||
| int bitvec_set_bits(struct bitvec *bv, enum bit_value *bits, int count) | ||||
| { | ||||
| 	int i, rc; | ||||
|  | ||||
| 	for (i = 0; i < count; i++) { | ||||
| 		rc = bitvec_set_bit(bv, bits[i]); | ||||
| 		if (rc) | ||||
| 			return rc; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* set multiple bits (based on numeric value) at current pos */ | ||||
| int bitvec_set_uint(struct bitvec *bv, unsigned int ui, int num_bits) | ||||
| { | ||||
| 	int i, rc; | ||||
|  | ||||
| 	for (i = 0; i < num_bits; i++) { | ||||
| 		int bit = 0; | ||||
| 		if (ui & (1 << (num_bits - i - 1))) | ||||
| 			bit = 1; | ||||
| 		rc = bitvec_set_bit(bv, bit); | ||||
| 		if (rc) | ||||
| 			return rc; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* pad all remaining bits up to num_bits */ | ||||
| int bitvec_spare_padding(struct bitvec *bv, unsigned int up_to_bit) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	for (i = bv->cur_bit; i <= up_to_bit; i++) | ||||
| 		bitvec_set_bit(bv, L); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										230
									
								
								libosmocore/src/comp128.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								libosmocore/src/comp128.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,230 @@ | ||||
| /* | ||||
|  * COMP128 implementation | ||||
|  * | ||||
|  * | ||||
|  * This code is inspired by original code from : | ||||
|  *  Marc Briceno <marc@scard.org>, Ian Goldberg <iang@cs.berkeley.edu>, | ||||
|  *  and David Wagner <daw@cs.berkeley.edu> | ||||
|  * | ||||
|  * But it has been fully rewritten from various PDFs found online describing | ||||
|  * the algorithm because the licence of the code referenced above was unclear. | ||||
|  * A comment snippet from the original code is included below, it describes | ||||
|  * where the doc came from and how the algorithm was reverse engineered. | ||||
|  * | ||||
|  * | ||||
|  * (C) 2009 by Sylvain Munaut <tnt@246tNt.com> | ||||
|  * | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * --- SNIP --- | ||||
|  * | ||||
|  * This code derived from a leaked document from the GSM standards. | ||||
|  * Some missing pieces were filled in by reverse-engineering a working SIM. | ||||
|  * We have verified that this is the correct COMP128 algorithm. | ||||
|  * | ||||
|  * The first page of the document identifies it as | ||||
|  * 	_Technical Information: GSM System Security Study_. | ||||
|  * 	10-1617-01, 10th June 1988. | ||||
|  * The bottom of the title page is marked | ||||
|  * 	Racal Research Ltd. | ||||
|  * 	Worton Drive, Worton Grange Industrial Estate, | ||||
|  * 	Reading, Berks. RG2 0SB, England. | ||||
|  * 	Telephone: Reading (0734) 868601   Telex: 847152 | ||||
|  * The relevant bits are in Part I, Section 20 (pages 66--67).  Enjoy! | ||||
|  * | ||||
|  * Note: There are three typos in the spec (discovered by | ||||
|  * reverse-engineering). | ||||
|  * First, "z = (2 * x[n] + x[n]) mod 2^(9-j)" should clearly read | ||||
|  * "z = (2 * x[m] + x[n]) mod 2^(9-j)". | ||||
|  * Second, the "k" loop in the "Form bits from bytes" section is severely | ||||
|  * botched: the k index should run only from 0 to 3, and clearly the range | ||||
|  * on "the (8-k)th bit of byte j" is also off (should be 0..7, not 1..8, | ||||
|  * to be consistent with the subsequent section). | ||||
|  * Third, SRES is taken from the first 8 nibbles of x[], not the last 8 as | ||||
|  * claimed in the document.  (And the document doesn't specify how Kc is | ||||
|  * derived, but that was also easily discovered with reverse engineering.) | ||||
|  * All of these typos have been corrected in the following code. | ||||
|  * | ||||
|  * --- /SNIP --- | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* The compression tables (just copied ...) */ | ||||
| static const uint8_t table_0[512] = { | ||||
|  102, 177, 186, 162,   2, 156, 112,  75,  55,  25,   8,  12, 251, 193, 246, 188, | ||||
|  109, 213, 151,  53,  42,  79, 191, 115, 233, 242, 164, 223, 209, 148, 108, 161, | ||||
|  252,  37, 244,  47,  64, 211,   6, 237, 185, 160, 139, 113,  76, 138,  59,  70, | ||||
|   67,  26,  13, 157,  63, 179, 221,  30, 214,  36, 166,  69, 152, 124, 207, 116, | ||||
|  247, 194,  41,  84,  71,   1,  49,  14,  95,  35, 169,  21,  96,  78, 215, 225, | ||||
|  182, 243,  28,  92, 201, 118,   4,  74, 248, 128,  17,  11, 146, 132, 245,  48, | ||||
|  149,  90, 120,  39,  87, 230, 106, 232, 175,  19, 126, 190, 202, 141, 137, 176, | ||||
|  250,  27, 101,  40, 219, 227,  58,  20,  51, 178,  98, 216, 140,  22,  32, 121, | ||||
|   61, 103, 203,  72,  29, 110,  85, 212, 180, 204, 150, 183,  15,  66, 172, 196, | ||||
|   56, 197, 158,   0, 100,  45, 153,   7, 144, 222, 163, 167,  60, 135, 210, 231, | ||||
|  174, 165,  38, 249, 224,  34, 220, 229, 217, 208, 241,  68, 206, 189, 125, 255, | ||||
|  239,  54, 168,  89, 123, 122,  73, 145, 117, 234, 143,  99, 129, 200, 192,  82, | ||||
|  104, 170, 136, 235,  93,  81, 205, 173, 236,  94, 105,  52,  46, 228, 198,   5, | ||||
|   57, 254,  97, 155, 142, 133, 199, 171, 187,  50,  65, 181, 127, 107, 147, 226, | ||||
|  184, 218, 131,  33,  77,  86,  31,  44,  88,  62, 238,  18,  24,  43, 154,  23, | ||||
|   80, 159, 134, 111,   9, 114,   3,  91,  16, 130,  83,  10, 195, 240, 253, 119, | ||||
|  177, 102, 162, 186, 156,   2,  75, 112,  25,  55,  12,   8, 193, 251, 188, 246, | ||||
|  213, 109,  53, 151,  79,  42, 115, 191, 242, 233, 223, 164, 148, 209, 161, 108, | ||||
|   37, 252,  47, 244, 211,  64, 237,   6, 160, 185, 113, 139, 138,  76,  70,  59, | ||||
|   26,  67, 157,  13, 179,  63,  30, 221,  36, 214,  69, 166, 124, 152, 116, 207, | ||||
|  194, 247,  84,  41,   1,  71,  14,  49,  35,  95,  21, 169,  78,  96, 225, 215, | ||||
|  243, 182,  92,  28, 118, 201,  74,   4, 128, 248,  11,  17, 132, 146,  48, 245, | ||||
|   90, 149,  39, 120, 230,  87, 232, 106,  19, 175, 190, 126, 141, 202, 176, 137, | ||||
|   27, 250,  40, 101, 227, 219,  20,  58, 178,  51, 216,  98,  22, 140, 121,  32, | ||||
|  103,  61,  72, 203, 110,  29, 212,  85, 204, 180, 183, 150,  66,  15, 196, 172, | ||||
|  197,  56,   0, 158,  45, 100,   7, 153, 222, 144, 167, 163, 135,  60, 231, 210, | ||||
|  165, 174, 249,  38,  34, 224, 229, 220, 208, 217,  68, 241, 189, 206, 255, 125, | ||||
|   54, 239,  89, 168, 122, 123, 145,  73, 234, 117,  99, 143, 200, 129,  82, 192, | ||||
|  170, 104, 235, 136,  81,  93, 173, 205,  94, 236,  52, 105, 228,  46,   5, 198, | ||||
|  254,  57, 155,  97, 133, 142, 171, 199,  50, 187, 181,  65, 107, 127, 226, 147, | ||||
|  218, 184,  33, 131,  86,  77,  44,  31,  62,  88,  18, 238,  43,  24,  23, 154, | ||||
|  159,  80, 111, 134, 114,   9,  91,   3, 130,  16,  10,  83, 240, 195, 119, 253, | ||||
| }, table_1[256] = { | ||||
|   19,  11,  80, 114,  43,   1,  69,  94,  39,  18, 127, 117,  97,   3,  85,  43, | ||||
|   27, 124,  70,  83,  47,  71,  63,  10,  47,  89,  79,   4,  14,  59,  11,   5, | ||||
|   35, 107, 103,  68,  21,  86,  36,  91,  85, 126,  32,  50, 109,  94, 120,   6, | ||||
|   53,  79,  28,  45,  99,  95,  41,  34,  88,  68,  93,  55, 110, 125, 105,  20, | ||||
|   90,  80,  76,  96,  23,  60,  89,  64, 121,  56,  14,  74, 101,   8,  19,  78, | ||||
|   76,  66, 104,  46, 111,  50,  32,   3,  39,   0,  58,  25,  92,  22,  18,  51, | ||||
|   57,  65, 119, 116,  22, 109,   7,  86,  59,  93,  62, 110,  78,  99,  77,  67, | ||||
|   12, 113,  87,  98, 102,   5,  88,  33,  38,  56,  23,   8,  75,  45,  13,  75, | ||||
|   95,  63,  28,  49, 123, 120,  20, 112,  44,  30,  15,  98, 106,   2, 103,  29, | ||||
|   82, 107,  42, 124,  24,  30,  41,  16, 108, 100, 117,  40,  73,  40,   7, 114, | ||||
|   82, 115,  36, 112,  12, 102, 100,  84,  92,  48,  72,  97,   9,  54,  55,  74, | ||||
|  113, 123,  17,  26,  53,  58,   4,   9,  69, 122,  21, 118,  42,  60,  27,  73, | ||||
|  118, 125,  34,  15,  65, 115,  84,  64,  62,  81,  70,   1,  24, 111, 121,  83, | ||||
|  104,  81,  49, 127,  48, 105,  31,  10,   6,  91,  87,  37,  16,  54, 116, 126, | ||||
|   31,  38,  13,   0,  72, 106,  77,  61,  26,  67,  46,  29,  96,  37,  61,  52, | ||||
|  101,  17,  44, 108,  71,  52,  66,  57,  33,  51,  25,  90,   2, 119, 122,  35, | ||||
| }, table_2[128] = { | ||||
|  52,  50,  44,   6,  21,  49,  41,  59,  39,  51,  25,  32,  51,  47,  52,  43, | ||||
|  37,   4,  40,  34,  61,  12,  28,   4,  58,  23,   8,  15,  12,  22,   9,  18, | ||||
|  55,  10,  33,  35,  50,   1,  43,   3,  57,  13,  62,  14,   7,  42,  44,  59, | ||||
|  62,  57,  27,   6,   8,  31,  26,  54,  41,  22,  45,  20,  39,   3,  16,  56, | ||||
|  48,   2,  21,  28,  36,  42,  60,  33,  34,  18,   0,  11,  24,  10,  17,  61, | ||||
|  29,  14,  45,  26,  55,  46,  11,  17,  54,  46,   9,  24,  30,  60,  32,   0, | ||||
|  20,  38,   2,  30,  58,  35,   1,  16,  56,  40,  23,  48,  13,  19,  19,  27, | ||||
|  31,  53,  47,  38,  63,  15,  49,   5,  37,  53,  25,  36,  63,  29,   5,   7, | ||||
| }, table_3[64] = { | ||||
|   1,   5,  29,   6,  25,   1,  18,  23,  17,  19,   0,   9,  24,  25,   6,  31, | ||||
|  28,  20,  24,  30,   4,  27,   3,  13,  15,  16,  14,  18,   4,   3,   8,   9, | ||||
|  20,   0,  12,  26,  21,   8,  28,   2,  29,   2,  15,   7,  11,  22,  14,  10, | ||||
|  17,  21,  12,  30,  26,  27,  16,  31,  11,   7,  13,  23,  10,   5,  22,  19, | ||||
| }, table_4[32] = { | ||||
|  15,  12,  10,   4,   1,  14,  11,   7,   5,   0,  14,   7,   1,   2,  13,   8, | ||||
|  10,   3,   4,   9,   6,   0,   3,   2,   5,   6,   8,   9,  11,  13,  15,  12, | ||||
| }; | ||||
|  | ||||
| static const uint8_t *_comp128_table[5] = { table_0, table_1, table_2, table_3, table_4 }; | ||||
|  | ||||
|  | ||||
| static inline void | ||||
| _comp128_compression_round(uint8_t *x, int n, const uint8_t *tbl) | ||||
| { | ||||
| 	int i, j, m, a, b, y, z; | ||||
| 	m = 4 - n; | ||||
| 	for (i=0; i<(1<<n); i++) | ||||
| 		for (j=0; j<(1<<m); j++) { | ||||
| 			a = j + i * (2<<m); | ||||
| 			b = a + (1<<m); | ||||
| 			y = (x[a] + (x[b]<<1)) & ((32<<m)-1); | ||||
| 			z = ((x[a]<<1) + x[b]) & ((32<<m)-1); | ||||
| 			x[a] = tbl[y]; | ||||
| 			x[b] = tbl[z]; | ||||
| 		} | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| _comp128_compression(uint8_t *x) | ||||
| { | ||||
| 	int n; | ||||
| 	for (n=0; n<5; n++) | ||||
| 		_comp128_compression_round(x, n, _comp128_table[n]); | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| _comp128_bitsfrombytes(uint8_t *x, uint8_t *bits) | ||||
| { | ||||
| 	int i; | ||||
| 	memset(bits, 0x00, 128); | ||||
| 	for (i=0; i<128; i++) | ||||
| 		if (x[i>>2] & (1<<(3-(i&3)))) | ||||
| 			bits[i] = 1; | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| _comp128_permutation(uint8_t *x, uint8_t *bits) | ||||
| { | ||||
| 	int i; | ||||
| 	memset(&x[16], 0x00, 16); | ||||
| 	for (i=0; i<128; i++) | ||||
| 		x[(i>>3)+16] |= bits[(i*17) & 127] << (7-(i&7)); | ||||
| } | ||||
|  | ||||
| void | ||||
| comp128(uint8_t *ki, uint8_t *rand, uint8_t *sres, uint8_t *kc) | ||||
| { | ||||
| 	int i; | ||||
| 	uint8_t x[32], bits[128]; | ||||
|  | ||||
| 	/* x[16-31] = RAND */ | ||||
| 	memcpy(&x[16], rand, 16); | ||||
|  | ||||
| 	/* Round 1-7 */ | ||||
| 	for (i=0; i<7; i++) { | ||||
| 		/* x[0-15] = Ki */ | ||||
| 		memcpy(x, ki, 16); | ||||
|  | ||||
| 		/* Compression */ | ||||
| 		_comp128_compression(x); | ||||
|  | ||||
| 		/* FormBitFromBytes */ | ||||
| 		_comp128_bitsfrombytes(x, bits); | ||||
|  | ||||
| 		/* Permutation */ | ||||
| 		_comp128_permutation(x, bits); | ||||
| 	} | ||||
|  | ||||
| 	/* Round 8 (final) */ | ||||
| 		/* x[0-15] = Ki */ | ||||
| 	memcpy(x, ki, 16); | ||||
|  | ||||
| 		/* Compression */ | ||||
| 	_comp128_compression(x); | ||||
|  | ||||
| 	/* Output stage */ | ||||
| 	for (i=0; i<8; i+=2) | ||||
| 		sres[i>>1] = x[i]<<4 | x[i+1]; | ||||
|  | ||||
| 	for (i=0; i<12; i+=2) | ||||
| 		kc[i>>1] = (x[i + 18] << 6) | | ||||
| 		           (x[i + 19] << 2) | | ||||
| 		           (x[i + 20] >> 2); | ||||
|  | ||||
| 	kc[6] = (x[30]<<6) | (x[31]<<2); | ||||
| 	kc[7] = 0; | ||||
| } | ||||
|  | ||||
							
								
								
									
										263
									
								
								libosmocore/src/gsm48.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								libosmocore/src/gsm48.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,263 @@ | ||||
| /* GSM Mobile Radio Interface Layer 3 messages | ||||
|  * 3GPP TS 04.08 version 7.21.0 Release 1998 / ETSI TS 100 940 V7.21.0 */ | ||||
|  | ||||
| /* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org> | ||||
|  * (C) 2008, 2009 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
|  | ||||
| #include <osmocore/utils.h> | ||||
| #include <osmocore/tlv.h> | ||||
| #include <osmocore/gsm48.h> | ||||
|  | ||||
| #include <osmocore/protocol/gsm_04_08.h> | ||||
|  | ||||
| const struct tlv_definition gsm48_att_tlvdef = { | ||||
| 	.def = { | ||||
| 		[GSM48_IE_MOBILE_ID]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_NAME_LONG]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_NAME_SHORT]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_UTC]		= { TLV_TYPE_TV }, | ||||
| 		[GSM48_IE_NET_TIME_TZ]	= { TLV_TYPE_FIXED, 7 }, | ||||
| 		[GSM48_IE_LSA_IDENT]	= { TLV_TYPE_TLV }, | ||||
|  | ||||
| 		[GSM48_IE_BEARER_CAP]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CAUSE]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CC_CAP]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_ALERT]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_FACILITY]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_PROGR_IND]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_AUX_STATUS]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_NOTIFY]	= { TLV_TYPE_TV }, | ||||
| 		[GSM48_IE_KPD_FACILITY]	= { TLV_TYPE_TV }, | ||||
| 		[GSM48_IE_SIGNAL]	= { TLV_TYPE_TV }, | ||||
| 		[GSM48_IE_CONN_BCD]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CONN_SUB]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CALLING_BCD]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CALLING_SUB]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CALLED_BCD]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_CALLED_SUB]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_REDIR_BCD]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_REDIR_SUB]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_LOWL_COMPAT]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_HIGHL_COMPAT]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_USER_USER]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_SS_VERS]	= { TLV_TYPE_TLV }, | ||||
| 		[GSM48_IE_MORE_DATA]	= { TLV_TYPE_T }, | ||||
| 		[GSM48_IE_CLIR_SUPP]	= { TLV_TYPE_T }, | ||||
| 		[GSM48_IE_CLIR_INVOC]	= { TLV_TYPE_T }, | ||||
| 		[GSM48_IE_REV_C_SETUP]	= { TLV_TYPE_T }, | ||||
| 		[GSM48_IE_REPEAT_CIR]   = { TLV_TYPE_T }, | ||||
| 		[GSM48_IE_REPEAT_SEQ]   = { TLV_TYPE_T }, | ||||
| 		/* FIXME: more elements */ | ||||
| 	}, | ||||
| }; | ||||
|  | ||||
| static const struct value_string rr_cause_names[] = { | ||||
| 	{ GSM48_RR_CAUSE_NORMAL,		"Normal event" }, | ||||
| 	{ GSM48_RR_CAUSE_ABNORMAL_UNSPEC,	"Abnormal release, unspecified" }, | ||||
| 	{ GSM48_RR_CAUSE_ABNORMAL_UNACCT,	"Abnormal release, channel unacceptable" }, | ||||
| 	{ GSM48_RR_CAUSE_ABNORMAL_TIMER,	"Abnormal release, timer expired" }, | ||||
| 	{ GSM48_RR_CAUSE_ABNORMAL_NOACT,	"Abnormal release, no activity on radio path" }, | ||||
| 	{ GSM48_RR_CAUSE_PREMPTIVE_REL,		"Preemptive release" }, | ||||
| 	{ GSM48_RR_CAUSE_HNDOVER_IMP,		"Handover impossible, timing advance out of range" }, | ||||
| 	{ GSM48_RR_CAUSE_CHAN_MODE_UNACCT,	"Channel mode unacceptable" }, | ||||
| 	{ GSM48_RR_CAUSE_FREQ_NOT_IMPL,		"Frequency not implemented" }, | ||||
| 	{ GSM48_RR_CAUSE_CALL_CLEARED,		"Call already cleared" }, | ||||
| 	{ GSM48_RR_CAUSE_SEMANT_INCORR,		"Semantically incorrect message" }, | ||||
| 	{ GSM48_RR_CAUSE_INVALID_MAND_INF,	"Invalid mandatory information" }, | ||||
| 	{ GSM48_RR_CAUSE_MSG_TYPE_N,		"Message type non-existant or not implemented" }, | ||||
| 	{ GSM48_RR_CAUSE_MSG_TYPE_N_COMPAT,	"Message type not compatible with protocol state" }, | ||||
| 	{ GSM48_RR_CAUSE_COND_IE_ERROR,		"Conditional IE error" }, | ||||
| 	{ GSM48_RR_CAUSE_NO_CELL_ALLOC_A,	"No cell allocation available" }, | ||||
| 	{ GSM48_RR_CAUSE_PROT_ERROR_UNSPC,	"Protocol error unspecified" }, | ||||
| 	{ 0,					NULL }, | ||||
| }; | ||||
|  | ||||
| /* FIXME: convert to value_string */ | ||||
| static const char *cc_state_names[32] = { | ||||
| 	"NULL", | ||||
| 	"INITIATED", | ||||
| 	"illegal state 2", | ||||
| 	"MO_CALL_PROC", | ||||
| 	"CALL_DELIVERED", | ||||
| 	"illegal state 5", | ||||
| 	"CALL_PRESENT", | ||||
| 	"CALL_RECEIVED", | ||||
| 	"CONNECT_REQUEST", | ||||
| 	"MO_TERM_CALL_CONF", | ||||
| 	"ACTIVE", | ||||
| 	"DISCONNECT_REQ", | ||||
| 	"DISCONNECT_IND", | ||||
| 	"illegal state 13", | ||||
| 	"illegal state 14", | ||||
| 	"illegal state 15", | ||||
| 	"illegal state 16", | ||||
| 	"illegal state 17", | ||||
| 	"illegal state 18", | ||||
| 	"RELEASE_REQ", | ||||
| 	"illegal state 20", | ||||
| 	"illegal state 21", | ||||
| 	"illegal state 22", | ||||
| 	"illegal state 23", | ||||
| 	"illegal state 24", | ||||
| 	"illegal state 25", | ||||
| 	"MO_ORIG_MODIFY", | ||||
| 	"MO_TERM_MODIFY", | ||||
| 	"CONNECT_IND", | ||||
| 	"illegal state 29", | ||||
| 	"illegal state 30", | ||||
| 	"illegal state 31", | ||||
| }; | ||||
|  | ||||
| const char *gsm48_cc_state_name(uint8_t state) | ||||
| { | ||||
| 	if (state < ARRAY_SIZE(cc_state_names)) | ||||
| 		return cc_state_names[state]; | ||||
|  | ||||
| 	return "invalid"; | ||||
| } | ||||
|  | ||||
| static const struct value_string cc_msg_names[] = { | ||||
| 	{ GSM48_MT_CC_ALERTING,		"ALERTING" }, | ||||
| 	{ GSM48_MT_CC_CALL_PROC,	"CALL_PROC" }, | ||||
| 	{ GSM48_MT_CC_PROGRESS,		"PROGRESS" }, | ||||
| 	{ GSM48_MT_CC_ESTAB,		"ESTAB" }, | ||||
| 	{ GSM48_MT_CC_SETUP,		"SETUP" }, | ||||
| 	{ GSM48_MT_CC_ESTAB_CONF,	"ESTAB_CONF" }, | ||||
| 	{ GSM48_MT_CC_CONNECT,		"CONNECT" }, | ||||
| 	{ GSM48_MT_CC_CALL_CONF,	"CALL_CONF" }, | ||||
| 	{ GSM48_MT_CC_START_CC,		"START_CC" }, | ||||
| 	{ GSM48_MT_CC_RECALL,		"RECALL" }, | ||||
| 	{ GSM48_MT_CC_EMERG_SETUP,	"EMERG_SETUP" }, | ||||
| 	{ GSM48_MT_CC_CONNECT_ACK,	"CONNECT_ACK" }, | ||||
| 	{ GSM48_MT_CC_USER_INFO,	"USER_INFO" }, | ||||
| 	{ GSM48_MT_CC_MODIFY_REJECT,	"MODIFY_REJECT" }, | ||||
| 	{ GSM48_MT_CC_MODIFY,		"MODIFY" }, | ||||
| 	{ GSM48_MT_CC_HOLD,		"HOLD" }, | ||||
| 	{ GSM48_MT_CC_HOLD_ACK,		"HOLD_ACK" }, | ||||
| 	{ GSM48_MT_CC_HOLD_REJ,		"HOLD_REJ" }, | ||||
| 	{ GSM48_MT_CC_RETR,		"RETR" }, | ||||
| 	{ GSM48_MT_CC_RETR_ACK,		"RETR_ACK" }, | ||||
| 	{ GSM48_MT_CC_RETR_REJ,		"RETR_REJ" }, | ||||
| 	{ GSM48_MT_CC_MODIFY_COMPL,	"MODIFY_COMPL" }, | ||||
| 	{ GSM48_MT_CC_DISCONNECT,	"DISCONNECT" }, | ||||
| 	{ GSM48_MT_CC_RELEASE_COMPL,	"RELEASE_COMPL" }, | ||||
| 	{ GSM48_MT_CC_RELEASE,		"RELEASE" }, | ||||
| 	{ GSM48_MT_CC_STOP_DTMF,	"STOP_DTMF" }, | ||||
| 	{ GSM48_MT_CC_STOP_DTMF_ACK,	"STOP_DTMF_ACK" }, | ||||
| 	{ GSM48_MT_CC_STATUS_ENQ,	"STATUS_ENQ" }, | ||||
| 	{ GSM48_MT_CC_START_DTMF,	"START_DTMF" }, | ||||
| 	{ GSM48_MT_CC_START_DTMF_ACK,	"START_DTMF_ACK" }, | ||||
| 	{ GSM48_MT_CC_START_DTMF_REJ,	"START_DTMF_REJ" }, | ||||
| 	{ GSM48_MT_CC_CONG_CTRL,	"CONG_CTRL" }, | ||||
| 	{ GSM48_MT_CC_FACILITY,		"FACILITY" }, | ||||
| 	{ GSM48_MT_CC_STATUS,		"STATUS" }, | ||||
| 	{ GSM48_MT_CC_NOTIFY,		"NOTFIY" }, | ||||
| 	{ 0,				NULL } | ||||
| }; | ||||
|  | ||||
| const char *gsm48_cc_msg_name(uint8_t msgtype) | ||||
| { | ||||
| 	return get_value_string(cc_msg_names, msgtype); | ||||
| } | ||||
|  | ||||
| const char *rr_cause_name(uint8_t cause) | ||||
| { | ||||
| 	return get_value_string(rr_cause_names, cause); | ||||
| } | ||||
|  | ||||
| static void to_bcd(uint8_t *bcd, uint16_t val) | ||||
| { | ||||
| 	bcd[2] = val % 10; | ||||
| 	val = val / 10; | ||||
| 	bcd[1] = val % 10; | ||||
| 	val = val / 10; | ||||
| 	bcd[0] = val % 10; | ||||
| 	val = val / 10; | ||||
| } | ||||
|  | ||||
| void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc, | ||||
| 			uint16_t mnc, uint16_t lac) | ||||
| { | ||||
| 	uint8_t bcd[3]; | ||||
|  | ||||
| 	to_bcd(bcd, mcc); | ||||
| 	lai48->digits[0] = bcd[0] | (bcd[1] << 4); | ||||
| 	lai48->digits[1] = bcd[2]; | ||||
|  | ||||
| 	to_bcd(bcd, mnc); | ||||
| 	/* FIXME: do we need three-digit MNC? See Table 10.5.3 */ | ||||
| #if 0 | ||||
| 	lai48->digits[1] |= bcd[2] << 4; | ||||
| 	lai48->digits[2] = bcd[0] | (bcd[1] << 4); | ||||
| #else | ||||
| 	lai48->digits[1] |= 0xf << 4; | ||||
| 	lai48->digits[2] = bcd[1] | (bcd[2] << 4); | ||||
| #endif | ||||
|  | ||||
| 	lai48->lac = htons(lac); | ||||
| } | ||||
|  | ||||
| int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi) | ||||
| { | ||||
| 	uint32_t *tptr = (uint32_t *) &buf[3]; | ||||
|  | ||||
| 	buf[0] = GSM48_IE_MOBILE_ID; | ||||
| 	buf[1] = GSM48_TMSI_LEN; | ||||
| 	buf[2] = 0xf0 | GSM_MI_TYPE_TMSI; | ||||
| 	*tptr = htonl(tmsi); | ||||
|  | ||||
| 	return 7; | ||||
| } | ||||
|  | ||||
| int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi) | ||||
| { | ||||
| 	unsigned int length = strlen(imsi), i, off = 0; | ||||
| 	uint8_t odd = (length & 0x1) == 1; | ||||
|  | ||||
| 	buf[0] = GSM48_IE_MOBILE_ID; | ||||
| 	buf[2] = char2bcd(imsi[0]) << 4 | GSM_MI_TYPE_IMSI | (odd << 3); | ||||
|  | ||||
| 	/* if the length is even we will fill half of the last octet */ | ||||
| 	if (odd) | ||||
| 		buf[1] = (length + 1) >> 1; | ||||
| 	else | ||||
| 		buf[1] = (length + 2) >> 1; | ||||
|  | ||||
| 	for (i = 1; i < buf[1]; ++i) { | ||||
| 		uint8_t lower, upper; | ||||
|  | ||||
| 		lower = char2bcd(imsi[++off]); | ||||
| 		if (!odd && off + 1 == length) | ||||
| 			upper = 0x0f; | ||||
| 		else | ||||
| 			upper = char2bcd(imsi[++off]) & 0x0f; | ||||
|  | ||||
| 		buf[2 + i] = (upper << 4) | lower; | ||||
| 	} | ||||
|  | ||||
| 	return 2 + buf[1]; | ||||
| } | ||||
							
								
								
									
										659
									
								
								libosmocore/src/gsm48_ie.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										659
									
								
								libosmocore/src/gsm48_ie.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,659 @@ | ||||
| /* GSM Mobile Radio Interface Layer 3 messages | ||||
|  * 3GPP TS 04.08 version 7.21.0 Release 1998 / ETSI TS 100 940 V7.21.0 */ | ||||
|  | ||||
| /* (C) 2008 by Harald Welte <laforge@gnumonks.org> | ||||
|  * (C) 2008-2010 by Andreas Eversberg | ||||
|  * | ||||
|  * 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 <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #include <osmocore/utils.h> | ||||
| #include <osmocore/msgb.h> | ||||
| #include <osmocore/tlv.h> | ||||
| #include <osmocore/mncc.h> | ||||
| #include <osmocore/protocol/gsm_04_08.h> | ||||
|  | ||||
| static const char bcd_num_digits[] = { | ||||
| 	'0', '1', '2', '3', '4', '5', '6', '7', | ||||
| 	'8', '9', '*', '#', 'a', 'b', 'c', '\0' | ||||
| }; | ||||
|  | ||||
| /* 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) | ||||
| { | ||||
| 	uint8_t in_len = bcd_lv[0]; | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 1 + h_len; i <= in_len; i++) { | ||||
| 		/* lower nibble */ | ||||
| 		output_len--; | ||||
| 		if (output_len <= 1) | ||||
| 			break; | ||||
| 		*output++ = bcd_num_digits[bcd_lv[i] & 0xf]; | ||||
|  | ||||
| 		/* higher nibble */ | ||||
| 		output_len--; | ||||
| 		if (output_len <= 1) | ||||
| 			break; | ||||
| 		*output++ = bcd_num_digits[bcd_lv[i] >> 4]; | ||||
| 	} | ||||
| 	if (output_len >= 1) | ||||
| 		*output++ = '\0'; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* convert a single ASCII character to call-control BCD */ | ||||
| static int asc_to_bcd(const char asc) | ||||
| { | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < ARRAY_SIZE(bcd_num_digits); i++) { | ||||
| 		if (bcd_num_digits[i] == asc) | ||||
| 			return i; | ||||
| 	} | ||||
| 	return -EINVAL; | ||||
| } | ||||
|  | ||||
| /* 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) | ||||
| { | ||||
| 	int in_len = strlen(input); | ||||
| 	int i; | ||||
| 	uint8_t *bcd_cur = bcd_lv + 1 + h_len; | ||||
|  | ||||
| 	/* two digits per byte, plus type byte */ | ||||
| 	bcd_lv[0] = in_len/2 + h_len; | ||||
| 	if (in_len % 2) | ||||
| 		bcd_lv[0]++; | ||||
|  | ||||
| 	if (bcd_lv[0] > max_len) | ||||
| 		return -EIO; | ||||
|  | ||||
| 	for (i = 0; i < in_len; i++) { | ||||
| 		int rc = asc_to_bcd(input[i]); | ||||
| 		if (rc < 0) | ||||
| 			return rc; | ||||
| 		if (i % 2 == 0) | ||||
| 			*bcd_cur = rc; | ||||
| 		else | ||||
| 			*bcd_cur++ |= (rc << 4); | ||||
| 	} | ||||
| 	/* append padding nibble in case of odd length */ | ||||
| 	if (i % 2) | ||||
| 		*bcd_cur++ |= 0xf0; | ||||
|  | ||||
| 	/* return how many bytes we used */ | ||||
| 	return (bcd_cur - bcd_lv); | ||||
| } | ||||
|  | ||||
| /* decode 'bearer capability' */ | ||||
| int gsm48_decode_bearer_cap(struct gsm_mncc_bearer_cap *bcap, | ||||
| 			     const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
| 	int i, s; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	bcap->speech_ver[0] = -1; /* end of list, of maximum 7 values */ | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	bcap->transfer = lv[1] & 0x07; | ||||
| 	bcap->mode = (lv[1] & 0x08) >> 3; | ||||
| 	bcap->coding = (lv[1] & 0x10) >> 4; | ||||
| 	bcap->radio = (lv[1] & 0x60) >> 5; | ||||
|  | ||||
| 	if (bcap->transfer == GSM_MNCC_BCAP_SPEECH) { | ||||
| 		i = 1; | ||||
| 		s = 0; | ||||
| 		while(!(lv[i] & 0x80)) { | ||||
| 			i++; /* octet 3a etc */ | ||||
| 			if (in_len < i) | ||||
| 				return 0; | ||||
| 			bcap->speech_ver[s++] = lv[i] & 0x0f; | ||||
| 			bcap->speech_ver[s] = -1; /* end of list */ | ||||
| 			if (i == 2) /* octet 3a */ | ||||
| 				bcap->speech_ctm = (lv[i] & 0x20) >> 5; | ||||
| 			if (s == 7) /* maximum speech versions + end of list */ | ||||
| 				return 0; | ||||
| 		} | ||||
| 	} else { | ||||
| 		i = 1; | ||||
| 		while (!(lv[i] & 0x80)) { | ||||
| 			i++; /* octet 3a etc */ | ||||
| 			if (in_len < i) | ||||
| 				return 0; | ||||
| 			/* ignore them */ | ||||
| 		} | ||||
| 		/* FIXME: implement OCTET 4+ parsing */ | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'bearer capability' */ | ||||
| int gsm48_encode_bearer_cap(struct msgb *msg, int lv_only, | ||||
| 			     const struct gsm_mncc_bearer_cap *bcap) | ||||
| { | ||||
| 	uint8_t lv[32 + 1]; | ||||
| 	int i = 1, s; | ||||
|  | ||||
| 	lv[1] = bcap->transfer; | ||||
| 	lv[1] |= bcap->mode << 3; | ||||
| 	lv[1] |= bcap->coding << 4; | ||||
| 	lv[1] |= bcap->radio << 5; | ||||
|  | ||||
| 	if (bcap->transfer == GSM_MNCC_BCAP_SPEECH) { | ||||
| 		for (s = 0; bcap->speech_ver[s] >= 0; s++) { | ||||
| 			i++; /* octet 3a etc */ | ||||
| 			lv[i] = bcap->speech_ver[s]; | ||||
| 			if (i == 2) /* octet 3a */ | ||||
| 				lv[i] |= bcap->speech_ctm << 5; | ||||
| 		} | ||||
| 		lv[i] |= 0x80; /* last IE of octet 3 etc */ | ||||
| 	} else { | ||||
| 		/* FIXME: implement OCTET 4+ encoding */ | ||||
| 	} | ||||
|  | ||||
| 	lv[0] = i; | ||||
| 	if (lv_only) | ||||
| 		msgb_lv_put(msg, lv[0], lv+1); | ||||
| 	else | ||||
| 		msgb_tlv_put(msg, GSM48_IE_BEARER_CAP, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'call control cap' */ | ||||
| int gsm48_decode_cccap(struct gsm_mncc_cccap *ccap, const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	ccap->dtmf = lv[1] & 0x01; | ||||
| 	ccap->pcp = (lv[1] & 0x02) >> 1; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'call control cap' */ | ||||
| int gsm48_encode_cccap(struct msgb *msg, | ||||
| 			const struct gsm_mncc_cccap *ccap) | ||||
| { | ||||
| 	uint8_t lv[2]; | ||||
|  | ||||
| 	lv[0] = 1; | ||||
| 	lv[1] = 0; | ||||
| 	if (ccap->dtmf) | ||||
| 		lv [1] |= 0x01; | ||||
| 	if (ccap->pcp) | ||||
| 		lv [1] |= 0x02; | ||||
|  | ||||
| 	msgb_tlv_put(msg, GSM48_IE_CC_CAP, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'called party BCD number' */ | ||||
| int gsm48_decode_called(struct gsm_mncc_number *called, | ||||
| 			 const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	called->plan = lv[1] & 0x0f; | ||||
| 	called->type = (lv[1] & 0x70) >> 4; | ||||
|  | ||||
| 	/* octet 4..N */ | ||||
| 	gsm48_decode_bcd_number(called->number, sizeof(called->number), lv, 1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'called party BCD number' */ | ||||
| int gsm48_encode_called(struct msgb *msg, | ||||
| 			 const struct gsm_mncc_number *called) | ||||
| { | ||||
| 	uint8_t lv[18]; | ||||
| 	int ret; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	lv[1] = called->plan; | ||||
| 	lv[1] |= called->type << 4; | ||||
|  | ||||
| 	/* octet 4..N, octet 2 */ | ||||
| 	ret = gsm48_encode_bcd_number(lv, sizeof(lv), 1, called->number); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
|  | ||||
| 	msgb_tlv_put(msg, GSM48_IE_CALLED_BCD, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode callerid of various IEs */ | ||||
| int gsm48_decode_callerid(struct gsm_mncc_number *callerid, | ||||
| 			 const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
| 	int i = 1; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	callerid->plan = lv[1] & 0x0f; | ||||
| 	callerid->type = (lv[1] & 0x70) >> 4; | ||||
|  | ||||
| 	/* octet 3a */ | ||||
| 	if (!(lv[1] & 0x80)) { | ||||
| 		callerid->screen = lv[2] & 0x03; | ||||
| 		callerid->present = (lv[2] & 0x60) >> 5; | ||||
| 		i = 2; | ||||
| 	} | ||||
|  | ||||
| 	/* octet 4..N */ | ||||
| 	gsm48_decode_bcd_number(callerid->number, sizeof(callerid->number), lv, i); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode callerid of various IEs */ | ||||
| int gsm48_encode_callerid(struct msgb *msg, int ie, int max_len, | ||||
| 			   const struct gsm_mncc_number *callerid) | ||||
| { | ||||
| 	uint8_t lv[max_len - 1]; | ||||
| 	int h_len = 1; | ||||
| 	int ret; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	lv[1] = callerid->plan; | ||||
| 	lv[1] |= callerid->type << 4; | ||||
|  | ||||
| 	if (callerid->present || callerid->screen) { | ||||
| 		/* octet 3a */ | ||||
| 		lv[2] = callerid->screen; | ||||
| 		lv[2] |= callerid->present << 5; | ||||
| 		lv[2] |= 0x80; | ||||
| 		h_len++; | ||||
| 	} else | ||||
| 		lv[1] |= 0x80; | ||||
|  | ||||
| 	/* octet 4..N, octet 2 */ | ||||
| 	ret = gsm48_encode_bcd_number(lv, sizeof(lv), h_len, callerid->number); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
|  | ||||
| 	msgb_tlv_put(msg, ie, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'cause' */ | ||||
| int gsm48_decode_cause(struct gsm_mncc_cause *cause, | ||||
| 			const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
| 	int i; | ||||
|  | ||||
| 	if (in_len < 2) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	cause->diag_len = 0; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	cause->location = lv[1] & 0x0f; | ||||
| 	cause->coding = (lv[1] & 0x60) >> 5; | ||||
|  | ||||
| 	i = 1; | ||||
| 	if (!(lv[i] & 0x80)) { | ||||
| 		i++; /* octet 3a */ | ||||
| 		if (in_len < i+1) | ||||
| 			return 0; | ||||
| 		cause->rec = 1; | ||||
| 		cause->rec_val = lv[i] & 0x7f; | ||||
| 	} | ||||
| 	i++; | ||||
|  | ||||
| 	/* octet 4 */ | ||||
| 	cause->value = lv[i] & 0x7f; | ||||
| 	i++; | ||||
|  | ||||
| 	if (in_len < i) /* no diag */ | ||||
| 		return 0; | ||||
|  | ||||
| 	if (in_len - (i-1) > 32) /* maximum 32 octets */ | ||||
| 		return 0; | ||||
|  | ||||
| 	/* octet 5-N */ | ||||
| 	memcpy(cause->diag, lv + i, in_len - (i-1)); | ||||
| 	cause->diag_len = in_len - (i-1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'cause' */ | ||||
| int gsm48_encode_cause(struct msgb *msg, int lv_only, | ||||
| 			const struct gsm_mncc_cause *cause) | ||||
| { | ||||
| 	uint8_t lv[32+4]; | ||||
| 	int i; | ||||
|  | ||||
| 	if (cause->diag_len > 32) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	/* octet 3 */ | ||||
| 	lv[1] = cause->location; | ||||
| 	lv[1] |= cause->coding << 5; | ||||
|  | ||||
| 	i = 1; | ||||
| 	if (cause->rec) { | ||||
| 		i++; /* octet 3a */ | ||||
| 		lv[i] = cause->rec_val; | ||||
| 	} | ||||
| 	lv[i] |= 0x80; /* end of octet 3 */ | ||||
|  | ||||
| 	/* octet 4 */ | ||||
| 	i++; | ||||
| 	lv[i] = 0x80 | cause->value; | ||||
|  | ||||
| 	/* octet 5-N */ | ||||
| 	if (cause->diag_len) { | ||||
| 		memcpy(lv + i, cause->diag, cause->diag_len); | ||||
| 		i += cause->diag_len; | ||||
| 	} | ||||
|  | ||||
| 	lv[0] = i; | ||||
| 	if (lv_only) | ||||
| 		msgb_lv_put(msg, lv[0], lv+1); | ||||
| 	else | ||||
| 		msgb_tlv_put(msg, GSM48_IE_CAUSE, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'calling number' */ | ||||
| int gsm48_decode_calling(struct gsm_mncc_number *calling, | ||||
| 			 const uint8_t *lv) | ||||
| { | ||||
| 	return gsm48_decode_callerid(calling, lv); | ||||
| } | ||||
|  | ||||
| /* encode 'calling number' */ | ||||
| int gsm48_encode_calling(struct msgb *msg,  | ||||
| 			  const struct gsm_mncc_number *calling) | ||||
| { | ||||
| 	return gsm48_encode_callerid(msg, GSM48_IE_CALLING_BCD, 14, calling); | ||||
| } | ||||
|  | ||||
| /* decode 'connected number' */ | ||||
| int gsm48_decode_connected(struct gsm_mncc_number *connected, | ||||
| 			 const uint8_t *lv) | ||||
| { | ||||
| 	return gsm48_decode_callerid(connected, lv); | ||||
| } | ||||
|  | ||||
| /* encode 'connected number' */ | ||||
| int gsm48_encode_connected(struct msgb *msg, | ||||
| 			    const struct gsm_mncc_number *connected) | ||||
| { | ||||
| 	return gsm48_encode_callerid(msg, GSM48_IE_CONN_BCD, 14, connected); | ||||
| } | ||||
|  | ||||
| /* decode 'redirecting number' */ | ||||
| int gsm48_decode_redirecting(struct gsm_mncc_number *redirecting, | ||||
| 			 const uint8_t *lv) | ||||
| { | ||||
| 	return gsm48_decode_callerid(redirecting, lv); | ||||
| } | ||||
|  | ||||
| /* encode 'redirecting number' */ | ||||
| int gsm48_encode_redirecting(struct msgb *msg, | ||||
| 			      const struct gsm_mncc_number *redirecting) | ||||
| { | ||||
| 	return gsm48_encode_callerid(msg, GSM48_IE_REDIR_BCD, 19, redirecting); | ||||
| } | ||||
|  | ||||
| /* decode 'facility' */ | ||||
| int gsm48_decode_facility(struct gsm_mncc_facility *facility, | ||||
| 			   const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	if (in_len > sizeof(facility->info)) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	memcpy(facility->info, lv+1, in_len); | ||||
| 	facility->len = in_len; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'facility' */ | ||||
| int gsm48_encode_facility(struct msgb *msg, int lv_only, | ||||
| 			   const struct gsm_mncc_facility *facility) | ||||
| { | ||||
| 	uint8_t lv[GSM_MAX_FACILITY + 1]; | ||||
|  | ||||
| 	if (facility->len < 1 || facility->len > GSM_MAX_FACILITY) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	memcpy(lv+1, facility->info, facility->len); | ||||
| 	lv[0] = facility->len; | ||||
| 	if (lv_only) | ||||
| 		msgb_lv_put(msg, lv[0], lv+1); | ||||
| 	else | ||||
| 		msgb_tlv_put(msg, GSM48_IE_FACILITY, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'notify' */ | ||||
| int gsm48_decode_notify(int *notify, const uint8_t *v) | ||||
| { | ||||
| 	*notify = v[0] & 0x7f; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'notify' */ | ||||
| int gsm48_encode_notify(struct msgb *msg, int notify) | ||||
| { | ||||
| 	msgb_v_put(msg, notify | 0x80); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'signal' */ | ||||
| int gsm48_decode_signal(int *signal, const uint8_t *v) | ||||
| { | ||||
| 	*signal = v[0]; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'signal' */ | ||||
| int gsm48_encode_signal(struct msgb *msg, int signal) | ||||
| { | ||||
| 	msgb_tv_put(msg, GSM48_IE_SIGNAL, signal); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'keypad' */ | ||||
| int gsm48_decode_keypad(int *keypad, const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	*keypad = lv[1] & 0x7f; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'keypad' */ | ||||
| int gsm48_encode_keypad(struct msgb *msg, int keypad) | ||||
| { | ||||
| 	msgb_tv_put(msg, GSM48_IE_KPD_FACILITY, keypad); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'progress' */ | ||||
| int gsm48_decode_progress(struct gsm_mncc_progress *progress, | ||||
| 			   const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 2) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	progress->coding = (lv[1] & 0x60) >> 5; | ||||
| 	progress->location = lv[1] & 0x0f; | ||||
| 	progress->descr = lv[2] & 0x7f; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'progress' */ | ||||
| int gsm48_encode_progress(struct msgb *msg, int lv_only, | ||||
| 			   const struct gsm_mncc_progress *p) | ||||
| { | ||||
| 	uint8_t lv[3]; | ||||
|  | ||||
| 	lv[0] = 2; | ||||
| 	lv[1] = 0x80 | ((p->coding & 0x3) << 5) | (p->location & 0xf); | ||||
| 	lv[2] = 0x80 | (p->descr & 0x7f); | ||||
| 	if (lv_only) | ||||
| 		msgb_lv_put(msg, lv[0], lv+1); | ||||
| 	else | ||||
| 		msgb_tlv_put(msg, GSM48_IE_PROGR_IND, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'user-user' */ | ||||
| int gsm48_decode_useruser(struct gsm_mncc_useruser *uu, | ||||
| 			   const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
| 	char *info = uu->info; | ||||
| 	int info_len = sizeof(uu->info); | ||||
| 	int i; | ||||
|  | ||||
| 	if (in_len < 1) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	uu->proto = lv[1]; | ||||
|  | ||||
| 	for (i = 2; i <= in_len; i++) { | ||||
| 		info_len--; | ||||
| 		if (info_len <= 1) | ||||
| 			break; | ||||
| 		*info++ = lv[i]; | ||||
| 	} | ||||
| 	if (info_len >= 1) | ||||
| 		*info++ = '\0'; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'useruser' */ | ||||
| int gsm48_encode_useruser(struct msgb *msg, int lv_only, | ||||
| 			   const struct gsm_mncc_useruser *uu) | ||||
| { | ||||
| 	uint8_t lv[GSM_MAX_USERUSER + 2]; | ||||
|  | ||||
| 	if (strlen(uu->info) > GSM_MAX_USERUSER) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	lv[0] = 1 + strlen(uu->info); | ||||
| 	lv[1] = uu->proto; | ||||
| 	memcpy(lv + 2, uu->info, strlen(uu->info)); | ||||
| 	if (lv_only) | ||||
| 		msgb_lv_put(msg, lv[0], lv+1); | ||||
| 	else | ||||
| 		msgb_tlv_put(msg, GSM48_IE_USER_USER, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'ss version' */ | ||||
| int gsm48_decode_ssversion(struct gsm_mncc_ssversion *ssv, | ||||
| 			    const uint8_t *lv) | ||||
| { | ||||
| 	uint8_t in_len = lv[0]; | ||||
|  | ||||
| 	if (in_len < 1 || in_len < sizeof(ssv->info)) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	memcpy(ssv->info, lv + 1, in_len); | ||||
| 	ssv->len = in_len; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* encode 'ss version' */ | ||||
| int gsm48_encode_ssversion(struct msgb *msg, | ||||
| 			   const struct gsm_mncc_ssversion *ssv) | ||||
| { | ||||
| 	uint8_t lv[GSM_MAX_SSVERSION + 1]; | ||||
|  | ||||
| 	if (ssv->len > GSM_MAX_SSVERSION) | ||||
| 		return -EINVAL; | ||||
|  | ||||
| 	lv[0] = ssv->len; | ||||
| 	memcpy(lv + 1, ssv->info, ssv->len); | ||||
| 	msgb_tlv_put(msg, GSM48_IE_SS_VERS, lv[0], lv+1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* decode 'more data' does not require a function, because it has no value */ | ||||
|  | ||||
| /* encode 'more data' */ | ||||
| int gsm48_encode_more(struct msgb *msg) | ||||
| { | ||||
| 	uint8_t *ie; | ||||
|  | ||||
| 	ie = msgb_put(msg, 1); | ||||
| 	ie[0] = GSM48_IE_MORE_DATA; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user