mirror of
				https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
				synced 2025-10-31 12:03:50 +00:00 
			
		
		
		
	Compare commits
	
		
			453 Commits
		
	
	
		
			master
			...
			on-waves/0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 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 | 
							
								
								
									
										118
									
								
								.clang-format
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								.clang-format
									
									
									
									
									
								
							| @@ -1,118 +0,0 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0 | ||||
| # | ||||
| # clang-format configuration file. Intended for clang-format >= 4. | ||||
| # | ||||
| # For more information, see: | ||||
| # | ||||
| #   Documentation/process/clang-format.rst | ||||
| #   https://clang.llvm.org/docs/ClangFormat.html | ||||
| #   https://clang.llvm.org/docs/ClangFormatStyleOptions.html | ||||
| # | ||||
| --- | ||||
| AccessModifierOffset: -4 | ||||
| AlignAfterOpenBracket: Align | ||||
| AlignConsecutiveAssignments: false | ||||
| AlignConsecutiveDeclarations: false | ||||
| #AlignEscapedNewlines: Left # Unknown to clang-format-4.0 | ||||
| AlignOperands: true | ||||
| AlignTrailingComments: false | ||||
| AllowAllParametersOfDeclarationOnNextLine: false | ||||
| AllowShortBlocksOnASingleLine: false | ||||
| AllowShortCaseLabelsOnASingleLine: false | ||||
| AllowShortFunctionsOnASingleLine: None | ||||
| AllowShortIfStatementsOnASingleLine: false | ||||
| AllowShortLoopsOnASingleLine: false | ||||
| AlwaysBreakAfterDefinitionReturnType: None | ||||
| AlwaysBreakAfterReturnType: None | ||||
| AlwaysBreakBeforeMultilineStrings: false | ||||
| AlwaysBreakTemplateDeclarations: false | ||||
| BinPackArguments: true | ||||
| BinPackParameters: true | ||||
| BraceWrapping: | ||||
|   AfterClass: false | ||||
|   AfterControlStatement: false | ||||
|   AfterEnum: false | ||||
|   AfterFunction: true | ||||
|   AfterNamespace: true | ||||
|   AfterObjCDeclaration: false | ||||
|   AfterStruct: false | ||||
|   AfterUnion: false | ||||
|   #AfterExternBlock: false # Unknown to clang-format-5.0 | ||||
|   BeforeCatch: false | ||||
|   BeforeElse: false | ||||
|   IndentBraces: false | ||||
|   #SplitEmptyFunction: true # Unknown to clang-format-4.0 | ||||
|   #SplitEmptyRecord: true # Unknown to clang-format-4.0 | ||||
|   #SplitEmptyNamespace: true # Unknown to clang-format-4.0 | ||||
| BreakBeforeBinaryOperators: None | ||||
| BreakBeforeBraces: Custom | ||||
| #BreakBeforeInheritanceComma: false # Unknown to clang-format-4.0 | ||||
| BreakBeforeTernaryOperators: false | ||||
| BreakConstructorInitializersBeforeComma: false | ||||
| #BreakConstructorInitializers: BeforeComma # Unknown to clang-format-4.0 | ||||
| BreakAfterJavaFieldAnnotations: false | ||||
| BreakStringLiterals: false | ||||
| ColumnLimit: 120 | ||||
| CommentPragmas: '^ IWYU pragma:' | ||||
| #CompactNamespaces: false # Unknown to clang-format-4.0 | ||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||
| ConstructorInitializerIndentWidth: 8 | ||||
| ContinuationIndentWidth: 8 | ||||
| Cpp11BracedListStyle: false | ||||
| DerivePointerAlignment: false | ||||
| DisableFormat: false | ||||
| ExperimentalAutoDetectBinPacking: false | ||||
| #FixNamespaceComments: false # Unknown to clang-format-4.0 | ||||
|  | ||||
| #IncludeBlocks: Preserve # Unknown to clang-format-5.0 | ||||
| IncludeCategories: | ||||
|   - Regex: '.*' | ||||
|     Priority: 1 | ||||
| IncludeIsMainRegex: '(Test)?$' | ||||
| IndentCaseLabels: false | ||||
| #IndentPPDirectives: None # Unknown to clang-format-5.0 | ||||
| IndentWidth: 8 | ||||
| IndentWrappedFunctionNames: false | ||||
| JavaScriptQuotes: Leave | ||||
| JavaScriptWrapImports: true | ||||
| KeepEmptyLinesAtTheStartOfBlocks: false | ||||
| MacroBlockBegin: '' | ||||
| MacroBlockEnd: '' | ||||
| MaxEmptyLinesToKeep: 1 | ||||
| NamespaceIndentation: None | ||||
| #ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0 | ||||
| ObjCBlockIndentWidth: 8 | ||||
| ObjCSpaceAfterProperty: true | ||||
| ObjCSpaceBeforeProtocolList: true | ||||
|  | ||||
| # Taken from git's rules | ||||
| #PenaltyBreakAssignment: 10 # Unknown to clang-format-4.0 | ||||
| PenaltyBreakBeforeFirstCallParameter: 30 | ||||
| PenaltyBreakComment: 10 | ||||
| PenaltyBreakFirstLessLess: 0 | ||||
| PenaltyBreakString: 10 | ||||
| PenaltyExcessCharacter: 100 | ||||
| PenaltyReturnTypeOnItsOwnLine: 60 | ||||
|  | ||||
| PointerAlignment: Right | ||||
| ReflowComments: false | ||||
| SortIncludes: false | ||||
| #SortUsingDeclarations: false # Unknown to clang-format-4.0 | ||||
| SpaceAfterCStyleCast: false | ||||
| SpaceAfterTemplateKeyword: true | ||||
| SpaceBeforeAssignmentOperators: true | ||||
| #SpaceBeforeCtorInitializerColon: true # Unknown to clang-format-5.0 | ||||
| #SpaceBeforeInheritanceColon: true # Unknown to clang-format-5.0 | ||||
| SpaceBeforeParens: ControlStatements | ||||
| #SpaceBeforeRangeBasedForLoopColon: true # Unknown to clang-format-5.0 | ||||
| SpaceInEmptyParentheses: false | ||||
| SpacesBeforeTrailingComments: 1 | ||||
| SpacesInAngles: false | ||||
| SpacesInContainerLiterals: false | ||||
| SpacesInCStyleCastParentheses: false | ||||
| SpacesInParentheses: false | ||||
| SpacesInSquareBrackets: false | ||||
| Standard: Cpp03 | ||||
| TabWidth: 8 | ||||
| UseTab: Always | ||||
| ... | ||||
							
								
								
									
										73
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,73 +0,0 @@ | ||||
| debian/*.log | ||||
| *.o | ||||
| *.lo | ||||
| *.a | ||||
| *.la | ||||
| .deps | ||||
| Makefile | ||||
| Makefile.in | ||||
| bscconfig.h | ||||
| bscconfig.h.in | ||||
| include/osmocom/mgcp_client/mgcp_common.h | ||||
| include/osmocom/mgcp_client/version.h | ||||
| src/osmo-mgw/osmo-mgw | ||||
| *.*~ | ||||
| *.sw? | ||||
| .libs | ||||
| *.pyc | ||||
| *.gcda | ||||
| *.gcno | ||||
| *.pc | ||||
| *~ | ||||
|  | ||||
| #configure | ||||
| aclocal.m4 | ||||
| autom4te.cache/ | ||||
| config.log | ||||
| config.status | ||||
| config.guess | ||||
| config.sub | ||||
| configure | ||||
| compile | ||||
| depcomp | ||||
| install-sh | ||||
| missing | ||||
| stamp-h1 | ||||
| libtool | ||||
| ltmain.sh | ||||
| m4/*.m4 | ||||
|  | ||||
| # git-version-gen magic | ||||
| .tarball-version | ||||
| .version | ||||
|  | ||||
|  | ||||
| #tests | ||||
| tests/testsuite.dir | ||||
| tests/*/*_test | ||||
|  | ||||
| tests/atconfig | ||||
| tests/atlocal | ||||
| tests/package.m4 | ||||
| tests/testsuite | ||||
| tests/testsuite.log | ||||
|  | ||||
| writtenconfig/ | ||||
|  | ||||
| # manuals | ||||
| doc/manuals/*.html | ||||
| doc/manuals/*.svg | ||||
| doc/manuals/*.pdf | ||||
| doc/manuals/*__*.png | ||||
| doc/manuals/*.check | ||||
| doc/manuals/generated/ | ||||
| doc/manuals/osmomsc-usermanual.xml | ||||
| doc/manuals/common | ||||
| doc/manuals/build | ||||
|  | ||||
| contrib/osmo-mgw.spec | ||||
|  | ||||
| #vs code | ||||
| .cache | ||||
| .vscode | ||||
|  | ||||
| @@ -1,3 +0,0 @@ | ||||
| [gerrit] | ||||
| host=gerrit.osmocom.org | ||||
| project=osmo-mgw | ||||
							
								
								
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								.mailmap
									
									
									
									
									
								
							| @@ -1,12 +0,0 @@ | ||||
| Harald Welte <laforge@gnumonks.org> | ||||
| Harald Welte <laforge@gnumonks.org> <laflocal@hanuman.gnumonks.org> | ||||
| Harald Welte <laforge@gnumonks.org> <laflocal@goeller.de.gnumonks.org> | ||||
| Holger Hans Peter Freyther <holger@moiji-mobile.com> <zecke@selfish.org> | ||||
| Holger Hans Peter Freyther <holger@moiji-mobile.com> <ich@tamarin.(none)> | ||||
| Holger Hans Peter Freyther <holgre@moiji-mobile.com> <holger@freyther.de> | ||||
| Andreas Eversberg <jolly@eversberg.eu> | ||||
| Andreas Eversberg <jolly@eversberg.eu> <Andreas.Eversberg@versatel.de> | ||||
| Andreas Eversberg <jolly@eversberg.eu> <root@nuedel.(none)> | ||||
| Pablo Neira Ayuso <pablo@soleta.eu> <pablo@gnumonks.org> | ||||
| Max Suraev <msuraev@sysmocom.de> | ||||
| Tom Tsou <tom.tsou@ettus.com> <tom@tsou.cc> | ||||
							
								
								
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,41 +0,0 @@ | ||||
| AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6 | ||||
|  | ||||
| ## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac | ||||
| ## remove line below when OE toolchain is updated to version which include those | ||||
| ACLOCAL_AMFLAGS = -I m4 | ||||
| AM_CPPFLAGS = \ | ||||
| 	$(all_includes) \ | ||||
| 	-I$(top_srcdir)/include \ | ||||
| 	$(NULL) | ||||
|  | ||||
| SUBDIRS = \ | ||||
| 	include \ | ||||
| 	src \ | ||||
| 	tests \ | ||||
| 	doc \ | ||||
| 	contrib \ | ||||
| 	$(NULL) | ||||
|  | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = \ | ||||
| 	libosmo-mgcp-client.pc \ | ||||
| 	$(NULL) | ||||
|  | ||||
| BUILT_SOURCES = $(top_srcdir)/.version | ||||
| EXTRA_DIST = \ | ||||
| 	     .version \ | ||||
| 	     README.md \ | ||||
| 	     debian \ | ||||
| 	     git-version-gen \ | ||||
| 	     osmoappdesc.py \ | ||||
| 	     $(NULL) | ||||
|  | ||||
| AM_DISTCHECK_CONFIGURE_FLAGS = \ | ||||
| 	--with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir) | ||||
|  | ||||
| @RELMAKE@ | ||||
|  | ||||
| $(top_srcdir)/.version: | ||||
| 	echo $(VERSION) > $@-t && mv $@-t $@ | ||||
| dist-hook: | ||||
| 	echo $(VERSION) > $(distdir)/.tarball-version | ||||
							
								
								
									
										102
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,102 +0,0 @@ | ||||
| osmo-mgw - Osmocom MGW (Media GateWay) Implementation | ||||
| ===================================================== | ||||
|  | ||||
| This repository contains a C-language implementation of an MGW (Media | ||||
| GateWay) for use [not only] within the 2G (GSM) and/or 3G (UMTS) | ||||
| Cellular Network built using Osmocom CNI (Cellular Network | ||||
| Infrastructure) software. | ||||
|  | ||||
| The OsmoMGW program provides an MGCP interface towards an MGCP call agent | ||||
| (client) like OsmoMSC and OsmoBSC, and receives and sends RTP streams as | ||||
| configured via the MGCP control plane. | ||||
|  | ||||
| This Media Gateway implementation is capable of | ||||
|  | ||||
| * streaming RTP for 2G (3GPP AoIP and Abis-over-IP) | ||||
| * streaming RTP for 3G (IuCS including the IuFP protocol) | ||||
| * TDM (E1/T1) based Abis interface with TRAU frames on 16k sub-slots | ||||
| * basic support for LCLS (Local Call, Local Switch) related features | ||||
| * various built-in translation capabilities | ||||
|   * between Abis TRAU frames and RTP formats | ||||
|   * between 2G AMR/RTP and 3G AMR/IuFP/RTP | ||||
|   * between bandwidth-efficient and octet-aligned AMR | ||||
|   * between different standards for encapsulating GSM HR codec frames in RTP | ||||
|  | ||||
| osmo-mgw is typically co-located with | ||||
|  | ||||
|  * osmo-bsc (GSM BSC) | ||||
|  * osmo-msc (GSM/UMTS MSC) | ||||
|  * osmo-hnbgw (UMTS HNBGW); osmo-mgw implements RTP relay between Iuh | ||||
|    and IuCS interfaces | ||||
|  | ||||
| The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC | ||||
| (found in osmo-msc.git) to instruct OsmoMGW via its MGCP service. | ||||
|  | ||||
| Homepage | ||||
| -------- | ||||
|  | ||||
| You can find the OsmoMGW issue tracker and wiki online at | ||||
| <https://osmocom.org/projects/osmo-mgw> and <https://osmocom.org/projects/osmo-mgw/wiki>. | ||||
|  | ||||
|  | ||||
| GIT Repository | ||||
| -------------- | ||||
|  | ||||
| You can clone from the official osmo-mgw.git repository using | ||||
|  | ||||
|         git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw | ||||
|  | ||||
| There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw> | ||||
|  | ||||
|  | ||||
| Documentation | ||||
| ------------- | ||||
|  | ||||
| User Manuals and VTY reference manuals are [optionally] built in PDF form | ||||
| as part of the build process. | ||||
|  | ||||
| Pre-rendered PDF version of the current "master" can be found at | ||||
| [User Manual](https://ftp.osmocom.org/docs/latest/osmomgw-usermanual.pdf) | ||||
| as well as the [VTY Reference Manual](https://ftp.osmocom.org/docs/latest/osmomgw-vty-reference.pdf) | ||||
|  | ||||
|  | ||||
| Mailing List | ||||
| ------------ | ||||
|  | ||||
| Discussions related to osmo-mgw are happening on the | ||||
| openbsc@lists.osmocom.org mailing list, please see | ||||
| <https://lists.osmocom.org/mailman/listinfo/openbsc> for subscription | ||||
| options and the list archive. | ||||
|  | ||||
| Please observe the [Osmocom Mailing List | ||||
| Rules](https://osmocom.org/projects/cellular-infrastructure/wiki/Mailing_List_Rules) | ||||
| when posting. | ||||
|  | ||||
|  | ||||
| Contributing | ||||
| ------------ | ||||
|  | ||||
| Our coding standards are described at | ||||
| <https://osmocom.org/projects/cellular-infrastructure/wiki/Coding_standards> | ||||
|  | ||||
| We use a gerrit based patch submission/review process for managing | ||||
| contributions.  Please see | ||||
| <https://osmocom.org/projects/cellular-infrastructure/wiki/Gerrit> for | ||||
| more details | ||||
|  | ||||
| The current patch queue for osmo-mgw can be seen at | ||||
| <https://gerrit.osmocom.org/#/q/project:osmo-mgw+status:open> | ||||
|  | ||||
|  | ||||
| History | ||||
| ------- | ||||
|  | ||||
| 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. | ||||
| @@ -1,11 +0,0 @@ | ||||
| To run the configuration parsing and output (VTY) test suite, first install | ||||
|  | ||||
|   https://gitea.osmocom.org/cellular-infrastructure/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 | ||||
							
								
								
									
										12
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,12 +0,0 @@ | ||||
| # When cleaning up this file: bump API version in corresponding Makefile.am and rename corresponding debian/lib*.install | ||||
| # according to https://osmocom.org/projects/cellular-infrastructure/wiki/Make_a_new_release | ||||
| # In short: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info | ||||
| # LIBVERSION=c:r:a | ||||
| # If the library source code has changed at all since the last update, then increment revision: c:r + 1:a. | ||||
| # If any interfaces have been added, removed, or changed since the last update: c + 1:0:a. | ||||
| # If any interfaces have been added since the last public release: c:r:a + 1. | ||||
| # If any interfaces have been removed or changed since the last public release: c:r:0. | ||||
| #library	what			description / commit summary line | ||||
| libosmocore		bump_dep; workaround	Bump libosmocore version dependency after I68328adb952ca8833ba047cb3b49ccc6f8a1f1b5 | ||||
| 						has been merged to libosmocore.git; then remove my_msgb_copy_c wrapper function. | ||||
| libosmocodec		bump_dep		We depend on the additions of I2c510ac62a0786c137115c45eee7a48b9736265f | ||||
							
								
								
									
										208
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										208
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,208 +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) | ||||
|  | ||||
| CFLAGS="$CFLAGS -std=gnu11" | ||||
|  | ||||
| dnl kernel style compile messages | ||||
| m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||||
|  | ||||
| dnl include release helper | ||||
| RELMAKE='-include osmo-release.mk' | ||||
| AC_SUBST([RELMAKE]) | ||||
|  | ||||
| dnl checks for programs | ||||
| AC_PROG_MAKE_SET | ||||
| AC_PROG_CC | ||||
| AC_PROG_INSTALL | ||||
| LT_INIT | ||||
|  | ||||
| dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang | ||||
| AS_CASE(["$LD"],[*clang*], | ||||
|   [AS_CASE(["${host_os}"], | ||||
|      [*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])]) | ||||
|  | ||||
| dnl check for pkg-config (explained in detail in libosmocore/configure.ac) | ||||
| AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no) | ||||
| if test "x$PKG_CONFIG_INSTALLED" = "xno"; then | ||||
|         AC_MSG_WARN([You need to install pkg-config]) | ||||
| fi | ||||
| PKG_PROG_PKG_CONFIG([0.20]) | ||||
|  | ||||
| dnl checks for libraries | ||||
| AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""]) | ||||
| AC_SUBST(LIBRARY_DL) | ||||
|  | ||||
| AC_SEARCH_LIBS([dlsym], [dl dld], [LIBRARY_DLSYM="$LIBS";LIBS=""]) | ||||
| AC_SUBST(LIBRARY_DLSYM) | ||||
|  | ||||
|  | ||||
| PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.11.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOCODEC, libosmocodec >= 1.11.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.11.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.11.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.11.0) | ||||
| PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.6.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 2.0.0) | ||||
| PKG_CHECK_MODULES(LIBOSMOTRAU, libosmotrau >= 2.0.0) | ||||
|  | ||||
| CFLAGS="$CFLAGS -DBUILDING_LIBOSMOMGCPCLIENT -pthread" | ||||
| CPPFLAGS="$CPPFLAGS -DBUILDING_LIBOSMOMGCPCLIENT -pthread" | ||||
| LDFLAGS="$LDFLAGS -pthread" | ||||
|  | ||||
| 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+=" -Werror=implicit-int -Werror=int-conversion -Werror=old-style-definition" | ||||
| 	WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations" | ||||
| 	WERROR_FLAGS+=" -Wno-error=cpp" # "#warning" | ||||
| 	CFLAGS="$CFLAGS $WERROR_FLAGS" | ||||
| 	CPPFLAGS="$CPPFLAGS $WERROR_FLAGS" | ||||
| fi | ||||
|  | ||||
| # 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 https://gitea.osmocom.org/cellular-infrastructure/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 | ||||
							
								
								
									
										274
									
								
								contrib/ipa.py
									
									
									
									
									
								
							
							
						
						
									
										274
									
								
								contrib/ipa.py
									
									
									
									
									
								
							| @@ -1,274 +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. | ||||
|  */ | ||||
| """ | ||||
|  | ||||
| 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,66 +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 "" --disable-doxygen | ||||
|  | ||||
| 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-netif "" --disable-doxygen | ||||
| osmo-build-dep.sh libosmo-abis | ||||
|  | ||||
| # Additional configure options and depends | ||||
| CONFIG="" | ||||
| if [ "$WITH_MANUALS" = "1" ]; then | ||||
| 	CONFIG="--enable-manuals" | ||||
| fi | ||||
|  | ||||
| set +x | ||||
| echo | ||||
| echo | ||||
| echo | ||||
| echo " =============================== osmo-mgw ===============================" | ||||
| echo | ||||
| set -x | ||||
|  | ||||
| cd "$base" | ||||
| autoreconf --install --force | ||||
| ./configure --enable-sanitize --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 $PARALLEL_MAKE distcheck \ | ||||
|   || cat-testlogs.sh | ||||
|  | ||||
| if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then | ||||
| 	make -C "$base/doc/manuals" publish | ||||
| fi | ||||
|  | ||||
| $MAKE $PARALLEL_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,24 +0,0 @@ | ||||
| [Unit] | ||||
| Description=Osmocom Media Gateway (MGW) | ||||
| After=network-online.target | ||||
| Wants=network-online.target | ||||
|  | ||||
| [Service] | ||||
| Type=simple | ||||
| LimitNOFILE=65536 | ||||
| StateDirectory=osmocom | ||||
| WorkingDirectory=%S/osmocom | ||||
| Restart=always | ||||
| User=osmocom | ||||
| Group=osmocom | ||||
| ExecStart=/usr/bin/osmo-mgw -s -c /etc/osmocom/osmo-mgw.cfg | ||||
| RestartSec=2 | ||||
| AmbientCapabilities=CAP_SYS_NICE | ||||
| # CPU scheduling policy: | ||||
| CPUSchedulingPolicy=rr | ||||
| # For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority): | ||||
| CPUSchedulingPriority=1 | ||||
| # See sched(7) for further details on real-time policies and priorities | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
							
								
								
									
										1155
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1155
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| 10 | ||||
							
								
								
									
										46
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							| @@ -1,46 +0,0 @@ | ||||
| Source: osmo-mgw | ||||
| Section: net | ||||
| Priority: extra | ||||
| Maintainer: Osmocom team <openbsc@lists.osmocom.org> | ||||
| Build-Depends: debhelper (>= 10), | ||||
|                dh-autoreconf, | ||||
|                pkg-config, | ||||
|                autotools-dev, | ||||
|                libosmocore-dev (>= 1.11.0), | ||||
|                libosmo-netif-dev (>= 1.6.0), | ||||
|                libosmo-abis-dev (>= 2.0.0), | ||||
|                osmo-gsm-manuals-dev (>= 1.6.0) | ||||
| Standards-Version: 3.9.8 | ||||
| Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw | ||||
| Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/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-client14 | ||||
| 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-client14 (= ${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: https://gitea.osmocom.org/cellular-infrastructure/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.f.m.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.f.m.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-client14.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/libosmo-mgcp-client14.install
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| usr/lib/*/libosmo-mgcp-client.so.* | ||||
							
								
								
									
										1
									
								
								debian/osmo-mgw-doc.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/osmo-mgw-doc.install
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| usr/share/doc/osmo-mgw-doc/*.pdf | ||||
							
								
								
									
										5
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								debian/osmo-mgw.install
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +0,0 @@ | ||||
| etc/osmocom/osmo-mgw.cfg | ||||
| lib/systemd/system/osmo-mgw.service | ||||
| usr/bin/osmo-mgw | ||||
| usr/share/doc/osmo-mgw/examples/osmo-mgw/osmo-mgw.cfg | ||||
| usr/share/doc/osmo-mgw/examples/osmo-mgw/osmo-mgw-abis_e1.cfg | ||||
							
								
								
									
										38
									
								
								debian/postinst
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								debian/postinst
									
									
									
									
										vendored
									
									
								
							| @@ -1,38 +0,0 @@ | ||||
| #!/bin/sh -e | ||||
| case "$1" in | ||||
| 	configure) | ||||
| 		# Create the osmocom group and user (if it doesn't exist yet) | ||||
| 		if ! getent group osmocom >/dev/null; then | ||||
| 			groupadd --system osmocom | ||||
| 		fi | ||||
| 		if ! getent passwd osmocom >/dev/null; then | ||||
| 			useradd \ | ||||
| 				--system \ | ||||
| 				--gid osmocom \ | ||||
| 				--home-dir /var/lib/osmocom \ | ||||
| 				--shell /sbin/nologin \ | ||||
| 				--comment "Open Source Mobile Communications" \ | ||||
| 				osmocom | ||||
| 		fi | ||||
|  | ||||
| 		# Fix permissions of previous (root-owned) install (OS#4107) | ||||
| 		if dpkg --compare-versions "$2" le "1.13.0"; then | ||||
| 			if [ -e /etc/osmocom/osmo-mgw.cfg ]; then | ||||
| 				chown -v osmocom:osmocom /etc/osmocom/osmo-mgw.cfg | ||||
| 				chmod -v 0660 /etc/osmocom/osmo-mgw.cfg | ||||
| 			fi | ||||
|  | ||||
| 			if [ -d /etc/osmocom ]; then | ||||
| 				chown -v root:osmocom /etc/osmocom | ||||
| 				chmod -v 2775 /etc/osmocom | ||||
| 			fi | ||||
|  | ||||
| 			mkdir -p /var/lib/osmocom | ||||
| 			chown -R -v osmocom:osmocom /var/lib/osmocom | ||||
| 		fi | ||||
| 		;; | ||||
| esac | ||||
|  | ||||
| # dh_installdeb(1) will replace this with shell code automatically | ||||
| # generated by other debhelper scripts. | ||||
| #DEBHELPER# | ||||
							
								
								
									
										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,30 +0,0 @@ | ||||
| ! | ||||
| ! MGCP configuration example | ||||
| ! | ||||
| log stderr | ||||
|  logging color 1 | ||||
|  logging print category-hex 0 | ||||
|  logging print category 1 | ||||
|  logging timestamp 0 | ||||
|  logging print file basename last | ||||
|  logging print level 1 | ||||
|  | ||||
| e1_input | ||||
|  e1_line 0 driver dahdi | ||||
|  e1_line 0 port 0 | ||||
| mgcp | ||||
|   bind ip 127.0.0.1 | ||||
|   rtp port-range 4002 16001 | ||||
|   rtp bind-ip 127.0.0.1 | ||||
|   rtp ip-probing | ||||
|   rtp ip-dscp 46 | ||||
|   bind port 2427 | ||||
|   number endpoints 512 | ||||
|   force-realloc 1 | ||||
|   rtcp-omit | ||||
|   rtp-patch ssrc | ||||
|   rtp-patch timestamp | ||||
|   trunk 1 | ||||
|    rtp keep-alive once | ||||
|    no rtp keep-alive | ||||
|    line 0 | ||||
| @@ -1,23 +0,0 @@ | ||||
| ! | ||||
| ! MGCP configuration example | ||||
| ! | ||||
| log stderr | ||||
|  logging color 1 | ||||
|  logging print category-hex 0 | ||||
|  logging print category 1 | ||||
|  logging timestamp 0 | ||||
|  logging print file basename last | ||||
|  logging print level 1 | ||||
|  | ||||
| mgcp | ||||
|   bind ip 127.0.0.1 | ||||
|   rtp port-range 4002 16001 | ||||
|   rtp bind-ip 127.0.0.1 | ||||
|   rtp ip-probing | ||||
|   rtp ip-dscp 46 | ||||
|   bind port 2427 | ||||
|   number endpoints 512 | ||||
|   force-realloc 1 | ||||
|   rtcp-omit | ||||
|   rtp-patch ssrc | ||||
|   rtp-patch timestamp | ||||
| @@ -1,23 +0,0 @@ | ||||
| EXTRA_DIST = osmomgw-usermanual.adoc \ | ||||
|     osmomgw-usermanual-docinfo.xml \ | ||||
|     osmomgw-vty-reference.xml \ | ||||
|     regen_doc.sh \ | ||||
|     chapters \ | ||||
|     vty | ||||
|  | ||||
| if BUILD_MANUALS | ||||
|   ASCIIDOC = osmomgw-usermanual.adoc | ||||
|   ASCIIDOC_DEPS = $(srcdir)/chapters/*.adoc | ||||
|   include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc | ||||
|  | ||||
|   VTY_REFERENCE = osmomgw-vty-reference.xml | ||||
|   include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc | ||||
|  | ||||
|   BUILT_REFERENCE_XML = $(builddir)/vty/mgw_vty_reference.xml | ||||
|   $(builddir)/vty/mgw_vty_reference.xml: $(top_builddir)/src/osmo-mgw/osmo-mgw | ||||
| 	mkdir -p $(builddir)/vty | ||||
| 	$(top_builddir)/src/osmo-mgw/osmo-mgw --vty-ref-xml > $@ | ||||
|  | ||||
|   OSMO_REPOSITORY = osmo-mgw | ||||
|   include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc | ||||
| endif | ||||
| @@ -1,129 +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 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. | ||||
|  | ||||
| .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 | ||||
|  | ||||
| NOTE: Changes to trunks that affect resource allocation, such as newly created | ||||
| trunks or a change of the number of available endpoints, require a full restart | ||||
| of osmo-mgw! | ||||
|  | ||||
| === E1 trunk considerations | ||||
|  | ||||
| While the RTP bridge trunks are natively based on IP no special considerations | ||||
| are required during setup. E1 trunks are mapped on a physical E1 line, which has | ||||
| to be configured as shown below. | ||||
|  | ||||
| .Example: E1 line setup | ||||
| ---- | ||||
| OsmoMGW(config-e1_input)# e1_line 0 driver dahdi <1> | ||||
| OsmoMGW(config-e1_input)# e1_line 0 port 2 <2> | ||||
| ---- | ||||
| <1> Name of the libosmo-abis driver implementation ("dahdi") | ||||
| <2> Port number of the physical E1 port to use (2) | ||||
|  | ||||
| In osmo-mgw the e1_input node is used to configure the physical E1 line. The | ||||
| line number will be used internally to identify the configured E1 line. The | ||||
| port number is the physical E1 connector (sometimes called 'span') at the E1 | ||||
| hardware. Per trunk an individual E1 line will be needed. Beware that the E1 | ||||
| driver may also need configuration settings that are not discussed here. | ||||
|  | ||||
| .Example: E1 trunk setup | ||||
| ---- | ||||
| OsmoMGW(config-mgcp)# trunk 0 <1> | ||||
| OsmoMGW(config-mgcp-trunk)# line 0 <2> | ||||
| ---- | ||||
| <1> Creation of a trunk (0) | ||||
| <2> Reference to the E1 line to use (0) | ||||
|  | ||||
| The E1 trunk is created along with a number, typically starting at 0, but if | ||||
| required any number from 0-64 is allowed. The E1 trunk configuration concerning | ||||
| the IP related aspects is nearly identical to the configuration of the virtual | ||||
| trunk. However, it is important that the user assigns one of the E1 line numbers | ||||
| that were configured under the e1_input node. | ||||
|  | ||||
| NOTE: The endpoint name that is used on MGCP level will include the trunk number, | ||||
| not the E1 line number. For simplicity (and compatibility with OsmoBSC) it is | ||||
| recommended to use equal numbers for trunk and E1 line. However, if required any | ||||
| E1 line can be mapped flexible on any trunk as long as the mapping is bijective. | ||||
|  | ||||
| .Example: A typical configuration with one E1 trunk | ||||
| ---- | ||||
| e1_input | ||||
|  e1_line 0 driver dahdi | ||||
|  e1_line 0 port 2 | ||||
| mgcp | ||||
|  bind ip 127.0.0.1 | ||||
|  rtp net-range 6000 6011 | ||||
|  rtp net-bind-ip 192.168.100.130 | ||||
|  rtp ip-probing | ||||
|  rtp ip-dscp 46 | ||||
|  no rtp keep-alive | ||||
|  bind port 2428 | ||||
|  number endpoints 30 | ||||
|  loop 0 | ||||
|  force-realloc 1 | ||||
|  osmux off | ||||
|  rtp-patch rfc5993hr | ||||
|  trunk 0 | ||||
|   rtp keep-alive once | ||||
|   no rtp keep-alive | ||||
|   line 0 | ||||
| ---- | ||||
|  | ||||
| NOTE: One E1 trunk always covers a whole E1 line. All subslots (I.640) will be mapped | ||||
| to individual MGCP endpoints. As long as the endpoints remain unused the | ||||
| underlying E1 timeslot is not used. | ||||
|  | ||||
| NOTE: The E1 trunk implementation also works with T1 lines, however since T1 has | ||||
| 24 instead of 31 usable timeslots only the endpoints that fall into that 1-24 timeslot | ||||
| range will be useable. | ||||
| @@ -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,100 +0,0 @@ | ||||
| == MGCP Endpoints | ||||
|  | ||||
| MGCP organizes the switching resources in so called endpoints. Each endpoint is | ||||
| referenced by its unique identifier. While RFC 3435 specifies a naming scheme, the | ||||
| actual identifier naming is subject to the implementation and configuration. | ||||
|  | ||||
| === RTP proxy / RTP bridge endpoints | ||||
|  | ||||
| OsmoMGW implements a freely configurable number of `rtpbridge` endpoints. Those | ||||
| endpoints are able to host two connections at a time to model the functionality | ||||
| of a tandem switch. | ||||
|  | ||||
| RTP bridge endpoint identifiers are referenced by the string `rtpbridge/`, a | ||||
| hexadecimal number without leading zeros and a domain name (configurable). | ||||
|  | ||||
| ---- | ||||
| rtpbridge/<number>@<domain> | ||||
| ---- | ||||
|  | ||||
| .Example: List of virtual endpoints | ||||
| ---- | ||||
| rtpbridge/1@mgw | ||||
| rtpbridge/2@mgw | ||||
| rtpbridge/3@mgw | ||||
| rtpbridge/4@mgw | ||||
| rtpbridge/5@mgw | ||||
| rtpbridge/6@mgw | ||||
| rtpbridge/7@mgw | ||||
| rtpbridge/8@mgw | ||||
| rtpbridge/9@mgw | ||||
| rtpbridge/a@mgw | ||||
| rtpbridge/b@mgw | ||||
| rtpbridge/c@mgw | ||||
| rtpbridge/d@mgw | ||||
| rtpbridge/e@mgw | ||||
| rtpbridge/f@mgw | ||||
| rtpbridge/10@mgw | ||||
| ---- | ||||
|  | ||||
| === E1/T1 endpoints | ||||
|  | ||||
| OsmoMGW supports E1 subslot multiplexing as specified by I.460. All possible | ||||
| subslot combinations are mapped on individual endpoints. The endpoint names | ||||
| are prefixed with `ds/e1-` followed by the trunk number and the E1 timeslot. | ||||
| The subslot is defined by a bit rate and a bit offset. | ||||
|  | ||||
| ---- | ||||
| ds/e1-<trunk>/s-<timeslot>/su<bitrate>-<bitoffset>@<domain> | ||||
| ---- | ||||
|  | ||||
| .Example: List of endpoints on E1 trunk 0 at E1 timeslot 2 | ||||
| ---- | ||||
| ds/e1-0/s-2/su64-0@mgw | ||||
| ds/e1-0/s-2/su32-0@mgw | ||||
| ds/e1-0/s-2/su32-4@mgw | ||||
| ds/e1-0/s-2/su16-0@mgw | ||||
| ds/e1-0/s-2/su16-2@mgw | ||||
| ds/e1-0/s-2/su16-4@mgw | ||||
| ds/e1-0/s-2/su16-6@mgw | ||||
| ds/e1-0/s-2/su8-0@mgw | ||||
| ds/e1-0/s-2/su8-1@mgw | ||||
| ds/e1-0/s-2/su8-2@mgw | ||||
| ds/e1-0/s-2/su8-3@mgw | ||||
| ds/e1-0/s-2/su8-4@mgw | ||||
| ds/e1-0/s-2/su8-5@mgw | ||||
| ds/e1-0/s-2/su8-6@mgw | ||||
| ds/e1-0/s-2/su8-7@mgw | ||||
| ---- | ||||
|  | ||||
| When creating connections on endpoints that reside in one E1 timeslot the call | ||||
| agent must make sure that no overlapping endpoints are used. It is for example | ||||
| not possible to use `ds/e1-0/s-2/su16-2@mgw` and `ds/e1-0/s-2/su8-3@mgw` at the | ||||
| same time because they overlap. | ||||
|  | ||||
| .Subslot overlapping | ||||
| [options="header"] | ||||
| |=== | ||||
| | Bit offset  4+| Subslots | ||||
| | 0 | 8k .2+| 16k .4+| 32k .8+| 64k | ||||
| | 1 | 8k | ||||
| | 2 | 8k .2+| 16k | ||||
| | 3 | 8k | ||||
| | 4 | 8k .2+| 16k .4+| 32k | ||||
| | 5 | 8k | ||||
| | 6 | 8k .2+| 16k | ||||
| | 7 | 8k | ||||
| |=== | ||||
|  | ||||
| NOTE: The current implementation (December 2020) only implements TRAU frame | ||||
| encoding/decoding for 16K and 8K subslots. Endpoints with other bitrates are | ||||
| not yet useable. | ||||
|  | ||||
| NOTE: the VTY command "show mgcp" can be used to get a list of all available | ||||
| endpoints (including identifiers) | ||||
|  | ||||
| === The `null` endpoint | ||||
|  | ||||
| OsmoMGW offers a special `null@<domain>` endpoint which can be audited at all times. | ||||
| This is useful for MGCP clients who wish to submit requests to OsmoMGW | ||||
| periodically to find out whether it is still reachable and in a working state. | ||||
| @@ -1,154 +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>> | ||||
|  | ||||
| === Non-standard SDP codec parameters | ||||
|  | ||||
| CRCX command message normally includes an SDP block that specifies the RTP | ||||
| address of the connecting peer and the list of codecs accepted by that entity. | ||||
| Codec specifications may include optional parameters given via `a=fmtp` lines; | ||||
| one well-known parameter is `octet-align`, defined for AMR and AMR-WB codecs. | ||||
|  | ||||
| In addition to standard (RFC-defined) codec parameters (of which the | ||||
| just-mentioned `octet-align` parameter is the only one implemented so far), | ||||
| OsmoMGW also understands some non-standard (Osmocom-private) codec parameters | ||||
| as listed below. | ||||
| These Osmocom-private codec parameters are meaningful only in the context | ||||
| of OsmoBSC driving an E1 Abis MGW, which may be either OsmoMGW or a specialized | ||||
| third-party replacement. | ||||
|  | ||||
| The MGCP extension described in this section is meaningful only for E1 | ||||
| endpoints - it has absolutely no effect on `rtpbridge` endpoints! | ||||
|  | ||||
| ==== `tw-ts-001` parameter for FR and EFR codecs | ||||
|  | ||||
| GSM Full Rate codec is known in SDP as `GSM`; GSM Enhanced Full Rate codec | ||||
| is known in SDP as `GSM-EFR`. | ||||
| When either codec is to be transported in RTP, there is a choice between | ||||
| two different payload formats: RFC 3551 or TW-TS-001. | ||||
| RFC 3551 is the standard in non-GSM Internet applications, and it is the | ||||
| format specified in later 3GPP releases for IP-based transport of | ||||
| compressed speech - however, it exhibits functional regressions compared | ||||
| to the original TRAU-UL frame format of GSM 08.60. | ||||
| TW-TS-001 is an enhanced alternative payload format for the same codecs | ||||
| that restores the original functionality and semantics of TRAU-UL frames. | ||||
|  | ||||
| In the context of CRCX or MDCX command messages from OsmoBSC to an E1 Abis MGW, | ||||
| `tw-ts-001` codec parameter (attached to either `GSM` or `GSM-EFR` codec) | ||||
| instructs the MGW whether or not it should emit the extended payload format | ||||
| of TW-TS-001 for GSM uplink traffic converted to RTP. | ||||
| In the absence of this parameter, IETF-standard and 3GPP-standard RFC 3551 | ||||
| format is emitted; if TW-TS-001 output is desired, please specify | ||||
| `tw-ts-001=1` on the appropriate `a=fmtp` line. | ||||
|  | ||||
| .Example: `CRCX` message requesting EFR codec with TW-TS-001 extensions | ||||
| ---- | ||||
| CRCX 2 ds/e1-0/s-2/su16-2@mgw MGCP 1.0 | ||||
| M: recvonly | ||||
| C: 2 | ||||
| L: p:20 | ||||
|  | ||||
| v=0 | ||||
| c=IN IP4 123.12.12.123 | ||||
| m=audio 1234 RTP/AVP 110 | ||||
| a=rtpmap:110 GSM-EFR/8000/1 | ||||
| a=fmtp:110 tw-ts-001=1 | ||||
| ---- | ||||
|  | ||||
| ==== `tw-ts-002` parameter for HR codec | ||||
|  | ||||
| GSM Half Rate codec is known in SDP as `GSM-HR-08`. | ||||
| The same dichotomy that exists between RFC 3551 and TW-TS-001 RTP payload | ||||
| formats for FR and EFR codecs also exists for HR codec, except that | ||||
| the two opposing alternatives are now RFC 5993 and TW-TS-002. | ||||
|  | ||||
| In the context of CRCX or MDCX command messages from OsmoBSC to an E1 Abis MGW, | ||||
| `tw-ts-002` codec parameter (attached to `GSM-HR-08` codec) | ||||
| instructs the MGW whether or not it should emit the extended payload format | ||||
| of TW-TS-002 for GSM uplink traffic converted to RTP. | ||||
| In the absence of this parameter, IETF-standard and 3GPP-standard RFC 5993 | ||||
| format is emitted; if TW-TS-002 output is desired, please specify | ||||
| `tw-ts-002=1` on the appropriate `a=fmtp` line. | ||||
|  | ||||
| .Example: `CRCX` message requesting HR codec with TW-TS-002 extensions | ||||
| ---- | ||||
| CRCX 2 ds/e1-0/s-2/su8-2@mgw MGCP 1.0 | ||||
| M: recvonly | ||||
| C: 2 | ||||
| L: p:20 | ||||
|  | ||||
| v=0 | ||||
| c=IN IP4 123.12.12.123 | ||||
| m=audio 1234 RTP/AVP 111 | ||||
| a=rtpmap:111 GSM-HR-08/8000/1 | ||||
| a=fmtp:111 tw-ts-002=1 | ||||
| ---- | ||||
| @@ -1,115 +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 -> "core-network" [label="3GPP AoIP"]; | ||||
|     OsmoBSC -> OsmoMGW [label="MGCP"]; | ||||
|     OsmoBTS -> OsmoMGW [label="RTP",dir=both]; | ||||
|     OsmoMGW -> "core-network" [label="RTP",dir=both]; | ||||
|     {rank=same OsmoBSC OsmoMGW} | ||||
|     OsmoMGW [color=red]; | ||||
| } | ||||
| ---- | ||||
|  | ||||
| [[fig-msc]] | ||||
| .OsmoMGW used with OsmoMSC | ||||
| [graphviz] | ||||
| ---- | ||||
| digraph G { | ||||
|     rankdir = LR; | ||||
|     "2G BSS" -> OsmoMSC [label="3GPP AoIP"]; | ||||
|     OsmoMSC -> OsmoMGW [label="MGCP"]; | ||||
|     "2G BSS" -> 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]; | ||||
| } | ||||
| ---- | ||||
|  | ||||
| [[fig-bsc-e1]] | ||||
| .Integration of legacy E1 BTS in AoIP network | ||||
| [graphviz] | ||||
| ---- | ||||
| digraph G { | ||||
|     rankdir = LR; | ||||
|     BTS -> OsmoBSC [label="Abis/E1"]; | ||||
|     OsmoBSC -> "core-network" [label="3GPP AoIP"]; | ||||
|     OsmoBSC -> OsmoMGW [label="MGCP"]; | ||||
|     BTS -> OsmoMGW [label="TRAU/E1",dir=both]; | ||||
|     OsmoMGW -> "core-network" [label="RTP",dir=both]; | ||||
|     {rank=same OsmoBSC OsmoMGW} | ||||
|     OsmoMGW [color=red]; | ||||
| } | ||||
| ---- | ||||
|  | ||||
| === 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 | ||||
|  | ||||
| At the moment (November 2020), OsmoMGW implements RTP proxy / RTP bridge | ||||
| type endpoints and E1/T1 16k/8k sub-slots with TRAU frames for classic BTS | ||||
| support. To the RTP proxy / RTP bridge endpoints two RTP connections can | ||||
| be established, which then work as a tandem. E1/T1 endpoints support one | ||||
| RTP connection at a time that is associated with a sub-slot on an E1 line. | ||||
| We are planning to add further endpoint types for: | ||||
|  | ||||
| - classic E1/T1 timeslots (64kBps alaw/ulaw) | ||||
| - announcement/playout end-points | ||||
| - conference endpoints | ||||
|  | ||||
| === Additional resources | ||||
|  | ||||
| You can find the OsmoMGW issue tracker and wiki online at | ||||
|  | ||||
| - https://osmocom.org/projects/osmo-mgw | ||||
| - https://osmocom.org/projects/osmo-mgw/wiki | ||||
|  | ||||
| RFC 3435 for MGCP is located at | ||||
|  | ||||
| - https://tools.ietf.org/html/rfc3435 | ||||
| @@ -1,42 +0,0 @@ | ||||
| ==== Full example of QoS for osmo-mgw | ||||
|  | ||||
| In the below example we will show the full set of configuration required | ||||
| for both DSCP and PCP differentiation of RTP traffic by osmo-mgw. | ||||
|  | ||||
| What we want to achieve in this example is the following configuration: | ||||
|  | ||||
| .DSCP and PCP assignments for osmo-mgw Abis downlink traffic in this example | ||||
| [options="header",width="30%",cols="2,1,1"] | ||||
| |=== | ||||
| |Traffic      |DSCP|PCP | ||||
| |RTP    |  46|  6 | ||||
| |=== | ||||
|  | ||||
| . configure the osmo-mgw program to set the DSCP value | ||||
| . configure an egrees QoS map to map from priority to PCP | ||||
|  | ||||
| .Example Step 1: add related VTY configuration to `osmo-mgw.cfg` | ||||
| ---- | ||||
| ... | ||||
| mgcp | ||||
|  rtp ip-dscp 46 | ||||
|  rtp socket-priority 6 | ||||
| ... | ||||
| ---- | ||||
|  | ||||
| .Example Step 2: egress QoS map to map from socket priority to PCP values | ||||
| ---- | ||||
| $ sudo ip link set dev eth0.9<1> type vlan egress-qos-map 0:0 5:5 6:6 7:7 <2> | ||||
| ---- | ||||
| <1> make sure to specify your specific VLAN interface name here instead of `eth0.9`. | ||||
| <2> create a egress QoS map that maps the priority value 1:1 to the PCP. We also include the | ||||
|     mapping 5:5 and 7:7 from the osmo-bsc example (see <<userman-osmobsc>>) here. | ||||
|  | ||||
| NOTE:: The settings of the `ip` command are volatile and only active until | ||||
| the next reboot (or the network device or VLAN is removed).  Please refer to | ||||
| the documentation of your specific Linux distribution in order to find out how | ||||
| to make such settings persistent by means of an `ifup` hook whenever the interface | ||||
| comes up.  For CentOS/RHEL 8 this can e.g. be achieved by means of an `/sbin/ifup-local | ||||
| script` (when using `network-scripts` and not NetworkManager).  For Debian or Ubuntu, | ||||
| this typically involves adding `up` lines to `/etc/network/interfaces` or a `/etc/network/if-up.d` | ||||
| script. | ||||
| @@ -1,42 +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. | ||||
|  | ||||
|  | ||||
| === Configure limits | ||||
|  | ||||
| When servicing hundreds of media endpoints, it may be necessary to adjust the | ||||
| operating system's limit on open file descriptors for the osmo-mgw process. A | ||||
| typical default limit imposed by operating systems is 1024; this would be | ||||
| exceeded by, for example, about 256 active voice calls with 4 RTP/RTPC ports | ||||
| each, sockets for other interfaces not considered yet. | ||||
|  | ||||
| It should be ok to set an OS limit on open file descriptors as high as 65536 | ||||
| for osmo-mgw, which practically rules out failure from running out of file | ||||
| descriptors anywhere (<16,000 active calls). | ||||
|  | ||||
| When using systemd, the file descriptor limit may be adjusted in the service | ||||
| file by the `LimitNOFILE` setting ("Number of Open FILE descriptors"). OsmoMGW | ||||
| ships a systemd service file with a high LimitNOFILE setting. | ||||
| @@ -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,39 +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_endpoints.adoc[] | ||||
|  | ||||
| include::{srcdir}/chapters/mgcp_extensions.adoc[] | ||||
|  | ||||
| include::./common/chapters/osmux/osmux.adoc[] | ||||
|  | ||||
| include::./common/chapters/qos-dscp-pcp.adoc[] | ||||
|  | ||||
| //include::{srcdir}/chapters/counters.adoc[] | ||||
|  | ||||
| include::./common/chapters/vty_cpu_sched.adoc[] | ||||
|  | ||||
| include::./common/chapters/port_numbers.adoc[] | ||||
|  | ||||
| include::./common/chapters/bibliography.adoc[] | ||||
|  | ||||
| include::./common/chapters/glossary.adoc[] | ||||
|  | ||||
| include::./common/chapters/gfdl.adoc[] | ||||
| @@ -1,38 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!-- | ||||
|   ex:ts=2:sw=42sts=2:et | ||||
|   -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- | ||||
| --> | ||||
| <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN" | ||||
| "http://docbook.org/xml/5.0/dtd/docbook.dtd" [ | ||||
| <!ENTITY chapter-vty      SYSTEM      "./common/chapters/vty.xml" > | ||||
| <!ENTITY sections-vty     SYSTEM      "generated/docbook_vty.xml"  > | ||||
| ]> | ||||
|  | ||||
| <book> | ||||
|   <info> | ||||
|     <revhistory> | ||||
|         <revision> | ||||
|             <revnumber>v1</revnumber> | ||||
|             <date>12th December 2017</date> | ||||
|             <authorinitials>pm</authorinitials> | ||||
|             <revremark>Initial</revremark> | ||||
|         </revision> | ||||
|     </revhistory> | ||||
|  | ||||
|     <title>OsmoMGW VTY Reference</title> | ||||
|  | ||||
|     <copyright> | ||||
|       <year>2017</year> | ||||
|     </copyright> | ||||
|  | ||||
|     <legalnotice> | ||||
|       <para>This work is copyright by <orgname>sysmocom - s.f.m.c. GmbH</orgname>. All rights reserved. | ||||
|       </para> | ||||
|     </legalnotice> | ||||
|   </info> | ||||
|  | ||||
|   <!-- Main chapters--> | ||||
|   &chapter-vty; | ||||
| </book> | ||||
|  | ||||
| @@ -1,17 +0,0 @@ | ||||
| #!/bin/sh -x | ||||
|  | ||||
| if [ -z "$DOCKER_PLAYGROUND" ]; then | ||||
| 	echo "You need to set DOCKER_PLAYGROUND" | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| SCRIPT=$(realpath "$0") | ||||
| MANUAL_DIR=$(dirname "$SCRIPT") | ||||
|  | ||||
| COMMIT=${COMMIT:-$(git log -1 --format=format:%H)} | ||||
|  | ||||
| cd "$DOCKER_PLAYGROUND/scripts" || exit 1 | ||||
|  | ||||
| OSMO_MGW_BRANCH=$COMMIT ./regen_doc.sh osmo-mgw 4243 \ | ||||
| 	"$MANUAL_DIR/chapters/counters_generated.adoc" \ | ||||
| 	"$MANUAL_DIR/vty/mgw_vty_reference.xml" | ||||
| @@ -1,2 +0,0 @@ | ||||
| <vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'> | ||||
| </vtydoc> | ||||
							
								
								
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										125
									
								
								hlrsync/hlrsync.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| #!/usr/bin/python2.5 | ||||
|  | ||||
| from __future__ import with_statement | ||||
|  | ||||
| from pysqlite2 import dbapi2 as sqlite3 | ||||
| import sys | ||||
|  | ||||
| hlr = sqlite3.connect(sys.argv[1]) | ||||
| web = sqlite3.connect(sys.argv[2]) | ||||
|  | ||||
| # switch to autocommit | ||||
| hlr.isolation_level = None | ||||
| web.isolation_level = None | ||||
|  | ||||
| hlr.row_factory = sqlite3.Row | ||||
| web.row_factory = sqlite3.Row | ||||
|  | ||||
| with hlr: | ||||
| 	hlr_subscrs = hlr.execute(""" | ||||
| 		SELECT * FROM Subscriber | ||||
| 	""").fetchall() | ||||
| 	hlr_tokens = hlr.execute(""" | ||||
| 		SELECT * FROM AuthToken | ||||
| 	""").fetchall() | ||||
|  | ||||
| with web: | ||||
| 	web_tokens = web.execute(""" | ||||
| 		SELECT * FROM reg_tokens | ||||
| 	""").fetchall() | ||||
| 	web_sms = web.execute(""" | ||||
| 		SELECT * FROM sms_queue | ||||
| 	""").fetchall() | ||||
|  | ||||
| # index by subscr id | ||||
| hlr_subscrs_by_id = {} | ||||
| hlr_subscrs_by_ext = {} | ||||
| hlr_tokens_by_subscr_id = {} | ||||
| for x in hlr_subscrs: | ||||
| 	hlr_subscrs_by_id[x['id']] = x | ||||
| 	hlr_subscrs_by_ext[x['extension']] = x | ||||
| del hlr_subscrs | ||||
| for x in hlr_tokens: | ||||
| 	hlr_tokens_by_subscr_id[x['subscriber_id']] = x | ||||
| del hlr_tokens | ||||
|  | ||||
| web_tokens_by_subscr_id = {} | ||||
| for x in web_tokens: | ||||
| 	web_tokens_by_subscr_id[x['subscriber_id']] = x | ||||
| del web_tokens | ||||
|  | ||||
| # remove leftover web_tokens and correct inconsistent fields | ||||
| with web: | ||||
| 	for x in web_tokens_by_subscr_id.values(): | ||||
| 		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None) | ||||
| 		if subscr is None: | ||||
| 			web.execute(""" | ||||
| 				      DELETE FROM reg_tokens WHERE subscriber_id = ? | ||||
| 				   """, (x['subscriber_id'],)) | ||||
| 			del web_tokens_by_subscr_id[x['subscriber_id']] | ||||
| 			continue | ||||
| 		if str(x['imsi']) != str(subscr['imsi']) or \ | ||||
| 		   x['extension'] != subscr['extension'] or \ | ||||
| 		   x['tmsi'] != subscr['tmsi'] or \ | ||||
| 		   x['lac'] != subscr['lac']: | ||||
| 			web.execute(""" | ||||
| 				      UPDATE reg_tokens | ||||
| 				      SET imsi = ?, extension = ?, tmsi = ?, lac = ? | ||||
| 				      WHERE subscriber_id = ? | ||||
| 				   """, (str(subscr['imsi']), subscr['extension'], | ||||
| 				   subscr['tmsi'], subscr['lac'], x['subscriber_id'])) | ||||
|  | ||||
| # add missing web_tokens | ||||
| with web: | ||||
| 	for x in hlr_tokens_by_subscr_id.values(): | ||||
| 		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None) | ||||
| 		if subscr is None: | ||||
| 			hlr.execute(""" | ||||
| 				      DELETE FROM AuthToken WHERE subscriber_id = ? | ||||
| 				   """, (x['subscriber_id'],)) | ||||
| 			del hlr_tokens_by_subscr_id[x['subscriber_id']] | ||||
| 			continue | ||||
| 		webtoken = web_tokens_by_subscr_id.get(x['subscriber_id'], None) | ||||
| 		if webtoken is None: | ||||
| 			web.execute(""" | ||||
| 				      INSERT INTO reg_tokens | ||||
| 				      (subscriber_id, extension, reg_completed, name, email, lac, imsi, token, tmsi) | ||||
| 				      VALUES | ||||
| 				      (?, ?, 0, ?, '', ?, ?, ?, ?) | ||||
| 				   """, (x['subscriber_id'], subscr['extension'], subscr['name'], | ||||
| 				   subscr['lac'], str(subscr['imsi']), x['token'], subscr['tmsi'])) | ||||
|  | ||||
| # authorize subscribers | ||||
| with hlr: | ||||
| 	for x in web_tokens_by_subscr_id.values(): | ||||
| 		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None) | ||||
| 		if x['reg_completed'] and not subscr['authorized']: | ||||
| 			hlr.execute(""" | ||||
| 				      UPDATE Subscriber | ||||
| 				      SET authorized = 1 | ||||
| 				      WHERE id = ? | ||||
| 				   """, (x['subscriber_id'],)) | ||||
|  | ||||
| # Sync SMS from web to hlr | ||||
| with hlr: | ||||
| 	for sms in web_sms: | ||||
| 		subscr = hlr_subscrs_by_ext.get(sms['receiver_ext']) | ||||
| 		if subscr is None: | ||||
| 			print '%s not found' % sms['receiver_ext'] | ||||
| 			continue | ||||
| 		hlr.execute(""" | ||||
| 				      INSERT INTO SMS | ||||
| 				      (created, sender_id, receiver_id, reply_path_req, status_rep_req, protocol_id, data_coding_scheme, ud_hdr_ind, text) | ||||
| 				      VALUES | ||||
| 				      (?, 1, ?, 0, 0, 0, 0, 0, ?) | ||||
| 				   """, (sms['created'], subscr['id'], sms['text'])) | ||||
| with web: | ||||
| 	for sms in web_sms: | ||||
| 		web.execute(""" | ||||
| 				      DELETE FROM sms_queue WHERE id = ? | ||||
| 				   """, (sms['id'],)) | ||||
|  | ||||
|  | ||||
| hlr.close() | ||||
| web.close() | ||||
|  | ||||
| @@ -1,23 +0,0 @@ | ||||
| SUBDIRS = \ | ||||
| 	osmocom \ | ||||
| 	$(NULL) | ||||
|  | ||||
| nobase_include_HEADERS = \ | ||||
| 	osmocom/mgcp_client/defs.h \ | ||||
| 	osmocom/mgcp_client/mgcp_client.h \ | ||||
| 	osmocom/mgcp_client/mgcp_client_endpoint_fsm.h \ | ||||
| 	osmocom/mgcp_client/mgcp_client_fsm.h \ | ||||
| 	osmocom/mgcp_client/mgcp_client_pool.h \ | ||||
| 	$(NULL) | ||||
|  | ||||
| noinst_HEADERS = \ | ||||
| 	osmocom/mgcp/mgcp.h \ | ||||
| 	osmocom/mgcp/mgcp_common.h \ | ||||
| 	osmocom/mgcp/osmux.h \ | ||||
| 	$(NULL) | ||||
|  | ||||
| # This gets copied during make from osmocom/mgcp/mgcp_common.h. Therefore it is not included in the source tree and we | ||||
| # don't need to distribute it (OS#4084). | ||||
| nobase_nodist_include_HEADERS = \ | ||||
| 	osmocom/mgcp_client/mgcp_common.h \ | ||||
| 	$(NULL) | ||||
| @@ -1,4 +0,0 @@ | ||||
| SUBDIRS = \ | ||||
| 	mgcp_client \ | ||||
| 	mgcp \ | ||||
| 	$(NULL) | ||||
| @@ -1,18 +0,0 @@ | ||||
| noinst_HEADERS = \ | ||||
| 	vty.h \ | ||||
| 	mgcp_msg.h \ | ||||
| 	mgcp_codec.h \ | ||||
| 	mgcp_conn.h \ | ||||
| 	mgcp_stat.h \ | ||||
| 	mgcp_endp.h \ | ||||
| 	mgcp_sdp.h \ | ||||
| 	mgcp_codec.h \ | ||||
| 	mgcp_trunk.h \ | ||||
| 	debug.h \ | ||||
| 	mgcp_ratectr.h \ | ||||
| 	mgcp_e1.h \ | ||||
| 	mgcp_network.h \ | ||||
| 	mgcp_protocol.h \ | ||||
| 	mgcp_iuup.h \ | ||||
| 	mgcp_rtp_end.h \ | ||||
| 	$(NULL) | ||||
| @@ -1,37 +0,0 @@ | ||||
| /* (C) 2017 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Philipp Maier | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <osmocom/core/linuxlist.h> | ||||
|  | ||||
| #define DEBUG | ||||
| #include <osmocom/core/logging.h> | ||||
|  | ||||
| /* Debug Areas of the code */ | ||||
| enum { | ||||
| 	DRTP, | ||||
| 	DE1, | ||||
| 	DOSMUX, | ||||
| 	Debug_LastEntry, | ||||
| }; | ||||
|  | ||||
| extern const struct log_info log_info; | ||||
| @@ -1,202 +0,0 @@ | ||||
| /* A Media Gateway Control Protocol Media Gateway: RFC 3435 */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * (C) 2009-2012 by On-Waves | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/core/msgb.h> | ||||
| #include <osmocom/core/socket.h> | ||||
| #include <osmocom/core/osmo_io.h> | ||||
| #include <osmocom/core/write_queue.h> | ||||
| #include <osmocom/core/timer.h> | ||||
| #include <osmocom/core/logging.h> | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
| #include <osmocom/mgcp/osmux.h> | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <pthread.h> | ||||
|  | ||||
| #include "mgcp_ratectr.h" | ||||
|  | ||||
| extern void *tall_mgw_ctx; | ||||
|  | ||||
| #define RTP_PORT_DEFAULT_RANGE_START 16002 | ||||
| #define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64 | ||||
|  | ||||
| /* | ||||
|  * Handling of MGCP Endpoints and the MGCP Config | ||||
|  */ | ||||
| struct mgcp_endpoint; | ||||
| struct mgcp_config; | ||||
| struct mgcp_trunk; | ||||
| struct mgcp_rtp_end; | ||||
| /* | ||||
|  * 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_reset)(struct mgcp_trunk *cfg); | ||||
| typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone); | ||||
|  | ||||
| /** | ||||
|  * Return: | ||||
|  *   <  0 in case no audio was processed | ||||
|  *   >= 0 in case audio was processed. | ||||
|  */ | ||||
| typedef int (*mgcp_processing)(struct mgcp_endpoint *endp, | ||||
| 			       struct mgcp_rtp_end *dst_end, struct msgb *msg); | ||||
|  | ||||
| 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 { | ||||
| 	pthread_mutex_t lock; | ||||
| 	/* addr or NULL to fall-back to default */ | ||||
| 	char bind_addr_v4[INET6_ADDRSTRLEN]; | ||||
| 	char bind_addr_v6[INET6_ADDRSTRLEN]; | ||||
|  | ||||
| 	/* dynamically allocated */ | ||||
| 	int range_start; | ||||
| 	int range_end; | ||||
| 	int last_port; | ||||
|  | ||||
| 	/* set to true to enable automatic probing | ||||
| 	 * of the local bind IP-Address, bind_addr | ||||
| 	 * (or its fall back) is used when automatic | ||||
| 	 * probing fails */ | ||||
| 	bool bind_addr_probe; | ||||
| }; | ||||
|  | ||||
| /* There are up to three modes in which the keep-alive dummy packet can be | ||||
|  * sent. The behaviour is controlled via the keepalive_interval member of the | ||||
|  * trunk config. If that member is set to 0 (MGCP_KEEPALIVE_NEVER) no dummy- | ||||
|  * packet is sent at all and the timer that sends regular dummy packets | ||||
|  * is no longer scheduled. If the keepalive_interval is set to -1, only | ||||
|  * one dummy packet is sent when an CRCX or an MDCX is performed. No timer | ||||
|  * is scheduled. For all vales greater 0, the timer is scheduled and the | ||||
|  * value is used as interval. See also mgcp_keepalive_timer_cb(), | ||||
|  * handle_modify_con(), and handle_create_con() */ | ||||
| #define MGCP_KEEPALIVE_ONCE (-1) | ||||
| #define MGCP_KEEPALIVE_NEVER 0 | ||||
|  | ||||
| enum mgcp_role { | ||||
| 	MGCP_BSC = 0, | ||||
| 	MGCP_BSC_NAT, | ||||
| }; | ||||
|  | ||||
| struct mgcp_config { | ||||
| 	int source_port; | ||||
| 	char local_ip[INET6_ADDRSTRLEN]; | ||||
| 	char source_addr[INET6_ADDRSTRLEN]; | ||||
| 	char call_agent_addr[INET6_ADDRSTRLEN]; | ||||
|  | ||||
| 	struct osmo_wqueue gw_fd; | ||||
|  | ||||
| 	struct mgcp_port_range net_ports; | ||||
| 	int endp_dscp; | ||||
| 	int endp_priority; | ||||
|  | ||||
| 	int force_ptime; | ||||
|  | ||||
| 	mgcp_reset reset_cb; | ||||
| 	mgcp_rqnt rqnt_cb; | ||||
| 	void *data; | ||||
|  | ||||
| 	/* list holding the trunks */ | ||||
| 	struct llist_head trunks; | ||||
|  | ||||
| 	enum mgcp_role role; | ||||
|  | ||||
| 	struct { | ||||
| 		/* Osmux usage policy: */ | ||||
| 		enum osmux_usage usage; | ||||
| 		/* addr to bind the server to */ | ||||
| 		char *local_addr_v4; | ||||
| 		char *local_addr_v6; | ||||
| 		/* osmux port */ | ||||
| 		uint16_t local_port; | ||||
| 		/* The osmux socket is allocated on demand (1st time used). | ||||
| 		* This tells us if the osmux socket is already initialized.  */ | ||||
| 		bool initialized; | ||||
| 		/* osmux batch factor: from 1 to 4 maximum */ | ||||
| 		int batch_factor; | ||||
| 		/* osmux batch size (in bytes) */ | ||||
| 		int batch_size; | ||||
| 		/* Pad circuit with dummy AMR frames if no payload to transmit is available */ | ||||
| 		bool dummy_padding; | ||||
| 		/* Whether peer is behind NAT (Retrieve remote addr from 1st received Osmux packet) */ | ||||
| 		bool peer_behind_nat; | ||||
| 	} osmux; | ||||
| 	/* domain name of the media gateway */ | ||||
| 	char domain[255+1]; | ||||
|  | ||||
| 	/* time after which inactive connections (CIs) get closed */ | ||||
| 	int conn_timeout; | ||||
|  | ||||
| 	/* osmocom CTRL interface */ | ||||
| 	struct ctrl_handle *ctrl; | ||||
|  | ||||
| 	/* global rate counters to measure the MGWs overall performance and | ||||
| 	 * health */ | ||||
| 	struct mgcp_ratectr_global ratectr; | ||||
| }; | ||||
|  | ||||
| /* config management */ | ||||
| struct mgcp_config *mgcp_config_alloc(void); | ||||
| int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg, | ||||
| 		      enum mgcp_role role); | ||||
| int mgcp_vty_init(void); | ||||
| void mgcp_trunk_set_keepalive(struct mgcp_trunk *trunk, int interval); | ||||
|  | ||||
| /* | ||||
|  * format helper functions | ||||
|  */ | ||||
| struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg); | ||||
|  | ||||
|  | ||||
| int mgcp_send_reset_ep(struct mgcp_endpoint *endp); | ||||
| int mgcp_send_reset_all(struct mgcp_config *cfg); | ||||
|  | ||||
|  | ||||
| int mgcp_create_bind(const char *source_addr, int port, uint8_t dscp, uint8_t prio); | ||||
| int mgcp_udp_send(struct osmo_io_fd *iofd, const struct osmo_sockaddr *addr, const char *buf, int len); | ||||
| @@ -1,48 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
|  | ||||
| #define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20 | ||||
| #define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000 | ||||
| #define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20 | ||||
| #define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000 | ||||
| #define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1 | ||||
|  | ||||
| #define PTYPE_UNDEFINED (-1) | ||||
|  | ||||
| struct mgcp_rtp_codec { | ||||
| 	uint32_t rate; | ||||
| 	int channels; | ||||
| 	uint32_t frame_duration_num; | ||||
| 	uint32_t frame_duration_den; | ||||
|  | ||||
| 	int payload_type; | ||||
| 	char audio_name[64]; | ||||
| 	char subtype_name[64]; | ||||
|  | ||||
| 	bool param_present; | ||||
| 	struct mgcp_codec_param param; | ||||
| }; | ||||
|  | ||||
| bool mgcp_codec_amr_align_mode_is_indicated(const struct mgcp_rtp_codec *codec); | ||||
| bool mgcp_codec_amr_is_octet_aligned(const struct mgcp_rtp_codec *codec); | ||||
|  | ||||
| struct mgcp_rtp_codecset { | ||||
| 	/* 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; | ||||
| }; | ||||
|  | ||||
| void mgcp_codecset_reset(struct mgcp_rtp_codecset *cset); | ||||
| void mgcp_codecset_summary(struct mgcp_rtp_codecset *cset, const char *prefix_str); | ||||
| int mgcp_codecset_add_codec(struct mgcp_rtp_codecset *cset, int payload_type, | ||||
| 			    const char *audio_name, const struct mgcp_codec_param *param); | ||||
| int mgcp_codecset_decide(struct mgcp_rtp_codecset *cset_src, struct mgcp_rtp_codecset *cset_dst); | ||||
| const struct mgcp_rtp_codec *mgcp_codecset_pt_find_by_subtype_name(const struct mgcp_rtp_codecset *cset, | ||||
| 								const char *subtype_name, unsigned int match_nr); | ||||
| struct mgcp_rtp_codec *mgcp_codecset_find_codec_from_pt(struct mgcp_rtp_codecset *cset, int payload_type); | ||||
| @@ -1,116 +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, | ||||
| 	MGCP_CONN_CONFECHO  = 8 | 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; | ||||
| 	bool fr_efr_twts001_present; | ||||
| 	bool fr_efr_twts001; | ||||
| 	bool hr_twts002_present; | ||||
| 	bool hr_twts002; | ||||
| }; | ||||
|  | ||||
| /* Ensure that the msg->l2h is NUL terminated. */ | ||||
| static inline int mgcp_msg_terminate_nul(struct msgb *msg) | ||||
| { | ||||
| 	unsigned char *tail = msg->tail; /* char after l2 data */ | ||||
| 	if (tail[-1] == '\0') | ||||
| 		/* nothing to do */; | ||||
| 	else if (msgb_tailroom(msg) > 0) | ||||
| 		msgb_put_u8(msg, (uint8_t)'\0'); | ||||
| 	else if (tail[-1] == '\r' || tail[-1] == '\n') | ||||
| 		tail[-1] = '\0'; | ||||
| 	else { | ||||
| 		LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: " | ||||
| 		     "Length: %d, Buffer size: %d\n", | ||||
| 		     msgb_l2len(msg), msg->data_len); | ||||
| 		return -ENOTSUP; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* Maximum length of the comment field */ | ||||
| #define MGCP_COMMENT_MAXLEN 256 | ||||
|  | ||||
| /* Maximum allowed String length of Connection Identifiers as per spec | ||||
|  * (see also RFC3435 2.1.3.2 Names of Connections), plus one for '\0'. */ | ||||
| #define MGCP_CONN_ID_MAXLEN 32+1 | ||||
|  | ||||
| /* Deprecated: old name of MGCP_CONN_ID_MAXLEN. */ | ||||
| #define MGCP_CONN_ID_LENGTH MGCP_CONN_ID_MAXLEN | ||||
|  | ||||
| /* String length of Endpoint Identifiers. | ||||
| /  (see also RFC3435 section 3.2.1.3) */ | ||||
| #define MGCP_ENDPOINT_MAXLEN (255*2+1+1) | ||||
|  | ||||
| /* A prefix to denote the virtual trunk (RTP on both ends) */ | ||||
| #define MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK "rtpbridge/" | ||||
|  | ||||
| /* A prefix to denote the e1 trunk | ||||
|  * (see also RFC3435 section E.2) */ | ||||
| #define MGCP_ENDPOINT_PREFIX_E1_TRUNK "ds/e1-" | ||||
|  | ||||
| /* Maximal number of payload types / codecs that can be negotiated via SDP at | ||||
|  * at once. */ | ||||
| #define MGCP_MAX_CODECS 10 | ||||
|  | ||||
| #endif | ||||
| @@ -1,255 +0,0 @@ | ||||
| /* Message connection list handling */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Philipp Maier | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp.h> | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
| #include <osmocom/mgcp/mgcp_network.h> | ||||
| #include <osmocom/mgcp/osmux.h> | ||||
| #include <osmocom/core/linuxlist.h> | ||||
| #include <osmocom/core/rate_ctr.h> | ||||
| #include <osmocom/core/utils.h> | ||||
| #include <osmocom/gsm/iuup.h> | ||||
| #include <osmocom/mgcp/mgcp_rtp_end.h> | ||||
| #include <inttypes.h> | ||||
|  | ||||
| #define LOGPCONN(conn, cat, level, fmt, args...) \ | ||||
| LOGPENDP((conn)->endp, cat, level, "CI:%s " fmt, \ | ||||
|          (conn)->id, \ | ||||
|          ## args) | ||||
|  | ||||
| #define LOG_CONN(conn, level, fmt, args...) \ | ||||
| 	LOGP(DRTP, level, "(%s I:%s) " fmt, \ | ||||
| 	     (conn)->endp ? (conn)->endp->name : "none", (conn)->id, ## args) | ||||
|  | ||||
| #define LOG_CONN_RTP(conn_rtp, level, fmt, args...) \ | ||||
| 	LOG_CONN((conn_rtp)->conn, level, fmt, ## args) | ||||
|  | ||||
| /* Specific rtp connection type (see struct mgcp_conn_rtp) */ | ||||
| enum mgcp_conn_rtp_type { | ||||
| 	MGCP_RTP_DEFAULT	= 0, | ||||
| 	MGCP_RTP_OSMUX, | ||||
| 	MGCP_RTP_IUUP, | ||||
| }; | ||||
| extern const struct value_string mgcp_conn_rtp_type_names[]; | ||||
| static inline const char *mgcp_conn_rtp_type_name(enum mgcp_conn_rtp_type val) | ||||
| { | ||||
| 	return get_value_string(mgcp_conn_rtp_type_names, val); | ||||
| } | ||||
|  | ||||
| /*! Connection type, specifies which member of the union "u" in mgcp_conn | ||||
|  *  contains a useful connection description (currently only RTP) */ | ||||
| enum mgcp_conn_type { | ||||
| 	MGCP_CONN_TYPE_RTP, | ||||
| }; | ||||
|  | ||||
| /* MGCP connection (RTP) */ | ||||
| struct mgcp_conn_rtp { | ||||
|  | ||||
| 	/* Backpointer to conn struct */ | ||||
| 	struct mgcp_conn *conn; | ||||
|  | ||||
| 	/* Specific connection type */ | ||||
| 	enum mgcp_conn_rtp_type type; | ||||
|  | ||||
| 	/* Port status */ | ||||
| 	struct mgcp_rtp_end end; | ||||
|  | ||||
| 	/* Sequence bits */ | ||||
| 	struct mgcp_rtp_state state; | ||||
|  | ||||
| 	/* taps for the rtp connection; one per direction */ | ||||
| 	struct mgcp_rtp_tap tap_in; | ||||
| 	struct mgcp_rtp_tap tap_out; | ||||
|  | ||||
| 	/* Osmux states (optional) */ | ||||
| 	struct { | ||||
| 		/* Osmux state: disabled, activating, active */ | ||||
| 		enum osmux_state state; | ||||
| 		/* Is local_cid holding valid data? is it allocated from pool? */ | ||||
| 		bool local_cid_allocated; | ||||
| 		/* Allocated local Osmux circuit ID for this conn */ | ||||
| 		uint8_t local_cid; | ||||
| 		/* Is remote_cid holding valid data? was it already received from client? */ | ||||
| 		bool remote_cid_present; | ||||
| 		/* Received remote Osmux circuit ID for this conn */ | ||||
| 		uint8_t remote_cid; | ||||
| 		/* handle to batch messages, shared (refcounted) among several conns */ | ||||
| 		struct osmux_in_handle *in; | ||||
| 		/* handle to unbatch messages, one allocated and owned per conn */ | ||||
| 		struct osmux_out_handle *out; | ||||
| 		/* statistics: */ | ||||
| 		struct rate_ctr_group *ctrg; | ||||
| 	} osmux; | ||||
|  | ||||
| 	struct { | ||||
| 		struct osmo_iuup_instance *iui; | ||||
| 		bool active_init; /* true: Send IuUP Init */ | ||||
| 		int rfci_id_no_data; /* RFCI Id for RFCI NO_DATA (-1 if not available) */ | ||||
| 		bool configured; | ||||
| 		struct osmo_iuup_rnl_prim *init_ind; | ||||
| 	} iuup; | ||||
|  | ||||
| 	struct rate_ctr_group *ctrg; | ||||
| }; | ||||
|  | ||||
| /*! MGCP connection (untyped) */ | ||||
| struct mgcp_conn { | ||||
| 	/*! list head */ | ||||
| 	struct llist_head entry; | ||||
|  | ||||
| 	/*! Backpointer to the endpoint where the conn belongs to */ | ||||
| 	struct mgcp_endpoint *endp; | ||||
|  | ||||
| 	/*! type of the connection (union) */ | ||||
| 	enum mgcp_conn_type type; | ||||
|  | ||||
| 	/*! mode of the connection */ | ||||
| 	enum mgcp_connection_mode mode; | ||||
|  | ||||
| 	/*! copy of the mode to restore the original setting (VTY) */ | ||||
| 	enum mgcp_connection_mode mode_orig; | ||||
|  | ||||
| 	/*! connection id to identify the connection */ | ||||
| 	char id[MGCP_CONN_ID_MAXLEN]; | ||||
|  | ||||
| 	/*! human readable name (vty, logging) */ | ||||
| 	char name[256]; | ||||
|  | ||||
| 	/*! activity tracker (for cleaning up inactive connections) */ | ||||
| 	struct osmo_timer_list watchdog; | ||||
|  | ||||
| 	/*! union with connection description */ | ||||
| 	union { | ||||
| 		struct mgcp_conn_rtp rtp; | ||||
| 	} u; | ||||
|  | ||||
| 	/*! pointer to optional private data */ | ||||
| 	void *priv; | ||||
| }; | ||||
|  | ||||
| /* RTP connection related counters */ | ||||
| enum { | ||||
| 	IN_STREAM_ERR_TSTMP_CTR, | ||||
| 	OUT_STREAM_ERR_TSTMP_CTR, | ||||
| 	RTP_PACKETS_RX_CTR, | ||||
| 	RTP_OCTETS_RX_CTR, | ||||
| 	RTP_PACKETS_TX_CTR, | ||||
| 	RTP_OCTETS_TX_CTR, | ||||
| 	RTP_DROPPED_PACKETS_CTR, | ||||
| 	RTP_NUM_CONNECTIONS, | ||||
| }; | ||||
|  | ||||
| /* RTP per-connection statistics. Instances of the corresponding rate counter group | ||||
|  * exist for the lifetime of an RTP connection. | ||||
|  * Must be kept in sync with all_rtp_conn_rate_ctr_desc below */ | ||||
| static const struct rate_ctr_desc mgcp_conn_rate_ctr_desc[] = { | ||||
| 	[IN_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:in", "Inbound rtp-stream timestamp errors."}, | ||||
| 	[OUT_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:out", "Outbound rtp-stream timestamp errors."}, | ||||
| 	[RTP_PACKETS_RX_CTR] = {"rtp:packets_rx", "Inbound rtp packets."}, | ||||
| 	[RTP_OCTETS_RX_CTR] = {"rtp:octets_rx", "Inbound rtp octets."}, | ||||
| 	[RTP_PACKETS_TX_CTR] = {"rtp:packets_tx", "Outbound rtp packets."}, | ||||
| 	[RTP_OCTETS_TX_CTR] = {"rtp:octets_tx", "Outbound rtp octets."}, | ||||
| 	[RTP_DROPPED_PACKETS_CTR] = {"rtp:dropped", "Dropped rtp packets."} | ||||
| }; | ||||
|  | ||||
| /* Aggregated RTP connection stats. These are updated when an RTP connection is freed. | ||||
|  * Must be kept in sync with mgcp_conn_rate_ctr_desc above */ | ||||
| static const struct rate_ctr_desc all_rtp_conn_rate_ctr_desc[] = { | ||||
| 	[IN_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_in", "Total inbound rtp-stream timestamp errors."}, | ||||
| 	[OUT_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_out", "Total outbound rtp-stream timestamp errors."}, | ||||
| 	[RTP_PACKETS_RX_CTR] = {"all_rtp:packets_rx", "Total inbound rtp packets."}, | ||||
| 	[RTP_OCTETS_RX_CTR] = {"all_rtp:octets_rx", "Total inbound rtp octets."}, | ||||
| 	[RTP_PACKETS_TX_CTR] = {"all_rtp:packets_tx", "Total outbound rtp packets."}, | ||||
| 	[RTP_OCTETS_TX_CTR] = {"all_rtp:octets_tx", "Total outbound rtp octets."}, | ||||
| 	[RTP_DROPPED_PACKETS_CTR] = {"all_rtp:dropped", "Total dropped rtp packets."}, | ||||
|  | ||||
| 	/* This last counter does not exist in per-connection stats, only here. */ | ||||
| 	[RTP_NUM_CONNECTIONS] = {"all_rtp:num_closed_conns", "Total number of rtp connections closed."} | ||||
| }; | ||||
|  | ||||
| /* Osmux connection related counters */ | ||||
| enum { | ||||
| 	OSMUX_CHUNKS_RX_CTR, | ||||
| 	OSMUX_OCTETS_RX_CTR, | ||||
| 	OSMUX_RTP_PACKETS_TX_CTR, | ||||
| 	OSMUX_RTP_PACKETS_TX_DROPPED_CTR, | ||||
| 	OSMUX_AMR_OCTETS_TX_CTR, | ||||
| 	/* Only available in global stats: */ | ||||
| 	OSMUX_NUM_CONNECTIONS, | ||||
| 	OSMUX_PACKETS_RX_CTR, | ||||
| 	OSMUX_PACKETS_TX_CTR, | ||||
| 	OSMUX_DROPPED_PACKETS_CTR, | ||||
| }; | ||||
|  | ||||
| /* 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_osmux_rate_ctr_desc[] = { | ||||
| 	[OSMUX_CHUNKS_RX_CTR] = {"osmux:chunks_rx", "Inbound Osmux chunks."}, | ||||
| 	[OSMUX_OCTETS_RX_CTR] = {"osmux:octets_rx", "Inbound Osmux octets."}, | ||||
| 	[OSMUX_RTP_PACKETS_TX_CTR] = {"osmux:rtp_packets_tx", "Tx outbound RTP packets to encode as Osmux."}, | ||||
| 	[OSMUX_RTP_PACKETS_TX_DROPPED_CTR] = {"osmux:rtp_packets_tx_dropped", "Dropped Tx outbound RTP packets to encode as Osmux."}, | ||||
| 	[OSMUX_AMR_OCTETS_TX_CTR] = {"osmux:amr_octets_tx", "Tx outbound AMD payload octets."}, | ||||
| }; | ||||
|  | ||||
| /* Aggregated Osmux connection stats. These are updated when an Osmux connection is freed. | ||||
|  * Must be kept in sync with mgcp_conn_osmux_rate_ctr_desc above */ | ||||
| static const struct rate_ctr_desc all_osmux_conn_rate_ctr_desc[] = { | ||||
| 	[OSMUX_CHUNKS_RX_CTR] = {"all_osmux:chunks_rx", "Inbound Osmux chunks."}, | ||||
| 	[OSMUX_OCTETS_RX_CTR] = {"all_osmux:octets_rx", "Inbound Osmux octets."}, | ||||
| 	[OSMUX_RTP_PACKETS_TX_CTR] = {"all_osmux:rtp_packets_tx", "Tx outbound RTP packets to encode as Osmux."}, | ||||
| 	[OSMUX_RTP_PACKETS_TX_DROPPED_CTR] = {"all_osmux:rtp_packets_tx_dropped", "Dropped Tx outbound RTP packets to encode as Osmux."}, | ||||
| 	[OSMUX_AMR_OCTETS_TX_CTR] = {"all_osmux:amr_octets_tx", "Tx outbound AMD payload octets."}, | ||||
| 	/* These last counters below do not exist in per-connection stats, only here: */ | ||||
| 	[OSMUX_NUM_CONNECTIONS] = {"all_osmux:num_closed_conns", "Total number of osmux connections closed."}, | ||||
| 	[OSMUX_PACKETS_RX_CTR] = {"all_osmux:packets_rx", "Total inbound UDP/Osmux packets."}, | ||||
| 	[OSMUX_PACKETS_TX_CTR] = {"all_osmux:packets_tx", "Total outbound UDP/Osmux packets."}, | ||||
| 	[OSMUX_DROPPED_PACKETS_CTR] = {"all_osmux:dropped_packets", "Dropped outbound UDP/Osmux packets."} | ||||
| }; | ||||
|  | ||||
| /* Was conn configured to handle Osmux? */ | ||||
| static inline bool mgcp_conn_rtp_is_osmux(const struct mgcp_conn_rtp *conn) { | ||||
| 	return conn->type == MGCP_RTP_OSMUX; | ||||
| } | ||||
|  | ||||
| /* Was conn configured to handle Osmux? */ | ||||
| static inline bool mgcp_conn_rtp_is_iuup(const struct mgcp_conn_rtp *conn) | ||||
| { | ||||
| 	return conn->type == MGCP_RTP_IUUP; | ||||
| } | ||||
|  | ||||
| static inline struct mgcp_conn_rtp *mgcp_conn_get_conn_rtp(struct mgcp_conn *conn) | ||||
| { | ||||
| 	OSMO_ASSERT(conn->type == MGCP_CONN_TYPE_RTP); | ||||
| 	return &conn->u.rtp; | ||||
| } | ||||
|  | ||||
| struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp, | ||||
| 				  enum mgcp_conn_type type, char *name); | ||||
| void mgcp_conn_free(struct mgcp_conn *conn); | ||||
| int mgcp_conn_set_mode(struct mgcp_conn *conn, enum mgcp_connection_mode mode); | ||||
| char *mgcp_conn_dump(struct mgcp_conn *conn); | ||||
| struct mgcp_conn *mgcp_find_dst_conn(struct mgcp_conn *conn); | ||||
| void mgcp_conn_watchdog_kick(struct mgcp_conn *conn); | ||||
| @@ -1,27 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* A 64k timeslot on an E1 line can be subdevied into the following | ||||
|  * subslot combinations: | ||||
|  * | ||||
|  * subslot:                                          offset: | ||||
|  * [          ][          ][   16k    ][8k_subslot]  0 | ||||
|  * [          ][   32k    ][_subslot__][8k_subslot]  1 | ||||
|  * [          ][ subslot  ][   16k    ][8k_subslot]  2 | ||||
|  * [   64k    ][__________][_subslot__][8k_subslot]  3 | ||||
|  * [ timeslot ][          ][   16k    ][8k_subslot]  4 | ||||
|  * [          ][   32K    ][_subslot__][8k_subslot]  5 | ||||
|  * [          ][ subslot  ][   16k    ][8k_subslot]  6 | ||||
|  * [          ][          ][ subslot  ][8k_subslot]  7 | ||||
|  * | ||||
|  * Since overlapping assignment of subslots is not possible there is a limited | ||||
|  * set of subslot assignments possible. The e1_rates array lists the possible | ||||
|  * assignments as depicted above. Also each subslot assignment comes along with | ||||
|  * a bit offset in the E1 bitstream. The e1_offsets arrays lists the bit | ||||
|  * offsets. */ | ||||
| static const uint8_t e1_rates[] = { 64, 32, 32, 16, 16, 16, 16, 8, 8, 8, 8, 8, 8, 8, 8 }; | ||||
| static const uint8_t e1_offsets[] = { 0, 0, 4, 0, 2, 4, 6, 0, 1, 2, 3, 4, 5, 6, 7 }; | ||||
|  | ||||
| int mgcp_e1_endp_equip(struct mgcp_endpoint *endp, uint8_t ts, uint8_t ss, uint8_t offs); | ||||
| int mgcp_e1_endp_update(struct mgcp_endpoint *endp); | ||||
| void mgcp_e1_endp_release(struct mgcp_endpoint *endp, uint8_t ts); | ||||
| int mgcp_e1_send_rtp(struct mgcp_endpoint *endp, struct mgcp_rtp_codec *codec, struct msgb *msg); | ||||
| @@ -1,159 +0,0 @@ | ||||
| /* Endpoint types */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Philipp Maier | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/core/msgb.h> | ||||
| #include <osmocom/gsm/i460_mux.h> | ||||
| #include <osmocom/mgcp/mgcp_protocol.h> | ||||
|  | ||||
| struct sockaddr; | ||||
| struct mgcp_conn; | ||||
| struct mgcp_conn_rtp; | ||||
| struct mgcp_endpoint; | ||||
|  | ||||
| /* Number of E1 subslots (different variants, not all useable at the same time) */ | ||||
| #define MGCP_ENDP_E1_SUBSLOTS 15 | ||||
|  | ||||
| #define LOGPENDP(endp, cat, level, fmt, args...) \ | ||||
| LOGP(cat, level, "endpoint:%s " fmt, \ | ||||
|      endp ? endp->name : "none", \ | ||||
|      ## args) | ||||
|  | ||||
| enum rtp_proto { | ||||
| 	MGCP_PROTO_RTP, | ||||
| 	MGCP_PROTO_RTCP, | ||||
| }; | ||||
|  | ||||
| struct osmo_rtp_msg_ctx { | ||||
| 	enum rtp_proto proto; | ||||
| 	struct mgcp_conn_rtp *conn_src; | ||||
| 	struct osmo_sockaddr *from_addr; | ||||
| }; | ||||
|  | ||||
| #define OSMO_RTP_MSG_CTX(MSGB) ((struct osmo_rtp_msg_ctx*)(MSGB)->cb) | ||||
|  | ||||
| osmo_static_assert(sizeof(((struct msgb*)0)->cb) >= sizeof(struct osmo_rtp_msg_ctx), osmo_rtp_msg_ctx_fits_in_msgb_cb); | ||||
|  | ||||
| /* Callback type for RTP dispatcher functions (e.g mgcp_dispatch_rtp_bridge_cb, see below). | ||||
|  * The OSMO_RTP_MSG_CTX() should be set appropriately on the msg. */ | ||||
| typedef int (*mgcp_dispatch_rtp_cb) (struct msgb *msg); | ||||
|  | ||||
| /* Callback type for endpoint specific cleanup actions. This function | ||||
|  * is automatically executed when a connection is freed (see mgcp_conn_free() | ||||
|  * in mgcp_conn.c). Depending on the type of the endpoint there may be endpoint | ||||
|  * specific things to take care of once a connection has been removed. */ | ||||
| typedef void (*mgcp_cleanup_cp) (struct mgcp_endpoint *endp, | ||||
| 				 struct mgcp_conn *conn); | ||||
|  | ||||
| /*! MGCP endpoint properties */ | ||||
| struct mgcp_endpoint_type { | ||||
| 	/*! maximum number of connections */ | ||||
| 	int max_conns; | ||||
|  | ||||
| 	/*! callback that defines how to dispatch incoming RTP data */ | ||||
| 	mgcp_dispatch_rtp_cb dispatch_rtp_cb; | ||||
|  | ||||
| 	/*! callback that implements endpoint specific cleanup actions */ | ||||
| 	mgcp_cleanup_cp cleanup_cb; | ||||
| }; | ||||
|  | ||||
| /*! MGCP endpoint typeset */ | ||||
| struct mgcp_endpoint_typeset { | ||||
| 	struct mgcp_endpoint_type rtp; | ||||
| 	struct mgcp_endpoint_type e1; | ||||
| }; | ||||
|  | ||||
| /*! static MGCP endpoint typeset (pre-initalized, read-only) */ | ||||
| extern const struct mgcp_endpoint_typeset ep_typeset; | ||||
|  | ||||
| /*! MGCP endpoint model */ | ||||
| struct mgcp_endpoint { | ||||
|  | ||||
| 	/*! Unique endpoint name, used for addressing via MGCP */ | ||||
| 	char *name; | ||||
|  | ||||
| 	/*! Call identifier string (as supplied by the call agant) */ | ||||
| 	char *callid; | ||||
|  | ||||
| 	/*! Local connection options (see mgcp_internal.h) */ | ||||
| 	struct mgcp_lco local_options; | ||||
|  | ||||
| 	/*! List of struct mgcp_conn, of the connections active on this endpoint */ | ||||
| 	struct llist_head conns; | ||||
|  | ||||
| 	/*! Backpointer to the trunk this endpoint belongs to */ | ||||
| 	struct mgcp_trunk *trunk; | ||||
|  | ||||
| 	/*! Endpoint properties (see above) */ | ||||
| 	const struct mgcp_endpoint_type *type; | ||||
|  | ||||
| 	/*! Last MGCP transmission (in case re-transmission is required) */ | ||||
| 	char *last_trans; | ||||
|  | ||||
| 	/*! Last MGCP response (in case re-transmission is required) */ | ||||
| 	char *last_response; | ||||
|  | ||||
| 	/*! MGCP_X_OSMO_IGN_* flags from 'X-Osmo-IGN:' header */ | ||||
| 	uint32_t x_osmo_ign; | ||||
|  | ||||
| 	/* E1 specific */ | ||||
| 	struct { | ||||
| 		struct osmo_i460_schan_desc scd; | ||||
| 		struct osmo_i460_subchan *schan; | ||||
| 		struct osmo_fsm_inst *trau_sync_fi; | ||||
| 		struct osmo_trau2rtp_state *trau_rtp_st; | ||||
| 		uint8_t last_amr_ft; | ||||
| 		uint8_t rtp_extensions; | ||||
| 		struct mgcp_rtp_codec *last_codec; | ||||
| 	} e1; | ||||
|  | ||||
| }; | ||||
|  | ||||
| struct mgcp_endpoint *mgcp_endp_alloc(struct mgcp_trunk *trunk, unsigned int index); | ||||
| int mgcp_endp_claim(struct mgcp_endpoint *endp, const char *callid); | ||||
| int mgcp_endp_update(struct mgcp_endpoint *endp, struct mgcp_conn *conn, enum mgcp_verb verb); | ||||
| bool mgcp_endp_is_wildcarded(const char *epname); | ||||
| bool mgcp_endp_is_null(const char *epname); | ||||
| struct mgcp_endpoint *mgcp_endp_by_name_trunk(int *cause, const char *epname, | ||||
| 					      const struct mgcp_trunk *trunk); | ||||
| struct mgcp_endpoint *mgcp_endp_by_name(int *cause, const char *epname, | ||||
| 					struct mgcp_config *cfg); | ||||
| bool mgcp_endp_avail(const struct mgcp_endpoint *endp); | ||||
| unsigned int mgcp_endp_num_conns(const struct mgcp_endpoint *endp); | ||||
| bool mgcp_endp_is_full(const struct mgcp_endpoint *endp); | ||||
| void mgcp_endp_add_conn(struct mgcp_endpoint *endp, struct mgcp_conn *conn); | ||||
| void mgcp_endp_remove_conn(struct mgcp_endpoint *endp, struct mgcp_conn *conn); | ||||
| void mgcp_endp_free_conn_oldest(struct mgcp_endpoint *endp); | ||||
| void mgcp_endp_free_conn_all(struct mgcp_endpoint *endp); | ||||
| void mgcp_endp_strip_name(char *epname_stripped, const char *epname, | ||||
| 			 const struct mgcp_trunk *trunk); | ||||
| struct mgcp_endpoint *mgcp_endp_find_specific(const char *epname, | ||||
| 			const struct mgcp_trunk *trunk); | ||||
| void mgcp_endp_update_lco(struct mgcp_endpoint *endp, const struct mgcp_lco *lco); | ||||
| void mgcp_endp_release(struct mgcp_endpoint *endp); | ||||
|  | ||||
| struct mgcp_conn *mgcp_endp_get_conn(struct mgcp_endpoint *endp, const char *id); | ||||
| struct mgcp_conn *mgcp_endp_get_conn_oldest(struct mgcp_endpoint *endp); | ||||
| struct mgcp_conn_rtp *mgcp_endp_get_conn_rtp(struct mgcp_endpoint *endp, | ||||
| 					const char *id); | ||||
| @@ -1,34 +0,0 @@ | ||||
| /* IuUP connection functionalitites */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Pau Espin Pedrol | ||||
|  * | ||||
|  * 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> | ||||
|  | ||||
| struct mgcp_conn_rtp; | ||||
|  | ||||
| int mgcp_conn_iuup_init(struct mgcp_conn_rtp *conn_rtp); | ||||
| void mgcp_conn_iuup_cleanup(struct mgcp_conn_rtp *conn_rtp); | ||||
| int mgcp_conn_iuup_dispatch_rtp(struct msgb *msg); | ||||
| int mgcp_conn_iuup_send_rtp(struct mgcp_conn_rtp *conn_src_rtp, struct mgcp_conn_rtp *conn_dest_rtp, struct msgb *msg); | ||||
| int mgcp_conn_iuup_send_dummy(struct mgcp_conn_rtp *conn_rtp); | ||||
| int mgcp_conn_iuup_event_rx_crcx_mdcx(struct mgcp_conn_rtp *conn_rtp); | ||||
| @@ -1,60 +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> | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
|  | ||||
| struct mgcp_conn; | ||||
| struct mgcp_parse_data; | ||||
| struct mgcp_endpoint; | ||||
| struct mgcp_trunk; | ||||
|  | ||||
| void mgcp_disp_msg(unsigned char *message, unsigned int len, char *preamble); | ||||
|  | ||||
| enum mgcp_connection_mode mgcp_parse_conn_mode(const char *msg); | ||||
|  | ||||
| int mgcp_parse_header(struct mgcp_parse_data *pdata, char *data); | ||||
| int mgcp_parse_hdr_pars(struct mgcp_parse_data *pdata); | ||||
|  | ||||
| int mgcp_parse_osmux_cid(const char *line); | ||||
|  | ||||
| bool mgcp_check_param(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,113 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <inttypes.h> | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include <osmocom/core/socket.h> | ||||
| #include <osmocom/core/osmo_io.h> | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp.h> | ||||
|  | ||||
| /* The following constant defines an RTP dummy payload that is used for | ||||
|  * "UDP Hole Punching" (NAT) */ | ||||
| #define MGCP_DUMMY_LOAD 0x23 | ||||
| static const char rtp_dummy_payload[] = { MGCP_DUMMY_LOAD }; | ||||
|  | ||||
| /* Check if the data in a given message buffer matches the rtp dummy payload | ||||
|  * defined above */ | ||||
| #define mgcp_is_rtp_dummy_payload(msg) \ | ||||
| 	(msgb_length(msg) == sizeof(rtp_dummy_payload) && \ | ||||
| 	memcmp(msgb_data(msg), rtp_dummy_payload, sizeof(rtp_dummy_payload)) == 0) | ||||
|  | ||||
| #define RTP_BUF_SIZE	4096 | ||||
|  | ||||
| struct mgcp_rtp_stream_state { | ||||
| 	uint32_t ssrc; | ||||
| 	uint16_t last_seq; | ||||
| 	uint32_t last_timestamp; | ||||
| 	struct rate_ctr *err_ts_ctr; | ||||
| 	int32_t last_tsdelta; | ||||
| 	uint32_t last_arrival_time; | ||||
| }; | ||||
|  | ||||
| struct mgcp_rtp_state { | ||||
| 	/* has this state structure been initialized? */ | ||||
| 	int initialized; | ||||
|  | ||||
| 	struct { | ||||
| 		/* are we patching the SSRC value? */ | ||||
| 		bool patch_ssrc; | ||||
| 		/* original SSRC (to which we shall patch any different SSRC) */ | ||||
| 		uint32_t orig_ssrc; | ||||
| 		/* offset to apply on the sequence number */ | ||||
| 		int seq_offset; | ||||
| 		/* offset to apply on the timestamp number */ | ||||
| 		int32_t timestamp_offset; | ||||
| 	} patch; | ||||
|  | ||||
| 	/* duration of a packet (FIXME: in which unit?) */ | ||||
| 	uint32_t packet_duration; | ||||
|  | ||||
| 	/* Note: These states are not continuously updated, they serve as an | ||||
| 	 * information source to patch certain values in the RTP header. Do | ||||
| 	 * not use this state if constantly updated data about the RTP stream | ||||
| 	 * is needed. (see also mgcp_patch_and_count() */ | ||||
| 	struct mgcp_rtp_stream_state in_stream; | ||||
| 	struct mgcp_rtp_stream_state out_stream; | ||||
|  | ||||
| 	/* jitter and packet loss calculation */ | ||||
| 	struct { | ||||
| 		int initialized; | ||||
| 		uint16_t base_seq; | ||||
| 		uint16_t max_seq; | ||||
| 		uint32_t ssrc; | ||||
| 		uint32_t jitter; | ||||
| 		int32_t transit; | ||||
| 		int cycles; | ||||
| 	} stats; | ||||
|  | ||||
| 	/* Alternative values for RTP tx, in case no sufficient header | ||||
| 	 * information is available so the header needs to be generated | ||||
| 	 * locally (when just forwarding packets, the header of incoming | ||||
| 	 * data is just re-used) */ | ||||
| 	uint16_t alt_rtp_tx_sequence; | ||||
| 	uint32_t alt_rtp_tx_ssrc; | ||||
| }; | ||||
|  | ||||
| struct mgcp_rtp_tap { | ||||
| 	/* is this tap active (1) or not (0) */ | ||||
| 	int enabled; | ||||
| 	/* IP/port to which we're forwarding the tapped data */ | ||||
| 	struct osmo_sockaddr forward; | ||||
| }; | ||||
|  | ||||
| struct mgcp_conn; | ||||
|  | ||||
| int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct osmo_sockaddr *addr, | ||||
| 	      struct msgb *msg, struct mgcp_conn_rtp *conn_src, | ||||
| 	      struct mgcp_conn_rtp *conn_dst); | ||||
| int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn); | ||||
| int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg); | ||||
| void mgcp_cleanup_rtp_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn); | ||||
| int mgcp_dispatch_e1_bridge_cb(struct msgb *msg); | ||||
| void mgcp_cleanup_e1_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn); | ||||
| int mgcp_conn_rtp_bind_rtp_ports(struct mgcp_conn_rtp *conn, int rtp_port); | ||||
| void mgcp_patch_and_count(const struct mgcp_endpoint *endp, | ||||
| 			  struct mgcp_rtp_state *state, | ||||
| 			  struct mgcp_rtp_end *rtp_end, | ||||
| 			  struct osmo_sockaddr *addr, struct msgb *msg); | ||||
| int mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn); | ||||
|  | ||||
| /* internal RTP Annex A counting */ | ||||
| void mgcp_rtp_annex_count(const struct mgcp_endpoint *endp, struct mgcp_rtp_state *state, | ||||
| 			const uint16_t seq, const int32_t transit, | ||||
| 			const uint32_t ssrc, const bool marker_bit); | ||||
|  | ||||
| void rtpconn_rate_ctr_add(struct mgcp_conn_rtp *conn_rtp, struct mgcp_endpoint *endp, | ||||
| 				 int id, int inc); | ||||
| void rtpconn_rate_ctr_inc(struct mgcp_conn_rtp *conn_rtp, struct mgcp_endpoint *endp, | ||||
| 				 int id); | ||||
| void forward_data_tap(struct osmo_io_fd *iofd, struct mgcp_rtp_tap *tap, struct msgb *msg); | ||||
| uint32_t mgcp_get_current_ts(unsigned codec_rate); | ||||
|  | ||||
| int amr_oa_bwe_convert(struct mgcp_endpoint *endp, struct msgb *msg, bool target_is_oa); | ||||
| @@ -1,140 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <sys/socket.h> | ||||
|  | ||||
| #include <osmocom/core/utils.h> | ||||
| #include <osmocom/core/socket.h> | ||||
| #include <osmocom/mgcp/mgcp_common.h> | ||||
| #include <osmocom/mgcp/mgcp_codec.h> | ||||
|  | ||||
| enum mgcp_verb { | ||||
| 	MGCP_VERB_CRCX, | ||||
| 	MGCP_VERB_MDCX, | ||||
| 	MGCP_VERB_DLCX, | ||||
| 	MGCP_VERB_AUEP, | ||||
| 	MGCP_VERB_RQNT, | ||||
| 	MGCP_VERB_RSIP, | ||||
| }; | ||||
| extern const struct value_string mgcp_verb_names[]; | ||||
| static inline const char *mgcp_verb_name(enum mgcp_verb val) | ||||
| { return get_value_string(mgcp_verb_names, val); } | ||||
|  | ||||
|  | ||||
| #define MGCP_PARSE_SDP_PTIME_UNSET (-1) | ||||
| #define MGCP_PARSE_SDP_MAXPTIME_UNSET (-1) | ||||
| #define MGCP_PARSE_SDP_RTP_PORT_UNSET (0) | ||||
|  | ||||
| struct mgcp_parse_sdp { | ||||
| 	int ptime; | ||||
| 	int maxptime; | ||||
| 	int rtp_port; | ||||
| 	struct osmo_sockaddr rem_addr; /* Only IP address, port is in rtp_port above */ | ||||
| 	struct mgcp_rtp_codecset cset; | ||||
| }; | ||||
|  | ||||
| static inline void mgcp_parse_sdp_init(struct mgcp_parse_sdp *sdp) | ||||
| { | ||||
| 	sdp->ptime = MGCP_PARSE_SDP_PTIME_UNSET; | ||||
| 	sdp->maxptime = MGCP_PARSE_SDP_MAXPTIME_UNSET; | ||||
| 	sdp->rtp_port = MGCP_PARSE_SDP_RTP_PORT_UNSET; | ||||
| 	sdp->rem_addr = (struct osmo_sockaddr){ .u.sa.sa_family = AF_UNSPEC }; | ||||
| 	mgcp_codecset_reset(&sdp->cset); | ||||
| } | ||||
|  | ||||
| /* Local connection options */ | ||||
| struct mgcp_lco { | ||||
| 	bool present; | ||||
| 	char *codec; /* talloc-allocated to some parent */ | ||||
| 	int pkt_period_min; /* time in ms */ | ||||
| 	int pkt_period_max; /* time in ms */ | ||||
| }; | ||||
| static inline void mgcp_lco_init(struct mgcp_lco *lco) | ||||
| { | ||||
| 	*lco = (struct mgcp_lco){}; | ||||
| } | ||||
| char *get_lco_identifier(const char *options); | ||||
| int check_local_cx_options(void *ctx, const char *options); | ||||
|  | ||||
| #define MGCP_PARSE_HDR_PARS_OSMUX_CID_UNSET (-2) | ||||
| #define MGCP_PARSE_HDR_PARS_OSMUX_CID_WILDCARD (-1) | ||||
|  | ||||
| struct mgcp_parse_hdr_pars { | ||||
| 	const char *lco_string; | ||||
| 	struct mgcp_lco lco; | ||||
| 	const char *callid; | ||||
| 	const char *connid; | ||||
| 	enum mgcp_connection_mode mode; | ||||
| 	int remote_osmux_cid; | ||||
| 	bool have_sdp; | ||||
| 	/*! MGCP_X_OSMO_IGN_* flags from 'X-Osmo-IGN:' header */ | ||||
| 	uint32_t x_osmo_ign; | ||||
| }; | ||||
|  | ||||
| static inline void mgcp_parse_hdr_pars_init(struct mgcp_parse_hdr_pars *hpars) | ||||
| { | ||||
| 	hpars->lco_string = NULL; | ||||
| 	mgcp_lco_init(&hpars->lco); | ||||
| 	hpars->callid = NULL; | ||||
| 	hpars->connid = NULL; | ||||
| 	hpars->mode = MGCP_CONN_NONE; | ||||
| 	hpars->remote_osmux_cid = MGCP_PARSE_HDR_PARS_OSMUX_CID_UNSET; | ||||
| 	hpars->have_sdp = false; | ||||
| 	hpars->x_osmo_ign = 0; | ||||
| } | ||||
|  | ||||
| /* Internal structure while parsing a request */ | ||||
| struct mgcp_request_data; | ||||
| struct mgcp_parse_data { | ||||
| 	struct mgcp_request_data *rq; /* backpointer to request context */ | ||||
| 	char *save; | ||||
| 	/* MGCP Header: */ | ||||
| 	char *epname; | ||||
| 	char *trans; | ||||
| 	struct mgcp_parse_hdr_pars hpars; | ||||
| 	/* MGCP Body: */ | ||||
| 	struct mgcp_parse_sdp sdp; | ||||
| }; | ||||
|  | ||||
| /* Request data passed to the request handler */ | ||||
| struct mgcp_request_data { | ||||
| 	enum mgcp_verb verb; | ||||
| 	/* Verb string (e.g. "MDCX") */ | ||||
| 	char name[4+1]; | ||||
|  | ||||
| 	/* Global MGW config */ | ||||
| 	struct mgcp_config *cfg; | ||||
|  | ||||
| 	/* parsing results from the MGCP header (trans id, endpoint name ...) */ | ||||
| 	struct mgcp_parse_data *pdata; | ||||
|  | ||||
| 	/* pointer to endpoint resource (may be NULL for wildcarded requests) */ | ||||
| 	struct mgcp_endpoint *endp; | ||||
|  | ||||
| 	/* pointer to trunk resource */ | ||||
| 	struct mgcp_trunk *trunk; | ||||
|  | ||||
| 	/* set to true when the request has been classified as wildcarded */ | ||||
| 	bool wildcarded; | ||||
|  | ||||
| 	/* Set to true when the request is targeted at the "null" endpoint */ | ||||
| 	bool null_endp; | ||||
|  | ||||
| 	/* contains cause code in case of problems during endp/trunk resolution */ | ||||
| 	int mgcp_cause; | ||||
| }; | ||||
|  | ||||
| char *mgcp_debug_get_last_endpoint_name(void); | ||||
|  | ||||
|  | ||||
| struct mgcp_rtp_end; | ||||
| struct mgcp_endpoint; | ||||
|  | ||||
| uint32_t mgcp_rtp_packet_duration(const struct mgcp_endpoint *endp, | ||||
| 				  const struct mgcp_rtp_end *rtp); | ||||
|  | ||||
| extern const struct value_string mgcp_connection_mode_strs[]; | ||||
| static inline const char *mgcp_cmode_name(enum mgcp_connection_mode mode) | ||||
| { | ||||
| 	return get_value_string(mgcp_connection_mode_strs, mode); | ||||
| } | ||||
| @@ -1,109 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* Global MCGP general rate counters */ | ||||
| enum { | ||||
| 	MGCP_GENERAL_RX_MSGS_TOTAL, | ||||
| 	MGCP_GENERAL_RX_MSGS_RETRANSMITTED, | ||||
| 	MGCP_GENERAL_RX_MSGS_HANDLED, | ||||
| 	MGCP_GENERAL_RX_MSGS_UNHANDLED, | ||||
| 	MGCP_GENERAL_RX_FAIL_MSG_PARSE, | ||||
| 	MGCP_GENERAL_RX_FAIL_NO_ENDPOINT, | ||||
| }; | ||||
|  | ||||
| /* Trunk-global MCGP CRCX related rate counters */ | ||||
| enum { | ||||
| 	MGCP_CRCX_SUCCESS, | ||||
| 	MGCP_CRCX_FAIL_BAD_ACTION, | ||||
| 	MGCP_CRCX_FAIL_UNHANDLED_PARAM, | ||||
| 	MGCP_CRCX_FAIL_MISSING_CALLID, | ||||
| 	MGCP_CRCX_FAIL_INVALID_MODE, | ||||
| 	MGCP_CRCX_FAIL_LIMIT_EXCEEDED, | ||||
| 	MGCP_CRCX_FAIL_UNKNOWN_CALLID, | ||||
| 	MGCP_CRCX_FAIL_ALLOC_CONN, | ||||
| 	MGCP_CRCX_FAIL_NO_REMOTE_CONN_DESC, | ||||
| 	MGCP_CRCX_FAIL_START_RTP, | ||||
| 	MGCP_CRCX_FAIL_NO_OSMUX, | ||||
| 	MGCP_CRCX_FAIL_INVALID_CONN_OPTIONS, | ||||
| 	MGCP_CRCX_FAIL_CODEC_NEGOTIATION, | ||||
| 	MGCP_CRCX_FAIL_BIND_PORT, | ||||
| 	MGCP_CRCX_FAIL_AVAIL, | ||||
| 	MGCP_CRCX_FAIL_CLAIM, | ||||
| }; | ||||
|  | ||||
| /* Trunk-global MCGP MDCX related rate counters */ | ||||
| enum { | ||||
| 	MGCP_MDCX_SUCCESS, | ||||
| 	MGCP_MDCX_FAIL_WILDCARD, | ||||
| 	MGCP_MDCX_FAIL_NO_CONN, | ||||
| 	MGCP_MDCX_FAIL_INVALID_CALLID, | ||||
| 	MGCP_MDCX_FAIL_INVALID_CONNID, | ||||
| 	MGCP_MDCX_FAIL_UNHANDLED_PARAM, | ||||
| 	MGCP_MDCX_FAIL_NO_CONNID, | ||||
| 	MGCP_MDCX_FAIL_CONN_NOT_FOUND, | ||||
| 	MGCP_MDCX_FAIL_INVALID_MODE, | ||||
| 	MGCP_MDCX_FAIL_INVALID_CONN_OPTIONS, | ||||
| 	MGCP_MDCX_FAIL_NO_REMOTE_CONN_DESC, | ||||
| 	MGCP_MDCX_FAIL_BIND_PORT, | ||||
| 	MGCP_MDCX_FAIL_AVAIL, | ||||
| }; | ||||
|  | ||||
| /* Trunk-global MCGP DLCX related rate counters */ | ||||
| enum { | ||||
| 	MGCP_DLCX_SUCCESS, | ||||
| 	MGCP_DLCX_FAIL_NO_CONN, | ||||
| 	MGCP_DLCX_FAIL_INVALID_CALLID, | ||||
| 	MGCP_DLCX_FAIL_INVALID_CONNID, | ||||
| 	MGCP_DLCX_FAIL_UNHANDLED_PARAM, | ||||
| 	MGCP_DLCX_FAIL_AVAIL, | ||||
| }; | ||||
|  | ||||
| /* Trunk-global E1 related counters */ | ||||
| enum { | ||||
|         E1_I460_TRAU_RX_FAIL_CTR, | ||||
|         E1_I460_TRAU_TX_FAIL_CTR, | ||||
|         E1_I460_TRAU_MUX_EMPTY_CTR, | ||||
| }; | ||||
|  | ||||
| /* NOTE: When adding counters, also the dump_ratectr_* routines in vty.c must be updated. */ | ||||
|  | ||||
| struct mgcp_ratectr_global { | ||||
| 	/* Rate counter group which contains stats for generic MGCP events. */ | ||||
| 	struct rate_ctr_group *mgcp_general_ctr_group; | ||||
| }; | ||||
|  | ||||
| struct mgcp_ratectr_trunk { | ||||
| 	/* Rate counter group which contains stats for processed CRCX commands. */ | ||||
| 	struct rate_ctr_group *mgcp_crcx_ctr_group; | ||||
| 	/* Rate counter group which contains stats for processed MDCX commands. */ | ||||
| 	struct rate_ctr_group *mgcp_mdcx_ctr_group; | ||||
| 	/* Rate counter group which contains stats for processed DLCX commands. */ | ||||
| 	struct rate_ctr_group *mgcp_dlcx_ctr_group; | ||||
| 	/* Rate counter group which aggregates stats of individual RTP connections. */ | ||||
| 	struct rate_ctr_group *all_rtp_conn_stats; | ||||
| 	/* Rate counter group which aggregates stats of individual Osmux connections. */ | ||||
| 	struct rate_ctr_group *all_osmux_conn_stats; | ||||
| 	/* Rate counter group which contains stats for E1 events (only valid for E1 trunks) */ | ||||
| 	struct rate_ctr_group *e1_stats; | ||||
| }; | ||||
|  | ||||
| struct mgcp_config; | ||||
| struct mgcp_trunk; | ||||
|  | ||||
| int mgcp_ratectr_global_alloc(struct mgcp_config *cfg); | ||||
| void mgcp_ratectr_global_free(struct mgcp_config *cfg); | ||||
| int mgcp_ratectr_trunk_alloc(struct mgcp_trunk *trunk); | ||||
| void mgcp_ratectr_trunk_free(struct mgcp_trunk *trunk); | ||||
|  | ||||
| /* Trunk-global common stat items */ | ||||
| enum { | ||||
| 	TRUNK_STAT_ENDPOINTS_TOTAL, | ||||
| 	TRUNK_STAT_ENDPOINTS_USED, | ||||
| }; | ||||
|  | ||||
| struct mgcp_stat_trunk { | ||||
| 	/* Stat item group which contains general status values of the trunk. */ | ||||
| 	struct osmo_stat_item_group *common; | ||||
| }; | ||||
|  | ||||
| int mgcp_stat_trunk_alloc(struct mgcp_trunk *trunk); | ||||
| void mgcp_stat_trunk_free(struct mgcp_trunk *trunk); | ||||
| @@ -1,53 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <inttypes.h> | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include <osmocom/core/socket.h> | ||||
| #include <osmocom/core/osmo_io.h> | ||||
|  | ||||
| #include <osmocom/mgcp/mgcp.h> | ||||
| #include <osmocom/mgcp/mgcp_codec.h> | ||||
|  | ||||
| /* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */ | ||||
| struct mgcp_rtp_end { | ||||
| 	struct mgcp_conn_rtp *conn_rtp; /* backpointer */ | ||||
| 	/* remote IP address of the RTP socket */ | ||||
| 	struct osmo_sockaddr addr; | ||||
|  | ||||
| 	/* in network byte order */ | ||||
| 	uint16_t rtcp_port; | ||||
|  | ||||
| 	struct mgcp_rtp_codecset cset; | ||||
|  | ||||
| 	/* per endpoint data */ | ||||
| 	int  frames_per_packet; | ||||
| 	uint32_t packet_duration_ms; | ||||
| 	int maximum_packet_time; /* -1: not set */ | ||||
| 	/* are we transmitting packets (true) or dropping (false) outbound packets */ | ||||
| 	bool output_enabled; | ||||
| 	/* FIXME: This parameter can be set + printed, but is nowhere used! */ | ||||
| 	int force_output_ptime; | ||||
|  | ||||
| 	/* RTP patching */ | ||||
| 	bool force_constant_ssrc; | ||||
| 	/* 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_io_fd *rtp; | ||||
| 	struct osmo_io_fd *rtcp; | ||||
|  | ||||
| 	/* local UDP port number of the RTP socket; RTCP is +1 */ | ||||
| 	int local_port; | ||||
| 	/* where the endpoint RTP connection binds to, set during CRCX and | ||||
| 	 * possibly updated during MDCX */ | ||||
| 	char local_addr[INET6_ADDRSTRLEN]; | ||||
| }; | ||||
|  | ||||
| void mgcp_rtp_end_init(struct mgcp_rtp_end *end, struct mgcp_conn_rtp *conn_rtp); | ||||
| void mgcp_rtp_end_cleanup(struct mgcp_rtp_end *end); | ||||
| void mgcp_rtp_end_set_packet_duration_ms(struct mgcp_rtp_end *end, uint32_t packet_duration_ms); | ||||
| bool mgcp_rtp_end_remote_addr_available(const struct mgcp_rtp_end *rtp_end); | ||||
| void mgcp_rtp_end_free_port(struct mgcp_rtp_end *end); | ||||
| @@ -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 | ||||
|  | ||||
| struct mgcp_parse_data; | ||||
|  | ||||
| int mgcp_parse_sdp_data(struct mgcp_parse_data *p); | ||||
|  | ||||
| int mgcp_write_response_sdp(const struct mgcp_endpoint *endp, | ||||
| 			    const struct mgcp_conn_rtp *conn, struct msgb *sdp, | ||||
| 			    const char *addr); | ||||
| @@ -1,35 +0,0 @@ | ||||
| /* A Media Gateway Control Protocol Media Gateway: RFC 3435 */ | ||||
| /* The statistics generator */ | ||||
|  | ||||
| /* | ||||
|  * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org> | ||||
|  * (C) 2009-2012 by On-Waves | ||||
|  * (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
|  * the Free Software Foundation; either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU Affero General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Affero General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <inttypes.h> | ||||
|  | ||||
| void mgcp_format_stats(char *str, size_t str_len,  struct mgcp_conn *conn); | ||||
|  | ||||
| /* Exposed for test purposes only, do not use actively */ | ||||
| void calc_loss(struct mgcp_conn_rtp *conn, uint32_t *expected, int *loss); | ||||
|  | ||||
| /* Exposed for test purposes only, do not use actively */ | ||||
| uint32_t calc_jitter(struct mgcp_rtp_state *); | ||||
| @@ -1,52 +0,0 @@ | ||||
| /* | ||||
|  * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * Author: Eric Wild | ||||
|  * | ||||
|  * 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/>. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdatomic.h> | ||||
| #include <stdbool.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| struct spsc { | ||||
| 	atomic_uint readptr; | ||||
| 	atomic_uint writeptr; | ||||
|  | ||||
| 	int efd_r, efd_w; /* eventfds used to block/notify readers/writers */ | ||||
|  | ||||
| 	int count; | ||||
| 	int size_per_buf; | ||||
|  | ||||
| 	void *buf; /* buffer size count*size_per_buf */ | ||||
| 	uintptr_t data[0]; /* count sized array of pointers to size_per_buf chunks in buf array*/ | ||||
| }; | ||||
|  | ||||
| struct qchan { | ||||
| 	struct spsc *a; | ||||
| 	struct spsc *b; | ||||
| }; | ||||
|  | ||||
| bool spsc_push(struct spsc *q, void *elem); | ||||
| bool spsc_pop(struct spsc *q, void *elem); | ||||
| ssize_t spsc_prep_pop(struct spsc *q); | ||||
| int spsc_get_a_rdfd(struct qchan *q); | ||||
|  | ||||
| struct qchan spsc_chan_init(void *talloc_ctx, unsigned int count, unsigned int size_per_buf); | ||||
| struct qchan spsc_chan_init_ex(void *talloc_ctx, unsigned int count, unsigned int size_per_buf, bool blockr_a, | ||||
| 			       bool blockw_a, bool blockr_b, bool blockw_b); | ||||
| void spsc_chan_close(struct qchan *q); | ||||
| @@ -1,87 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/gsm/i460_mux.h> | ||||
| #include <osmocom/abis/e1_input.h> | ||||
| #include <osmocom/mgcp/mgcp_conn.h> | ||||
| #include <osmocom/mgcp/mgcp_network.h> | ||||
| #include <osmocom/mgcp/mgcp_ratectr.h> | ||||
|  | ||||
| #define LOGPTRUNK(trunk, cat, level, fmt, args...) \ | ||||
| LOGP(cat, level, "trunk:%u " fmt, \ | ||||
|      trunk ? trunk->trunk_nr : 0, \ | ||||
|      ## args) | ||||
|  | ||||
| enum mgcp_trunk_type { | ||||
| 	MGCP_TRUNK_VIRTUAL, | ||||
| 	MGCP_TRUNK_E1, | ||||
| }; | ||||
|  | ||||
| extern const struct value_string mgcp_trunk_type_strs[]; | ||||
| static inline const char *mgcp_trunk_type_strs_str(enum mgcp_trunk_type val) | ||||
| { return get_value_string(mgcp_trunk_type_strs, val); } | ||||
|  | ||||
| struct mgcp_trunk { | ||||
| 	struct llist_head entry; | ||||
|  | ||||
| 	struct mgcp_config *cfg; | ||||
|  | ||||
| 	unsigned int trunk_nr; | ||||
| 	enum mgcp_trunk_type trunk_type; | ||||
|  | ||||
| 	int audio_send_ptime; | ||||
| 	int audio_send_name; | ||||
|  | ||||
| 	int omit_rtcp; | ||||
| 	int keepalive_interval; | ||||
|  | ||||
| 	/* RTP patching */ | ||||
| 	bool force_constant_ssrc; | ||||
| 	int force_aligned_timing; | ||||
| 	bool rfc5993_hr_convert; | ||||
|  | ||||
| 	/* spec handling */ | ||||
| 	int force_realloc; | ||||
|  | ||||
| 	/* timer */ | ||||
| 	struct osmo_timer_list keepalive_timer; | ||||
|  | ||||
| 	/* When set, incoming RTP packets are not filtered | ||||
| 	 * when ports and ip-address do not match (debug) */ | ||||
| 	int rtp_accept_all; | ||||
|  | ||||
| 	unsigned int number_endpoints; | ||||
| 	struct mgcp_endpoint **endpoints; | ||||
|  | ||||
| 	/* rate counters and stat items to measure the trunks overall performance and health */ | ||||
| 	struct mgcp_ratectr_trunk ratectr; | ||||
| 	struct mgcp_stat_trunk stats; | ||||
|  | ||||
| 	union { | ||||
| 		/* Virtual trunk specific */ | ||||
| 		struct { | ||||
| 			unsigned int vty_number_endpoints; | ||||
| 		} v; | ||||
| 		/* E1 specific */ | ||||
| 		struct { | ||||
| 			unsigned int vty_line_nr; | ||||
| 			uint8_t ts_usecount[NUM_E1_TS-1]; | ||||
| 			struct osmo_i460_timeslot i460_ts[NUM_E1_TS-1]; | ||||
| 			/* Note: on an E1 line TS 0 is devoted to framing and | ||||
| 			 * alignment and therefore only NUM_E1_TS-1 timeslots | ||||
| 			 * are available for traffic. */ | ||||
| 		} e1; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| struct mgcp_trunk *mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, unsigned int nr); | ||||
| int mgcp_trunk_equip(struct mgcp_trunk *trunk); | ||||
| struct mgcp_trunk *mgcp_trunk_by_num(const struct mgcp_config *cfg, enum mgcp_trunk_type ttype, unsigned int nr); | ||||
| struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname); | ||||
| int e1_trunk_nr_from_epname(unsigned int *trunk_nr, const char *epname); | ||||
| struct mgcp_trunk *mgcp_trunk_by_line_num(const struct mgcp_config *cfg, unsigned int num); | ||||
| int mgcp_trunk_allocate_conn_rtp_ports(struct mgcp_trunk *trunk, struct mgcp_conn_rtp *conn_rtp); | ||||
|  | ||||
| /* The virtual trunk is always created on trunk id 0 for historical reasons, | ||||
|  * use this define constant as ID when allocating a virtual trunk. Other | ||||
|  * trunks may be assigned with arbritrary id numbers */ | ||||
| #define MGCP_VIRT_TRUNK_ID 0 | ||||
| @@ -1,41 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| #include <osmocom/core/socket.h> | ||||
|  | ||||
| #include <osmocom/netif/osmux.h> | ||||
| struct mgcp_conn_rtp; | ||||
| struct mgcp_trunk; | ||||
| struct mgcp_endpoint; | ||||
| struct mgcp_conn_rtp; | ||||
|  | ||||
| int osmux_init(struct mgcp_trunk *trunk); | ||||
| int osmux_init_conn(struct mgcp_conn_rtp *conn); | ||||
| int conn_osmux_enable(struct mgcp_conn_rtp *conn); | ||||
| void conn_osmux_disable(struct mgcp_conn_rtp *conn); | ||||
| int conn_osmux_event_rx_crcx_mdcx(struct mgcp_conn_rtp *conn); | ||||
| int conn_osmux_send_rtp(struct mgcp_conn_rtp *conn, struct msgb *msg); | ||||
| int osmux_send_dummy(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 conn_osmux_enable. */ | ||||
| 	OSMUX_STATE_ENABLED,	  /* Osmux was initialized by \ref conn_osmux_enable and can process frames */ | ||||
| }; | ||||
|  | ||||
| extern const struct value_string osmux_state_strs[]; | ||||
| static inline const char *osmux_state_str(enum osmux_state val) | ||||
| { return get_value_string(osmux_state_strs, val); } | ||||
|  | ||||
| enum osmux_usage { | ||||
| 	OSMUX_USAGE_OFF = 0, | ||||
| 	OSMUX_USAGE_ON = 1, | ||||
| 	OSMUX_USAGE_ONLY = 2, | ||||
| }; | ||||
| @@ -1,12 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/vty/command.h> | ||||
|  | ||||
| enum mgcp_vty_node { | ||||
| 	MGCP_NODE = _LAST_OSMOVTY_NODE + 1, | ||||
| 	TRUNK_NODE, | ||||
| }; | ||||
|  | ||||
| enum mgw_vty_cmd_attr { | ||||
| 	MGW_CMD_ATTR_NEWCONN = 0, | ||||
| }; | ||||
| @@ -1,31 +0,0 @@ | ||||
| BUILT_SOURCES = \ | ||||
| 	mgcp_common.h \ | ||||
| 	version.h \ | ||||
| 	$(NULL) | ||||
|  | ||||
| noinst_HEADERS = \ | ||||
| 	mgcp_client_internal.h \ | ||||
| 	mgcp_client_pool_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 | ||||
|  | ||||
| version.h: version.h.tpl | ||||
| 	$(AM_V_GEN)$(MKDIR_P) $(dir $@) | ||||
| 	$(AM_V_GEN)sed \ | ||||
| 		-e "s/{{VERSION}}/$$(echo '@VERSION@' | cut -d. -f1-3)/g" \ | ||||
| 		-e "s/{{VERSION_MAJOR}}/$$(echo '@VERSION@' | cut -d. -f1)/g" \ | ||||
| 		-e "s/{{VERSION_MINOR}}/$$(echo '@VERSION@' | cut -d. -f2)/g" \ | ||||
| 		-e "s/{{VERSION_PATCH}}/$$(echo '@VERSION@' | cut -d. -f3)/g" \ | ||||
| 		$< > $@ | ||||
|  | ||||
| EXTRA_DIST = \ | ||||
| 	     version.h.tpl \ | ||||
| 	     $(NULL) | ||||
|  | ||||
| CLEANFILES = \ | ||||
| 	     mgcp_common.h \ | ||||
| 	     version.h \ | ||||
| 	     $(NULL) | ||||
| @@ -1,7 +0,0 @@ | ||||
| #include <osmocom/core/defs.h> | ||||
|  | ||||
| #if BUILDING_LIBOSMOMGCPCLIENT | ||||
| # define OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT(text) | ||||
| #else | ||||
| # define OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT(text) OSMO_DEPRECATED(text) | ||||
| #endif | ||||
| @@ -1,127 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <arpa/inet.h> | ||||
|  | ||||
| #include <osmocom/mgcp_client/defs.h> | ||||
| #include <osmocom/mgcp_client/mgcp_common.h> | ||||
|  | ||||
| /* See also: RFC 3435, chapter 3.5 Transmission over UDP */ | ||||
| #define MGCP_CLIENT_LOCAL_ADDR_DEFAULT NULL /* INADDR(6)_ANY */ | ||||
| #define MGCP_CLIENT_LOCAL_PORT_DEFAULT 0 | ||||
| #define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1" | ||||
| #define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427 | ||||
| #define MGCP_CLIENT_KEEPALIVE_DEFAULT_ENDP "null" | ||||
| #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]; | ||||
|  | ||||
| 	/* The user may configure certain endpoint names that are reset via DLCX | ||||
| 	 * on startup. Usually this will be one wildcarded endpoint e.g. | ||||
| 	 * 'rtpbridge/(wildcard)' or a number of specific E1 like e.g. | ||||
| 	 * 'ds/e1-0/s-3/su16-4' */ | ||||
| 	struct llist_head reset_epnames; | ||||
|  | ||||
| 	/* human readable name / description */ | ||||
| 	char *description; | ||||
|  | ||||
| 	struct { | ||||
| 		uint32_t timeout_sec; | ||||
| 		uint32_t req_interval_sec; | ||||
| 		char req_endpoint_name[MGCP_ENDPOINT_MAXLEN]; | ||||
| 	} keepalive; | ||||
| }; | ||||
|  | ||||
| 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,	/* 3GPP TS 48.103 table 5.4.2.2.1 */ | ||||
| 	CODEC_GSMHR_8000_1 = 111,	/* 3GPP TS 48.103 table 5.4.2.2.1 */ | ||||
| 	CODEC_AMR_8000_1 = 112,		/* 3GPP TS 48.103 table 5.4.2.2.1 */ | ||||
| 	CODEC_AMRWB_16000_1 = 113,	/* 3GPP TS 48.103 table 5.4.2.2.1 */ | ||||
| 	CODEC_IUFP = 96, | ||||
| 	CODEC_CLEARMODE = 120,		/* 3GPP TS 48.103 table 5.4.2.2.1 */ | ||||
| }; | ||||
| /* 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; | ||||
| }; | ||||
|  | ||||
| int ptmap_cmp(const struct ptmap *a, const struct ptmap *b); | ||||
|  | ||||
| enum mgcp_verb { | ||||
| 	MGCP_VERB_CRCX, | ||||
| 	MGCP_VERB_MDCX, | ||||
| 	MGCP_VERB_DLCX, | ||||
| 	MGCP_VERB_AUEP, | ||||
| 	MGCP_VERB_RSIP, | ||||
| }; | ||||
|  | ||||
| struct mgcp_client_conf *mgcp_client_conf_alloc(void *ctx); | ||||
| void mgcp_client_conf_init(struct mgcp_client_conf *conf) OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use mgcp_client_conf_alloc() (or even better, switch to the mgcp_client_pool API!)"); | ||||
| 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); | ||||
| int mgcp_client_connect2(struct mgcp_client *mgcp, unsigned int retry_n_ports) OSMO_DEPRECATED("Use mgcp_client_connect() instead"); | ||||
| void mgcp_client_disconnect(struct mgcp_client *mgcp); | ||||
|  | ||||
| const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp); | ||||
| uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp); | ||||
| uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp) OSMO_DEPRECATED("deprecated, returns 0"); | ||||
|  | ||||
| const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp); | ||||
| const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp); | ||||
| const char *mgcp_client_e1_epname(void *ctx, const struct mgcp_client *mgcp, uint8_t trunk_id, uint8_t ts, | ||||
| 				  uint8_t rate, uint8_t offset); | ||||
|  | ||||
| enum mgcp_connection_mode; | ||||
|  | ||||
| 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); | ||||
|  | ||||
| const char *mgcp_client_name(const struct mgcp_client *mgcp); | ||||
| @@ -1,55 +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); | ||||
|  | ||||
| const struct mgcp_conn_peer *osmo_mgcpc_ep_ci_get_remote_rtp_info(const struct osmo_mgcpc_ep_ci *ci); | ||||
|  | ||||
| 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_local_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); | ||||
| struct mgcp_client *osmo_mgcpc_ep_client(const struct osmo_mgcpc_ep *ep); | ||||
|  | ||||
| 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,78 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/mgcp_client/mgcp_common.h> | ||||
| #include <osmocom/mgcp_client/mgcp_client.h> | ||||
| #include <osmocom/gsm/protocol/gsm_04_08.h> | ||||
|  | ||||
| /*! This struct organizes the connection infromation one connection side | ||||
|  *  (either remote or local). It is used to pass parameters (local) to the FSM | ||||
|  *  and get responses (remote) from the FSM as pointer attached to the FSM | ||||
|  *  event. | ||||
|  * | ||||
|  *  When modifiying a connection, the endpoint and call_id members may be left | ||||
|  *  unpopulated. The call_id field is ignored in this case. If an endpoint | ||||
|  *  identifier is supplied it is checked against the internal state to make | ||||
|  *  sure it is correct. */ | ||||
| struct mgcp_conn_peer { | ||||
| 	/*! RTP connection IP-Address (optional, string e.g. "127.0.0.1") */ | ||||
| 	char addr[INET6_ADDRSTRLEN]; | ||||
|  | ||||
| 	/*! RTP connection IP-Port (optional)  */ | ||||
| 	uint16_t port; | ||||
|  | ||||
| 	/*! RTP endpoint */ | ||||
| 	char endpoint[MGCP_ENDPOINT_MAXLEN]; | ||||
|  | ||||
| 	/*! CALL ID (unique per connection) */ | ||||
| 	unsigned int call_id; | ||||
|  | ||||
| 	/*! RTP packetization interval (optional) */ | ||||
| 	unsigned int ptime; | ||||
|  | ||||
| 	/*! Deprecated. Use only ptmap[].codec in new code. */ | ||||
| 	enum mgcp_codecs codecs[MGCP_MAX_CODECS] | ||||
| 		OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use ptmap[i].codec instead"); | ||||
| 	unsigned int codecs_len | ||||
| 		OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use ptmap[] and ptmap_len instead"); | ||||
|  | ||||
| 	/*! 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) | ||||
| 	OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use osmo_mgcpc_ep_alloc() and osmo_mgcpc_ep_ci_add() instead"); | ||||
| int mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer) | ||||
| 	OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use osmo_mgcpc_ep_ci_request() instead"); | ||||
| void mgcp_conn_delete(struct osmo_fsm_inst *fi) | ||||
| 	OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use osmo_mgcpc_ep_ci_dlcx() instead"); | ||||
|  | ||||
| const char *mgcp_conn_get_ci(struct osmo_fsm_inst *fi) | ||||
| 	OSMO_DEPRECATED_OUTSIDE_LIBOSMOMGCPCLIENT("use osmo_mgcpc_ep_ci.mgcp_ci_str instead"); | ||||
| struct mgcp_client *mgcp_conn_get_client(struct osmo_fsm_inst *fi); | ||||
|  | ||||
| const char *osmo_mgcpc_conn_peer_name(const struct mgcp_conn_peer *info); | ||||
| @@ -1,103 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <osmocom/core/osmo_io.h> | ||||
| #include <osmocom/core/timer.h> | ||||
|  | ||||
| #include <osmocom/mgcp_client/mgcp_client.h> | ||||
|  | ||||
| #define MSGB_CB_MGCP_TRANS_ID 0 | ||||
|  | ||||
| /* Struct that holds one endpoint name */ | ||||
| struct reset_ep { | ||||
| 	struct llist_head list; | ||||
| 	char name[MGCP_ENDPOINT_MAXLEN]; | ||||
| }; | ||||
|  | ||||
| struct mgcp_client { | ||||
| 	struct mgcp_client_conf actual; | ||||
| 	struct osmo_io_fd *iofd; | ||||
| 	mgcp_trans_id_t next_trans_id; | ||||
| 	struct llist_head responses_pending; | ||||
| 	struct mgcp_client_pool_member *pool_member; | ||||
| 	struct osmo_timer_list keepalive_tx_timer; | ||||
| 	struct osmo_timer_list keepalive_rx_timer; | ||||
| 	bool conn_up; | ||||
| }; | ||||
|  | ||||
| struct mgcp_response_head { | ||||
| 	int response_code; | ||||
| 	mgcp_trans_id_t trans_id; | ||||
| 	char comment[MGCP_COMMENT_MAXLEN]; | ||||
| 	char conn_id[MGCP_CONN_ID_MAXLEN]; | ||||
| 	char endpoint[MGCP_ENDPOINT_MAXLEN]; | ||||
| 	bool x_osmo_osmux_use; | ||||
| 	uint8_t x_osmo_osmux_cid; | ||||
| }; | ||||
|  | ||||
| struct mgcp_response { | ||||
| 	char *body; | ||||
| 	struct mgcp_response_head head; | ||||
| 	uint16_t audio_port; | ||||
| 	char audio_ip[INET6_ADDRSTRLEN]; | ||||
| 	unsigned int ptime; | ||||
| 	struct ptmap ptmap[MGCP_MAX_CODECS]; | ||||
| 	unsigned int ptmap_len; | ||||
| }; | ||||
|  | ||||
| /* 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); | ||||
|  | ||||
| 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); | ||||
|  | ||||
| #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; | ||||
| 	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; | ||||
| }; | ||||
|  | ||||
| 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); | ||||
|  | ||||
| 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); | ||||
| @@ -1,24 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdbool.h> | ||||
|  | ||||
| #include <osmocom/vty/vty.h> | ||||
|  | ||||
| struct mgcp_client; | ||||
| struct mgcp_client_pool; | ||||
| struct mgcp_client_pool_member; | ||||
|  | ||||
| struct mgcp_client_pool *mgcp_client_pool_alloc(void *talloc_ctx); | ||||
|  | ||||
| void mgcp_client_pool_vty_init(int parent_node, int mgw_node, const char *indent, struct mgcp_client_pool *pool); | ||||
| int mgcp_client_pool_config_write(struct vty *vty, const char *indent); | ||||
| unsigned int mgcp_client_pool_connect(struct mgcp_client_pool *pool); | ||||
| void mgcp_client_pool_register_single(struct mgcp_client_pool *pool, struct mgcp_client *mgcp_client); | ||||
| bool mgcp_client_pool_empty(const struct mgcp_client_pool *pool); | ||||
|  | ||||
| struct mgcp_client *mgcp_client_pool_get(struct mgcp_client_pool *pool); | ||||
| void mgcp_client_pool_put(struct mgcp_client *mgcp_client); | ||||
|  | ||||
| struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_client_pool *pool, unsigned int nr); | ||||
| struct mgcp_client *mgcp_client_pool_member_get(struct mgcp_client_pool_member *pool_member); | ||||
| bool mgcp_client_pool_member_is_blocked(const struct mgcp_client_pool_member *pool_member); | ||||
| @@ -1,52 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* Struct to handle a pool of MGWs. (Use _pool functions) */ | ||||
| struct mgcp_client_pool { | ||||
|  | ||||
| 	/* A pointer to a 'single' mgcp client. This is a non-pooled MGCP client that is configured using | ||||
| 	 * mgcp_client_vty_init() and actively registered by the API user using mgcp_client_pool_register_single() */ | ||||
| 	struct mgcp_client *mgcp_client_single; | ||||
|  | ||||
| 	/* A list that manages the pool members (see mgcp_client_pool_member->list above) */ | ||||
| 	struct llist_head member_list; | ||||
|  | ||||
| 	/* String to use for indentation when writing the configuration file to the VTY. This field is populated by | ||||
| 	 * mgcp_client_pool_vty_init() */ | ||||
| 	char *vty_indent; | ||||
|  | ||||
| 	/* VTY node specification used with this pool. This field is populated by mgcp_client_pool_vty_init() */ | ||||
| 	struct cmd_node *vty_node; | ||||
| }; | ||||
|  | ||||
| /* Struct to handle a member of a pool of MGWs. */ | ||||
| struct mgcp_client_pool_member { | ||||
| 	/* Entry in llist mgcp_client_pool->pool. */ | ||||
| 	struct llist_head list; | ||||
|  | ||||
| 	/* The pool managing this object: */ | ||||
| 	struct mgcp_client_pool *pool; | ||||
|  | ||||
| 	/* Reference number assinged by VTY. This number is used to manage the pool from the VTY and to identify it in | ||||
| 	 * the log. */ | ||||
| 	unsigned int nr; | ||||
|  | ||||
| 	/* MGCP client configuration, this is not the running configuration, when mgcp_client_init() is executed, a | ||||
| 	 * copy of this config is created. */ | ||||
| 	struct mgcp_client_conf conf; | ||||
|  | ||||
| 	/* MGCP client descriptor, will be automatically allocated when mgcp_client_pool_connect() is called. (the MGCP | ||||
| 	 * client is connected when this pointer is populated) */ | ||||
| 	struct mgcp_client *client; | ||||
|  | ||||
| 	/* A pool member may be set as 'blocked' from the VTY, this means that the pool member may still work and serve | ||||
| 	 * ongoing calls, but it won't be picked from the pool anymore. */ | ||||
| 	bool blocked; | ||||
|  | ||||
| 	/* Reference counter to count how often this pool member is currently picked. */ | ||||
| 	unsigned int refcount; | ||||
| }; | ||||
|  | ||||
| struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr); | ||||
| void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member); | ||||
| int mgcp_client_pool_member_reinit_client(struct mgcp_client_pool_member *pool_member); | ||||
| const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member); | ||||
| @@ -1,16 +0,0 @@ | ||||
| #pragma once | ||||
|  | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION {{VERSION}} | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION_STR "{{VERSION}}" | ||||
|  | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION_MAJOR {{VERSION_MAJOR}} | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION_MINOR {{VERSION_MINOR}} | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION_PATCH {{VERSION_PATCH}} | ||||
|  | ||||
| #define LIBOSMO_MGCP_CLIENT_VERSION_GREATER_EQUAL(major, minor, patch) \ | ||||
| 	(LIBOSMO_MGCP_CLIENT_VERSION_MAJOR > (major) || \ | ||||
| 	 (LIBOSMO_MGCP_CLIENT_VERSION_MAJOR == (major) && \ | ||||
| 	  LIBOSMO_MGCP_CLIENT_VERSION_MINOR > (minor)) || \ | ||||
| 	 (LIBOSMO_MGCP_CLIENT_VERSION_MAJOR == (major) && \ | ||||
| 	  LIBOSMO_MGCP_CLIENT_VERSION_MINOR == (minor) && \ | ||||
| 	  LIBOSMO_MGCP_CLIENT_VERSION_PATCH >= (patch))) | ||||
							
								
								
									
										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 */ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user