mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-10-31 12:03:50 +00:00 
			
		
		
		
	Compare commits
	
		
			487 Commits
		
	
	
		
			osmith/fix
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fcb4468de4 | ||
|  | 9e96b2df12 | ||
|  | 72952d854c | ||
|  | 637dce99ba | ||
|  | 641b07ab73 | ||
|  | 6eae31e39f | ||
|  | 4647015f69 | ||
|  | 239f95467c | ||
|  | cd80c73f37 | ||
|  | d6f1c4afbb | ||
|  | 0c8af75c94 | ||
|  | e4b33be6fc | ||
|  | cc7461cefc | ||
|  | e174061d17 | ||
|  | 6e1c3412ae | ||
|  | bff54b3e00 | ||
|  | e75eb4ca25 | ||
|  | 566737a4b8 | ||
|  | 2b7350240d | ||
|  | d76b53c00e | ||
|  | 9c9ef7796a | ||
|  | 49fcc8fc90 | ||
|  | 51a4bcc96a | ||
|  | d6238120dd | ||
|  | 7407aec921 | ||
|  | e575ce69ce | ||
|  | c1ca0ff091 | ||
|  | 661e68b78f | ||
|  | 376e146cfb | ||
|  | eb3ab2f85b | ||
|  | 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@ | libdir=@libdir@ | ||||||
| includedir=@includedir@ | includedir=@includedir@ | ||||||
| 
 | 
 | ||||||
| Name: Osmocom Media Gateway Control Protocol Client library | Name: Osmocom Core Library | ||||||
| Description: C Utility Library | Description: C Utility Library | ||||||
| Version: @VERSION@ | Version: @VERSION@ | ||||||
| Libs: -L${libdir} -losmo-mgcp-client | Libs: -L${libdir} -losmocore | ||||||
| Cflags: -I${includedir}/ | 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