mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-10-23 08:12:01 +00:00
Compare commits
2734 Commits
openbsc/0.
...
stsp/show_
Author | SHA1 | Date | |
---|---|---|---|
|
e3c2eaeec0 | ||
|
704c4f0adf | ||
|
bc0346e080 | ||
|
5928dc9345 | ||
|
04da5e5e98 | ||
|
54b4f82f91 | ||
|
3d7b58d77a | ||
|
604410cd13 | ||
|
b340f90c9e | ||
|
3c8ccb6724 | ||
|
d4e6aa42ca | ||
|
e6df0e47e7 | ||
|
54eb0e1204 | ||
|
b38fb8911f | ||
|
1b3a385b9d | ||
|
dbd70c7b68 | ||
|
a19547b7a1 | ||
|
06823731d8 | ||
|
ed1cff5ab9 | ||
|
f2321b7a72 | ||
|
4219904cb2 | ||
|
b2753f2044 | ||
|
ba61f68137 | ||
|
9e1d164469 | ||
|
0ec1d4e17c | ||
|
d761d355f9 | ||
|
8d064dfd24 | ||
|
7181cc1f02 | ||
|
60f8e31a2f | ||
|
086c3f3c67 | ||
|
d0b470d1a9 | ||
|
77f76d0be5 | ||
|
892dec0be9 | ||
|
c430d19112 | ||
|
7b8e419d92 | ||
|
4f7613eeb1 | ||
|
01f039538e | ||
|
d2e3a52230 | ||
|
2924825bc6 | ||
|
bd86f94a09 | ||
|
1083533db4 | ||
|
0793d2f5d5 | ||
|
a8c6a9c37a | ||
|
2da99a2946 | ||
|
c3eed40f00 | ||
|
515e341ff6 | ||
|
8bda7a7766 | ||
|
df5d219f39 | ||
|
5656fbf49d | ||
|
19d640e806 | ||
|
207ab51270 | ||
|
c3cc654add | ||
|
b911b879d8 | ||
|
af07f66ca3 | ||
|
dd0c522cd4 | ||
|
37d11c80da | ||
|
1355d7e4f7 | ||
|
fdd603c4c8 | ||
|
1fc6999a77 | ||
|
220f487238 | ||
|
edc00f4ea7 | ||
|
a49e32a1ab | ||
|
dd4ede34ad | ||
|
3aa815755d | ||
|
3261dc7540 | ||
|
771b26a043 | ||
|
36a81129ec | ||
|
a390d0ba52 | ||
|
b759473d10 | ||
|
c3cfae2cf8 | ||
|
3cbfb8a53c | ||
|
275ac97036 | ||
|
abe8c897fd | ||
|
e9d645b3b3 | ||
|
7f0966c13d | ||
|
55295f7b07 | ||
|
9d25d7a2e6 | ||
|
490cbaa89e | ||
|
eb0bde09bb | ||
|
3b12e1b011 | ||
|
2138779559 | ||
|
12943ea0c1 | ||
|
6efb43a210 | ||
|
03cc48474c | ||
|
5672563f7e | ||
|
106743c66b | ||
|
8890dfa634 | ||
|
10f32dbfbf | ||
|
e35eeae8e0 | ||
|
abbb6b9088 | ||
|
3f35a3708a | ||
|
33eafe050b | ||
|
1d1b98f4a4 | ||
|
a0ac30faa5 | ||
|
49e3d5a9c9 | ||
|
3338135ead | ||
|
5dbfc78aff | ||
|
7bc5552512 | ||
|
a330b864e5 | ||
|
7df419b434 | ||
|
7cedfd753b | ||
|
23b8e29835 | ||
|
1c3287f1db | ||
|
922ae9a5bf | ||
|
189d6bf4d4 | ||
|
c8f37cb4d6 | ||
|
c0dcc3c60c | ||
|
230e4fc270 | ||
|
ead2f60f73 | ||
|
f8bfbe8b14 | ||
|
ffd75e420c | ||
|
01d24a3281 | ||
|
0be3ce66c0 | ||
|
fcd0655176 | ||
|
48454983c4 | ||
|
9a3543a8d4 | ||
|
465446b4b4 | ||
|
b597b4fc9d | ||
|
d20910c655 | ||
|
677f4ad968 | ||
|
7c20c9de5a | ||
|
839fc954d0 | ||
|
d164b05655 | ||
|
a896f9cdeb | ||
|
1b0cf6fa1c | ||
|
9bf7c53779 | ||
|
6be0fdb5e4 | ||
|
641c4d47b9 | ||
|
c1b9fa158e | ||
|
6a421f1b6f | ||
|
f1889d8640 | ||
|
2982e42d93 | ||
|
ddf1f9d7d5 | ||
|
653c4ff354 | ||
|
4efce88a62 | ||
|
e7d27aeae1 | ||
|
e6f172dd57 | ||
|
b969455941 | ||
|
54dd4b3f72 | ||
|
dbd88e5167 | ||
|
87203f2a37 | ||
|
1cb1e38dbc | ||
|
e726d4fad2 | ||
|
c341388b30 | ||
|
7bf4ce3aed | ||
|
f4c0e37352 | ||
|
06da85ed3a | ||
|
1dc6be6a82 | ||
|
8348abb372 | ||
|
d8d7b4b188 | ||
|
31c4305225 | ||
|
c7a228aceb | ||
|
e472b4e39a | ||
|
8970c497bc | ||
|
1e0b9f872c | ||
|
8863f7ae64 | ||
|
1ae2d5ebf4 | ||
|
5852a78d2e | ||
|
59e2d518fd | ||
|
062b0f0eee | ||
|
71c619ee05 | ||
|
e3b5de2285 | ||
|
f96e46fcce | ||
|
88d4dae645 | ||
|
8042539444 | ||
|
6ba4406c47 | ||
|
1e940d615a | ||
|
fde78ad412 | ||
|
3d9b656a1c | ||
|
2152f8523e | ||
|
c5ecebb711 | ||
|
020e89bce9 | ||
|
6779354245 | ||
|
87bd9be0b0 | ||
|
f83ec56212 | ||
|
1c8d67d7f5 | ||
|
9d4f1d57f3 | ||
|
d95ab1e9ad | ||
|
a1fa2f4bc3 | ||
|
c221b7ad01 | ||
|
f19acc9a35 | ||
|
53f2bd0443 | ||
|
0c5a16c253 | ||
|
32330aa9be | ||
|
beabe15526 | ||
|
8ec0365ae9 | ||
|
725f924316 | ||
|
3a8e723a0d | ||
|
97df691307 | ||
|
d049a66b79 | ||
|
48dd6c3e73 | ||
|
7eaeb5a416 | ||
|
2fb853fb35 | ||
|
bf0ab74b23 | ||
|
e9920f24b1 | ||
|
b6f6c23fa1 | ||
|
73a93bd4ef | ||
|
28295b939c | ||
|
6542f52dc1 | ||
|
dd9f6cd377 | ||
|
4b60d0782c | ||
|
58cfd25c2f | ||
|
3d24d2947e | ||
|
4d254dd490 | ||
|
c7a58cb239 | ||
|
8f282f23c2 | ||
|
52c43258e5 | ||
|
0c99bb469f | ||
|
ad0161db6c | ||
|
3671968824 | ||
|
4a1e442daa | ||
|
9c10f4a9dc | ||
|
3d80064c59 | ||
|
52bdd62eb3 | ||
|
d0d62499c3 | ||
|
4a6c56bbfb | ||
|
dea26c68e4 | ||
|
4a6d8d95a4 | ||
|
c5f60fb64e | ||
|
02da674ed4 | ||
|
569dc7b6d8 | ||
|
ff4cb11e17 | ||
|
03a3cc7ba5 | ||
|
e802f1a54f | ||
|
1f9a576cdc | ||
|
bc822624e4 | ||
|
b31d2c62a6 | ||
|
3c8d627a08 | ||
|
868e442bd0 | ||
|
b343807cf8 | ||
|
be89bc7278 | ||
|
14af83239a | ||
|
ff6900943a | ||
|
f49519ef46 | ||
|
4d62a999f9 | ||
|
92d6dcbbaf | ||
|
d11e8f358f | ||
|
f694033bc6 | ||
|
06e14c6b72 | ||
|
d7d926620c | ||
|
ac64f87708 | ||
|
a5d7e61308 | ||
|
4bb662b473 | ||
|
d0e4764ecd | ||
|
20515896b3 | ||
|
f226bd5236 | ||
|
b65195fa16 | ||
|
0854d6b156 | ||
|
fad3309556 | ||
|
d5429bb79b | ||
|
3fb8a7ba87 | ||
|
bbb17f0148 | ||
|
ca52991d6e | ||
|
8008ac0175 | ||
|
4755091a8a | ||
|
9282db8be8 | ||
|
d36641a832 | ||
|
4331f25e42 | ||
|
b68ad96406 | ||
|
6571561192 | ||
|
1016fb5c16 | ||
|
48c23b6416 | ||
|
9a9d0560b2 | ||
|
c3bd466259 | ||
|
e44dbcf30a | ||
|
d4ee5923c9 | ||
|
dc6a7cd406 | ||
|
8fd871143f | ||
|
1a232bd900 | ||
|
2e7e4b93a0 | ||
|
30f532b9bd | ||
|
6424b5633c | ||
|
075fc11fce | ||
|
717c7b9692 | ||
|
10d64d5d66 | ||
|
815124952b | ||
|
a1756f320a | ||
|
069e53fbb5 | ||
|
0e5a7c409c | ||
|
2d503d03f4 | ||
|
29dfc91b93 | ||
|
21b48e96c3 | ||
|
3728471963 | ||
|
e7542288bb | ||
|
48a0c6a940 | ||
|
b6cd7934de | ||
|
9f52b06975 | ||
|
f817814c68 | ||
|
7b423edb56 | ||
|
a183a6ed20 | ||
|
0bc77b1283 | ||
|
ffebe6e938 | ||
|
39a7c75814 | ||
|
4c30529a84 | ||
|
3eb991ead2 | ||
|
079d4e0fe9 | ||
|
9e95604394 | ||
|
0c0d70582c | ||
|
85929a7be7 | ||
|
68bd8e434a | ||
|
220dc0c7f6 | ||
|
eab5f594b0 | ||
|
5a44d25ad3 | ||
|
2f8b9d25f8 | ||
|
8b1a2f8cd7 | ||
|
70fdd24d04 | ||
|
9b97b007df | ||
|
a60bb3dd28 | ||
|
c51c1e7950 | ||
|
33e1357a90 | ||
|
4a824ca8fc | ||
|
aef68387ae | ||
|
71d082bec7 | ||
|
8254cf75bf | ||
|
3f86c523ee | ||
|
2abd5e1663 | ||
|
645eb62283 | ||
|
7fe00fb9be | ||
|
0483f33820 | ||
|
0de69a2501 | ||
|
5f72f6fccc | ||
|
271ceca862 | ||
|
2faeb1ac6c | ||
|
722bbb402f | ||
|
f8aeb2cccb | ||
|
f14cb3535c | ||
|
872671e01b | ||
|
a229756885 | ||
|
54050a28ed | ||
|
854bcc2b7b | ||
|
e586f41692 | ||
|
67798617b5 | ||
|
b4999b60d4 | ||
|
94bbc73bce | ||
|
6f483d3a05 | ||
|
1fe2647c5d | ||
|
5265bea76c | ||
|
320960cf9d | ||
|
9f77d7bd0e | ||
|
71124de33c | ||
|
defb6c95c1 | ||
|
845a3a4c59 | ||
|
f39d03ad21 | ||
|
1ebf23b7fe | ||
|
7590ff3fd6 | ||
|
34ce3d93c5 | ||
|
5121576b0c | ||
|
7b62d54b52 | ||
|
2b6c5407b6 | ||
|
7507aef92b | ||
|
93ffbd0029 | ||
|
638ad068e8 | ||
|
fd2c1f90ba | ||
|
310b730798 | ||
|
7b5dbc2805 | ||
|
c6e8a01e70 | ||
|
50eb66996d | ||
|
086067f0a1 | ||
|
7bb383a45c | ||
|
6d8e5198ad | ||
|
6f0e50c833 | ||
|
a18001d506 | ||
|
8b8fca757e | ||
|
2b229ffaef | ||
|
cb1e366094 | ||
|
11e4e41ffc | ||
|
7636c0833b | ||
|
dc9de23523 | ||
|
d75f11e6f2 | ||
|
f9685c1461 | ||
|
689e7e5562 | ||
|
2d92162a6b | ||
|
7f3724e04d | ||
|
4aa75e74f4 | ||
|
36891a7d9d | ||
|
b1e6b37493 | ||
|
9311881bb1 | ||
|
16dcf2ae22 | ||
|
baaf3e242e | ||
|
f7e9a349ef | ||
|
3521af7f3a | ||
|
ce49258a12 | ||
|
dd22a30d75 | ||
|
ca2778cd22 | ||
|
476c4bb7d1 | ||
|
ca06e040cc | ||
|
ac27a99021 | ||
|
88d4fc70d5 | ||
|
6dd0fc685b | ||
|
c103c64e7d | ||
|
3d6cb338c6 | ||
|
e7379fe657 | ||
|
99c9707d1c | ||
|
11368118c9 | ||
|
2459f9fb5a | ||
|
8a215c3d25 | ||
|
b3c7c79c04 | ||
|
dfb138ff09 | ||
|
0722ffc743 | ||
|
6d804b1a7e | ||
|
abf53d87b6 | ||
|
0b61932e7f | ||
|
6ee49d8416 | ||
|
3f8a8f7736 | ||
|
0436e42472 | ||
|
d3270a9c05 | ||
|
5616cdde3a | ||
|
f01bd13ca1 | ||
|
f480b35893 | ||
|
e0d5caa916 | ||
|
acc6e8323a | ||
|
534034580c | ||
|
d015cbd65d | ||
|
27355c9c65 | ||
|
058cd573d8 | ||
|
44468ad531 | ||
|
577a125652 | ||
|
8b24e9f203 | ||
|
c634063ea3 | ||
|
0e5d807297 | ||
|
a369e24cb9 | ||
|
a42855f09f | ||
|
9762b4c579 | ||
|
fe291de36b | ||
|
d2b3399c04 | ||
|
40a91b38ec | ||
|
7a250cc9d9 | ||
|
89a8e722ed | ||
|
94f49a4f08 | ||
|
f13b3c968f | ||
|
a66d8cfcb5 | ||
|
a1613695d1 | ||
|
2c16beeb64 | ||
|
87bfed259d | ||
|
b726c2c72b | ||
|
8dc8f23c07 | ||
|
db0e380558 | ||
|
50422016f0 | ||
|
5ba6fb3ef4 | ||
|
1013550218 | ||
|
17a29ef311 | ||
|
2b5fb8ed66 | ||
|
4f8da6dfd5 | ||
|
48324fed11 | ||
|
bcfee2a0a6 | ||
|
d09b26d487 | ||
|
89837d422e | ||
|
22a735bfd4 | ||
|
e1f8b9244a | ||
|
e02e1e782f | ||
|
d675515bd4 | ||
|
ba1468e4c6 | ||
|
b39053ad6d | ||
|
7d17c3ef61 | ||
|
35706ddd80 | ||
|
26adfd099b | ||
|
a5c71bf39a | ||
|
150abfffbf | ||
|
2d02775b91 | ||
|
725f3f1de0 | ||
|
dac5867af5 | ||
|
3f940fc9ee | ||
|
6934a0fa9e | ||
|
f188623091 | ||
|
42def7205b | ||
|
6c4382b998 | ||
|
471ac7d99c | ||
|
cc7db18e1a | ||
|
d0ef1ed78c | ||
|
f6e51709fc | ||
|
76f048a1fd | ||
|
d32b6d13ed | ||
|
e610e700da | ||
|
881064e9b8 | ||
|
47e1781907 | ||
|
a5e369300f | ||
|
93bafb611a | ||
|
59504dc80f | ||
|
f5e74b5988 | ||
|
b7f41d554b | ||
|
34f012639d | ||
|
c8fc41c2f6 | ||
|
04db87a89f | ||
|
3d07aef800 | ||
|
98bc7fa50d | ||
|
fd161ccce8 | ||
|
34be86b93c | ||
|
fa9abaca26 | ||
|
80abe522e2 | ||
|
532480a705 | ||
|
db142dc59d | ||
|
a191dcd8f0 | ||
|
b42dc43e28 | ||
|
9fdb4e5f2f | ||
|
5fa8b083cc | ||
|
549ebc7d6c | ||
|
6903848029 | ||
|
b735390284 | ||
|
59d57da1e5 | ||
|
0c32685898 | ||
|
ea619f1704 | ||
|
ecdfd6d097 | ||
|
37f9252361 | ||
|
2fa74faf92 | ||
|
3cbc052101 | ||
|
73ed45599b | ||
|
2e109f08c0 | ||
|
28786bb209 | ||
|
2c1f8c8ceb | ||
|
3d6b9f4fe9 | ||
|
11ecc9320c | ||
|
49012f14dd | ||
|
736474ce45 | ||
|
ef022783c3 | ||
|
eaaee92db5 | ||
|
814fef04b0 | ||
|
3df5d53a04 | ||
|
4f8e34b226 | ||
|
08586c68db | ||
|
bd33f54444 | ||
|
82caa3e9b7 | ||
|
688231331b | ||
|
3e6768937e | ||
|
d53e9b51b6 | ||
|
c3b94f92c5 | ||
|
1611df5226 | ||
|
b8e8d0a402 | ||
|
c59e28fa5e | ||
|
1cd50585e9 | ||
|
4a7d0e79cc | ||
|
2327cede9c | ||
|
8d35965f24 | ||
|
c346f87371 | ||
|
8825c69409 | ||
|
e14f4b93f2 | ||
|
2440f49a72 | ||
|
ec16c16193 | ||
|
f788d93382 | ||
|
2b9c53408f | ||
|
ce090f890b | ||
|
50669bebdb | ||
|
42eb0141d7 | ||
|
640b794de0 | ||
|
7398395cc0 | ||
|
1a60644eb2 | ||
|
ea11bf8095 | ||
|
06d39fdb72 | ||
|
b90eabfb46 | ||
|
2c05f75bbf | ||
|
e235441f73 | ||
|
6a366055dd | ||
|
05667a0aff | ||
|
ac1f1436e9 | ||
|
43273c63de | ||
|
eb52aad198 | ||
|
143a274051 | ||
|
487436138e | ||
|
be67050a36 | ||
|
3c165d02bb | ||
|
54f44ec585 | ||
|
18712f0bd1 | ||
|
96df077083 | ||
|
b0993e61d0 | ||
|
7b6bae6584 | ||
|
28f637ec2c | ||
|
e78ae21ff4 | ||
|
2d521a0296 | ||
|
27681a3407 | ||
|
402006dfdf | ||
|
c69ee8527c | ||
|
16606c9007 | ||
|
5085e0bf4c | ||
|
26f6ced05c | ||
|
80ccb95267 | ||
|
96638d141e | ||
|
309425e105 | ||
|
38cba5aa79 | ||
|
fb89b9b00b | ||
|
c04c6ed4af | ||
|
7d3093506a | ||
|
bb42eee113 | ||
|
beade314d0 | ||
|
58273f4b88 | ||
|
eae68292bd | ||
|
fe7be8ddd0 | ||
|
c1efa67c13 | ||
|
dfe48fdecf | ||
|
af9a9b0b44 | ||
|
87ef68eb33 | ||
|
f926f45c4b | ||
|
194b4cb4fd | ||
|
b4ecc1d43b | ||
|
6bbcfbb78c | ||
|
8136e4b9af | ||
|
7975ddf0ec | ||
|
4579978983 | ||
|
46edbc4162 | ||
|
686f4d6a85 | ||
|
424656e527 | ||
|
591e1d7daa | ||
|
b748012d31 | ||
|
350f93e1e4 | ||
|
0c566a444b | ||
|
5e5d94cd1b | ||
|
d37981e8f7 | ||
|
b4cb838092 | ||
|
05adbdcb2e | ||
|
87c0056480 | ||
|
ae9beda150 | ||
|
1b76a03cdd | ||
|
8c53c59bfb | ||
|
582e4f6276 | ||
|
fbd96f55fd | ||
|
39ae17fb69 | ||
|
4c2d4ab5db | ||
|
e072da9d2e | ||
|
20436c8506 | ||
|
30f7310a62 | ||
|
3edd0b03d5 | ||
|
b6591072d8 | ||
|
f1a56dea7b | ||
|
1e646f02f4 | ||
|
756fb30c8a | ||
|
a6ba6a370b | ||
|
5275c152e5 | ||
|
2d66bb2099 | ||
|
63c18ca791 | ||
|
3316397921 | ||
|
92f552f344 | ||
|
38e9ea3f7f | ||
|
a8f91df851 | ||
|
b81031292b | ||
|
ea291e3004 | ||
|
0867b72055 | ||
|
0a45c1e77d | ||
|
aba82097b6 | ||
|
c6a44bbab9 | ||
|
caeb62d7ff | ||
|
7e5bb6283d | ||
|
3ea9fece6d | ||
|
255dbfe655 | ||
|
23c3aa37ac | ||
|
c3f72f63af | ||
|
2afffd5cf6 | ||
|
e289a2a86a | ||
|
8d878e8a28 | ||
|
57e8a1fee0 | ||
|
3163f336f2 | ||
|
dab3e34d0b | ||
|
89d20b60ef | ||
|
23d37c91af | ||
|
a9f2bb5ab8 | ||
|
5e0b0a658f | ||
|
663debcb90 | ||
|
43d86bfc94 | ||
|
c13e687742 | ||
|
77c8d5ffb5 | ||
|
d90fa42dc9 | ||
|
0ce98c749a | ||
|
73f83d533b | ||
|
d8b45778de | ||
|
0b11db7e9f | ||
|
f1f34360fb | ||
|
2c7f83762a | ||
|
b3e116c74d | ||
|
22611be3d9 | ||
|
308cb0719d | ||
|
7c359eb4b4 | ||
|
8ce66fd19e | ||
|
1e918c3d31 | ||
|
ffaed9eed2 | ||
|
378a492fd9 | ||
|
0b607297e6 | ||
|
d1fdefedf1 | ||
|
6d82c351b9 | ||
|
ab04fb2d50 | ||
|
292ec58e67 | ||
|
2867f883a1 | ||
|
b3d8706bea | ||
|
aa386d29fd | ||
|
c2f2ad8a5f | ||
|
7b6673fa06 | ||
|
58f446ca08 | ||
|
a173566b35 | ||
|
21b269f814 | ||
|
c17cdb40b5 | ||
|
fac9758820 | ||
|
5b2363ebb2 | ||
|
af241727a9 | ||
|
1dee2b6e96 | ||
|
3ecfbbba6f | ||
|
770f3e32e0 | ||
|
7bc6986f6b | ||
|
6b7b319d54 | ||
|
61329d45b8 | ||
|
6292c8d44d | ||
|
9bc42ec47b | ||
|
7e82ad20fa | ||
|
4b95b5401c | ||
|
b847a21fa4 | ||
|
d75864f6f5 | ||
|
746c7896cb | ||
|
f4daf16c8d | ||
|
bfa8878a07 | ||
|
4ac3aee711 | ||
|
3ec03d5048 | ||
|
a536fc644b | ||
|
d5d39ae2b6 | ||
|
423269f803 | ||
|
baa6c5546e | ||
|
a0a08d80b8 | ||
|
d35fc4408c | ||
|
a2ef7d6477 | ||
|
b74a2c8e29 | ||
|
cd150a8f74 | ||
|
2ae305de46 | ||
|
7130683ffe | ||
|
20423ea6cf | ||
|
4e699a9cbf | ||
|
76a0ad7fe9 | ||
|
5486025b18 | ||
|
3673380cdb | ||
|
723f7c7db3 | ||
|
91dfa86c18 | ||
|
1f6a9ba7e5 | ||
|
dbb6392368 | ||
|
2a63d01c1e | ||
|
b6f565c97d | ||
|
2f44693fad | ||
|
158b5d2bdb | ||
|
beca090586 | ||
|
3ed214c7b0 | ||
|
5f0c71b7d5 | ||
|
c5e75f3e6a | ||
|
d3b7fa837d | ||
|
b91e6002a6 | ||
|
7af652c0b2 | ||
|
fdd9ad7c40 | ||
|
f58852d117 | ||
|
9518ffc299 | ||
|
4673b86f3d | ||
|
d384110d3d | ||
|
6e999b75fa | ||
|
cf7933892a | ||
|
e2eb5cb6a1 | ||
|
2e84b60652 | ||
|
ec1b5a0e9e | ||
|
350533cc32 | ||
|
e3dc498e01 | ||
|
e443145d3e | ||
|
d1c0e3755f | ||
|
bbbcfe5b73 | ||
|
745857277c | ||
|
34b8b5b29b | ||
|
c165876223 | ||
|
f29dd5f15b | ||
|
8151648ceb | ||
|
4007468014 | ||
|
c6926d064d | ||
|
67933a19d6 | ||
|
7c989e7ced | ||
|
14314bd808 | ||
|
b1c227e5ab | ||
|
17a6bab150 | ||
|
d091b8de21 | ||
|
15fcd10fde | ||
|
b572d7c45e | ||
|
9ddd8e6267 | ||
|
9331df16cf | ||
|
1de159168c | ||
|
82040101eb | ||
|
b997f84443 | ||
|
5aa5196fbf | ||
|
4011e728d2 | ||
|
9759374adb | ||
|
a3d93ed2f9 | ||
|
5754206379 | ||
|
176b62a80c | ||
|
e6052c4cc7 | ||
|
9f8f9b8021 | ||
|
3955025c2a | ||
|
93408ae727 | ||
|
896c6f8e9e | ||
|
488902db2a | ||
|
dd49beebb1 | ||
|
3f2212235c | ||
|
b0cc64274a | ||
|
efedf80526 | ||
|
82c8f75f71 | ||
|
241bda03b4 | ||
|
29048b2a80 | ||
|
f8e02aa4e3 | ||
|
349108801f | ||
|
832afa3f4b | ||
|
285df2ec62 | ||
|
3201988f7b | ||
|
c1fbdedcd3 | ||
|
2ebacce4fa | ||
|
0fcd2e2fec | ||
|
e152ffe14d | ||
|
b8afb5fda2 | ||
|
9df268e217 | ||
|
3adb23cfc5 | ||
|
a66852525a | ||
|
0434efa077 | ||
|
ec744655b4 | ||
|
f5fe31d513 | ||
|
ae3f0718f1 | ||
|
35a65edd10 | ||
|
f5713a5c63 | ||
|
6079528b48 | ||
|
9329e6fb49 | ||
|
3af9660e51 | ||
|
9f5d231f00 | ||
|
3e62d415ac | ||
|
ddee01fa8f | ||
|
d7df7ae392 | ||
|
f9f4387686 | ||
|
7ec8ca422c | ||
|
2b2429eb59 | ||
|
dbc72b37ee | ||
|
e98ba82d2b | ||
|
49393e128e | ||
|
62ff38447c | ||
|
f97ee04563 | ||
|
97165f386f | ||
|
e1197481e5 | ||
|
a9ca72d907 | ||
|
85f8fdabc3 | ||
|
51fbc5f6e0 | ||
|
0f46f9ca5a | ||
|
69e9c0dfc6 | ||
|
82dd983dd8 | ||
|
307e40648e | ||
|
5b692d0a5c | ||
|
ddf4e1e114 | ||
|
ed04fcc179 | ||
|
aea28ceb27 | ||
|
ea8e983514 | ||
|
7184bd088e | ||
|
8495e03588 | ||
|
5493d87f95 | ||
|
2fa7d8464f | ||
|
63081fe34d | ||
|
e21cf38da4 | ||
|
8a4d2e756d | ||
|
c08ee71bff | ||
|
9a7e25b9c3 | ||
|
a8d8e93086 | ||
|
34e2b09278 | ||
|
cd5e52605c | ||
|
7c55ede8b1 | ||
|
5f2524fe3d | ||
|
5d547a4358 | ||
|
d8aa412c46 | ||
|
564c06525b | ||
|
31760a1f60 | ||
|
23d77d56ea | ||
|
50f1c0af56 | ||
|
eff215a8bb | ||
|
7ca035deca | ||
|
85234a32db | ||
|
842674b8b3 | ||
|
28903a99ea | ||
|
d3fa84dbba | ||
|
53373bca8f | ||
|
121e9a4164 | ||
|
3ffce19cb4 | ||
|
35697b9a10 | ||
|
299a999465 | ||
|
e01f5050ef | ||
|
8db12e4263 | ||
|
aafff96c40 | ||
|
26679e0475 | ||
|
27c3e76aa7 | ||
|
0c1bc26b64 | ||
|
36212f2850 | ||
|
3a434f8e8c | ||
|
e43f8e0400 | ||
|
59a1bf3dae | ||
|
5fa7e36bbc | ||
|
f3f3505f49 | ||
|
c9ac20ea43 | ||
|
a6e81a0986 | ||
|
312bf6ce8b | ||
|
8bb6204d50 | ||
|
2abf2b072d | ||
|
e98c9c7136 | ||
|
84ae27e731 | ||
|
44ed4979c9 | ||
|
f1a61bb99f | ||
|
4936448761 | ||
|
82f5ecde6a | ||
|
70cf7290da | ||
|
a47b401990 | ||
|
714b170f89 | ||
|
7a301d3576 | ||
|
f220b52df3 | ||
|
e5686f21d6 | ||
|
687f048ab0 | ||
|
9bcb1a56cb | ||
|
adb86759da | ||
|
2826df56b2 | ||
|
de392254ff | ||
|
7dd2eed6d3 | ||
|
c6a65511f3 | ||
|
740e65fb7b | ||
|
3a38ee6c3d | ||
|
cf1302e4cb | ||
|
0d929be826 | ||
|
4e875aec0f | ||
|
f9b212fabd | ||
|
d617c5d3ac | ||
|
4554a62c4d | ||
|
37984bdb1b | ||
|
56ea30ff3f | ||
|
3ad0346f00 | ||
|
044fbe6568 | ||
|
d2fa7a509a | ||
|
f4afcf0b23 | ||
|
10cd11345c | ||
|
8c515272c3 | ||
|
961bd0b121 | ||
|
531734a547 | ||
|
51273157fa | ||
|
6a1d172c95 | ||
|
45ee133d1d | ||
|
5b38312b92 | ||
|
49b83d8f67 | ||
|
a7313dd886 | ||
|
fea1df8587 | ||
|
1b0e5540db | ||
|
73828152d9 | ||
|
fc7add20e1 | ||
|
f4a3123145 | ||
|
0ade63233b | ||
|
fa0f71526c | ||
|
58d5430dd5 | ||
|
127fc93a13 | ||
|
547f048c89 | ||
|
fd1187e2e9 | ||
|
1901b92f0c | ||
|
69da1d453c | ||
|
03933a49de | ||
|
389a62d752 | ||
|
5ac4aadd1a | ||
|
1330478aa5 | ||
|
d35957a7d9 | ||
|
d58c033305 | ||
|
e7bcdc3bda | ||
|
9158089fa8 | ||
|
3fbf0a3735 | ||
|
2259c7528e | ||
|
28e9f60404 | ||
|
bafc1e4cfe | ||
|
e9f420d487 | ||
|
8239e063b9 | ||
|
1da0a7e229 | ||
|
6d575cbe57 | ||
|
34cf923704 | ||
|
9c4f1d6fd0 | ||
|
1bf8617610 | ||
|
de76661cf3 | ||
|
f9f44901a2 | ||
|
fec29ab4e9 | ||
|
7ba088bdf0 | ||
|
91e0e1b038 | ||
|
22a7142129 | ||
|
6cacc56d8e | ||
|
5cb480a4c0 | ||
|
cdc548cb0a | ||
|
69a720f3be | ||
|
da5359f1b6 | ||
|
720372e4e8 | ||
|
4adca4e8af | ||
|
0a8cf32a48 | ||
|
53d51f501c | ||
|
da8a19fec0 | ||
|
36948bf7c7 | ||
|
4d2b3ff6a2 | ||
|
d010c49407 | ||
|
bee75969cc | ||
|
ee07e4f75d | ||
|
f6e4d08219 | ||
|
328d2f78c1 | ||
|
23d09cc904 | ||
|
ee1e5d758e | ||
|
e38fb66f4b | ||
|
956d856b61 | ||
|
ba0525e3d8 | ||
|
28a70f20cd | ||
|
9d8f506f7f | ||
|
5d5c31a367 | ||
|
5c7dcf9665 | ||
|
3f015f04b1 | ||
|
c14574b567 | ||
|
d8352d75b6 | ||
|
c696cc28d8 | ||
|
e1ba781f7b | ||
|
f8c701008b | ||
|
1ae3ebd68b | ||
|
ca2361c237 | ||
|
d53c6046bc | ||
|
e5a0798c9c | ||
|
8c5b073072 | ||
|
8defadbdd2 | ||
|
59c1b645e2 | ||
|
87c83d0b89 | ||
|
d8660ef090 | ||
|
c6d51f5fb4 | ||
|
996ec1d731 | ||
|
18d3049612 | ||
|
237fee649e | ||
|
936b890f71 | ||
|
be4bebaad0 | ||
|
4573ca8834 | ||
|
52c0bd3025 | ||
|
bc44330671 | ||
|
3fdba2ed5a | ||
|
7559910e8c | ||
|
99a50b3529 | ||
|
10fc024472 | ||
|
2f67125c32 | ||
|
800126b1f3 | ||
|
cd865d62f0 | ||
|
085500807c | ||
|
ff4b630de9 | ||
|
817bc32696 | ||
|
a9905a51f9 | ||
|
7174b169e0 | ||
|
d121ea6124 | ||
|
f977320736 | ||
|
ba9e9f63bc | ||
|
8d1ffbd3ba | ||
|
005f175c3b | ||
|
fc1be3a0c1 | ||
|
e54cd1555a | ||
|
2c8b58139f | ||
|
1aa0e47104 | ||
|
508514c7c5 | ||
|
29d926be12 | ||
|
231653a8d0 | ||
|
4b2cbdab3e | ||
|
1ba50c6598 | ||
|
dba6d1af69 | ||
|
20bd6bfef5 | ||
|
1ed9a8673d | ||
|
b6c2db569f | ||
|
d9b1d49485 | ||
|
4960fab767 | ||
|
e2ed8e6cc3 | ||
|
334af5dd9d | ||
|
5e95a41194 | ||
|
e5e78c21bb | ||
|
ff252bb801 | ||
|
8fbfaa51bb | ||
|
4ae165da61 | ||
|
a4370dd969 | ||
|
273f875c42 | ||
|
6a8cbe9718 | ||
|
97b6bfa996 | ||
|
1b9c815024 | ||
|
557c84e9f7 | ||
|
a2bbc5ec0e | ||
|
ae2c18c57b | ||
|
0d21ac8f5a | ||
|
24e3c3e136 | ||
|
6187e010a8 | ||
|
3c820ee532 | ||
|
3d3aa8fb88 | ||
|
4034897038 | ||
|
ad945b6aa7 | ||
|
9cfe037559 | ||
|
063a802d46 | ||
|
390e910125 | ||
|
a208c734a2 | ||
|
16c3f57ed6 | ||
|
3317c84c16 | ||
|
c83cd898ef | ||
|
e921e32c82 | ||
|
c227594394 | ||
|
5b664f4b9b | ||
|
bb3d6785e1 | ||
|
30f7bcbd79 | ||
|
c8a614d2e9 | ||
|
65482c919f | ||
|
98fa3dc1c6 | ||
|
9270dc8ca3 | ||
|
4316cb2f25 | ||
|
292769e19e | ||
|
46caed8fc4 | ||
|
64630cccc7 | ||
|
11cb27ece6 | ||
|
568a727550 | ||
|
9c534fdbe8 | ||
|
89ef324eab | ||
|
f06046b6af | ||
|
d739f092be | ||
|
d48f057328 | ||
|
fe60cfb1d6 | ||
|
69ca8f01ec | ||
|
537d480f39 | ||
|
d1554ecb78 | ||
|
044ce5fb84 | ||
|
133e8624ef | ||
|
cf15187458 | ||
|
a777c9ee3d | ||
|
9861c122dd | ||
|
fa07b489dc | ||
|
f3316e30d6 | ||
|
d74cce266b | ||
|
6962127982 | ||
|
1afe7c7fe5 | ||
|
20626dde8f | ||
|
6598ded5cd | ||
|
15a40db606 | ||
|
b45e4d80b6 | ||
|
641d387409 | ||
|
2aedfbdfe1 | ||
|
62a63f54a6 | ||
|
6cf0249dac | ||
|
cdeb815c78 | ||
|
b3cbd9aa3b | ||
|
0e62e595a6 | ||
|
06cfe00c71 | ||
|
8b4e584621 | ||
|
7a77d0155f | ||
|
a174a47811 | ||
|
615ed46a6a | ||
|
11cb7a9fd9 | ||
|
130be40c3e | ||
|
d3496aed69 | ||
|
3e4e8cfb74 | ||
|
925504bfe0 | ||
|
e57e0fa701 | ||
|
732665269e | ||
|
354d1f3084 | ||
|
c6a8d09b78 | ||
|
51cf69cdb4 | ||
|
4b4a187b4f | ||
|
53122b09d0 | ||
|
c21dcb20e5 | ||
|
c8a6c13e4e | ||
|
ffbf45e09e | ||
|
08c508f84a | ||
|
d721579a6a | ||
|
92360b15e3 | ||
|
614aba391d | ||
|
79135acbb8 | ||
|
e5ba92e7be | ||
|
e18f78e81d | ||
|
8fc568466c | ||
|
0190d790b6 | ||
|
c390ae8eaf | ||
|
e6ed009a36 | ||
|
ceef936ea8 | ||
|
57e95a22f0 | ||
|
ecff2424e5 | ||
|
b9845f937e | ||
|
6b39feedc7 | ||
|
601cf12f81 | ||
|
eb98c74fb1 | ||
|
22df4ac848 | ||
|
78fa99103d | ||
|
6a19dd0d31 | ||
|
9450882901 | ||
|
39ba248608 | ||
|
4d4944a07d | ||
|
93e795c1fd | ||
|
4c97435b35 | ||
|
d17bc7b3a8 | ||
|
a334e90ddf | ||
|
aeadf261e5 | ||
|
ca7d05bdb9 | ||
|
a611da8407 | ||
|
0eaad4f216 | ||
|
e9f7c9925c | ||
|
29d58b734d | ||
|
c9dbe3c7b1 | ||
|
2f25764e51 | ||
|
5425e5ea27 | ||
|
8159455506 | ||
|
e019b564ec | ||
|
eb48cafac9 | ||
|
778c7d1544 | ||
|
ba43365e96 | ||
|
469f992b2b | ||
|
b618c7ec9b | ||
|
daaea0c84f | ||
|
5c06e4045a | ||
|
145e2532f4 | ||
|
666e36aea9 | ||
|
5f8a0c5c70 | ||
|
d15409876c | ||
|
4672059d94 | ||
|
a2c41c42b1 | ||
|
1e365477ee | ||
|
14a434b9d6 | ||
|
7c19c6b406 | ||
|
42cf2e03c9 | ||
|
dcbc83355e | ||
|
e3c391e8d0 | ||
|
af1b968b22 | ||
|
b69518f383 | ||
|
58ec15c4ed | ||
|
9f95ae8885 | ||
|
8ee53ed9ec | ||
|
694d98042f | ||
|
e2ac6b77fe | ||
|
9705671025 | ||
|
fce6971fe3 | ||
|
8a8df80772 | ||
|
0363d1bb97 | ||
|
aa0cecd9b7 | ||
|
2dd18bdd87 | ||
|
57ee780789 | ||
|
797eb7b592 | ||
|
4bb3fccb75 | ||
|
b25c8342cc | ||
|
c58a1e573b | ||
|
ce97a06fa3 | ||
|
0958938d4e | ||
|
f2e114ac85 | ||
|
65b0efe56e | ||
|
c36a13b073 | ||
|
9cb249bf84 | ||
|
5fd0c64e0a | ||
|
b7ae0b34f9 | ||
|
a5a6da46a0 | ||
|
39c430ee29 | ||
|
66e7106d39 | ||
|
ccd2312d10 | ||
|
7605bdc02c | ||
|
08bb84b04e | ||
|
9270d99f3d | ||
|
5e4b88cbb2 | ||
|
8ee13e2937 | ||
|
10c0f56a0e | ||
|
0bb5674cde | ||
|
e54a24d4e6 | ||
|
0f7a279a06 | ||
|
c1c6a28c8d | ||
|
4c6e667968 | ||
|
072bee5c85 | ||
|
267fd0c7f7 | ||
|
d6900dfba4 | ||
|
6ddb6ac028 | ||
|
22093ef964 | ||
|
77ff1c40e2 | ||
|
446f8403d1 | ||
|
7882d2751f | ||
|
c15c61c401 | ||
|
4f5b8237ec | ||
|
b100895557 | ||
|
20de3ae17c | ||
|
b448dd849a | ||
|
4c8e8f990a | ||
|
d05e06989d | ||
|
f7b3826f03 | ||
|
4bd931f96d | ||
|
8cedded88c | ||
|
9ba273d365 | ||
|
49c1a7156c | ||
|
b927f1c319 | ||
|
02d8c472bd | ||
|
e448554568 | ||
|
337343d159 | ||
|
d26b8fcbe2 | ||
|
ec0cb7c64d | ||
|
d6332809d8 | ||
|
c652913674 | ||
|
06a88fa0ae | ||
|
4e8176d0c9 | ||
|
c09f8a3b7f | ||
|
81dbfe412c | ||
|
71857d7242 | ||
|
a0478814bc | ||
|
4ba947bf4b | ||
|
c36a6d5705 | ||
|
14b2cd9f32 | ||
|
a1e6bd6768 | ||
|
d7e04b9956 | ||
|
d04d009f47 | ||
|
4579bb1ed7 | ||
|
973dbaeebd | ||
|
4247cead2b | ||
|
38159428d2 | ||
|
4a8b938348 | ||
|
d6d7affa6e | ||
|
0759b1b952 | ||
|
0ae564d9b1 | ||
|
1e28eb83c0 | ||
|
b396b69cb2 | ||
|
ddc0e05604 | ||
|
5a2484b10e | ||
|
cb43a9ac44 | ||
|
c57b5507b2 | ||
|
7f100c9712 | ||
|
d4b03187c6 | ||
|
8e6ecc9667 | ||
|
adc17268fc | ||
|
7ffa7b095f | ||
|
322b1499cd | ||
|
5b51205187 | ||
|
9ed6fd25dd | ||
|
08ea4d87f6 | ||
|
0ac00c15b9 | ||
|
8ccf06c58b | ||
|
ab94ca18f2 | ||
|
7c00983275 | ||
|
fa1cba9e60 | ||
|
6f6cbf7c5d | ||
|
40407835b3 | ||
|
067ce6dea5 | ||
|
32dd2f3f9b | ||
|
7cce1d301a | ||
|
fd603ed9e2 | ||
|
cf7557a7e7 | ||
|
37b5ce56a0 | ||
|
9967a57587 | ||
|
cea35aecdc | ||
|
7ce72c1be8 | ||
|
7c7358e91e | ||
|
d0e171a9ff | ||
|
8deba01eda | ||
|
66105fd3dc | ||
|
ca4151984c | ||
|
349c40f47b | ||
|
a0735ecab5 | ||
|
60e073e28d | ||
|
019851a523 | ||
|
56e1766dba | ||
|
9c20a5f45c | ||
|
ca69b0f68d | ||
|
277b71e0d8 | ||
|
f345612654 | ||
|
cb1db8b6d5 | ||
|
0e8add601d | ||
|
f6f86b0eec | ||
|
4e13a8f9f9 | ||
|
b8c204cb92 | ||
|
7af5f8130f | ||
|
8657326093 | ||
|
a07e38d4bf | ||
|
4b2d02d037 | ||
|
baf0f94a7d | ||
|
9ff82892da | ||
|
85ba655788 | ||
|
466cedd052 | ||
|
07f6e36ab4 | ||
|
8000e0ea50 | ||
|
929acdf6bf | ||
|
e988ae471d | ||
|
e671d254cb | ||
|
555b2e5ac1 | ||
|
925c57fb54 | ||
|
1ba0730a71 | ||
|
120250ad6f | ||
|
306bb993aa | ||
|
3e4e58f349 | ||
|
3ee67ff5c2 | ||
|
abb3478533 | ||
|
496aee7cb8 | ||
|
37139e5933 | ||
|
1d778fdce3 | ||
|
e47d4f6d11 | ||
|
81ffb740f7 | ||
|
841d95f867 | ||
|
8de9c48c99 | ||
|
79af67d7c0 | ||
|
37184900e7 | ||
|
9d1a17e15f | ||
|
b194862b62 | ||
|
9be675ea52 | ||
|
d91934357f | ||
|
15cc8c8125 | ||
|
d6267d12d8 | ||
|
2585620857 | ||
|
6be9ffa3b8 | ||
|
d8a65536ec | ||
|
87c7ffccea | ||
|
4dedb27d7e | ||
|
9999fd9026 | ||
|
f81cacc681 | ||
|
743dec4c0c | ||
|
65fa3f73a1 | ||
|
69d271376c | ||
|
cde0bb27a1 | ||
|
058bc26e1b | ||
|
c157ee7d2c | ||
|
0f47b8fae7 | ||
|
b8fb1409d1 | ||
|
e1beb6f51d | ||
|
d3cde1ecf4 | ||
|
f06fe29f61 | ||
|
bf34c67f3f | ||
|
4275578570 | ||
|
bce2061b43 | ||
|
9aa9991efe | ||
|
af3d5c508c | ||
|
afcf23001e | ||
|
8054799963 | ||
|
03b4630348 | ||
|
e154d8bdd4 | ||
|
69e16b9ea5 | ||
|
4188c30c4a | ||
|
849d0a83e8 | ||
|
7660ffa29f | ||
|
3d722450de | ||
|
e21e184d84 | ||
|
771573c535 | ||
|
a071c1ccc0 | ||
|
9d4f46c975 | ||
|
39f040d62b | ||
|
bb23dc17f8 | ||
|
1610626fe9 | ||
|
a2315eebf9 | ||
|
424ffa4806 | ||
|
0572ee045d | ||
|
f0b06d82cd | ||
|
07de92e2c0 | ||
|
a6ddc2d99f | ||
|
f3a271fa73 | ||
|
46684dcfd2 | ||
|
0024cee9f8 | ||
|
17fb3d46ff | ||
|
bb06eb9d7c | ||
|
a67704753a | ||
|
0c4e400d2f | ||
|
c598e6e0a6 | ||
|
a9e420e93d | ||
|
1dcc2603e9 | ||
|
e5d2c60ae6 | ||
|
6995f24831 | ||
|
b7ccac4d62 | ||
|
454140e7fc | ||
|
52fa7bd2da | ||
|
c6e32ad0b8 | ||
|
c83f0276b3 | ||
|
8db0788896 | ||
|
dfbc42c261 | ||
|
dc9b4e9ebf | ||
|
7465e4c2e1 | ||
|
61c9156a74 | ||
|
98ba6359a1 | ||
|
b4771a6871 | ||
|
7ff77ec713 | ||
|
f86852ce0b | ||
|
5468f76861 | ||
|
7b1d25a11e | ||
|
7b129e76ce | ||
|
c3e66ff5c3 | ||
|
c3f0cb38cf | ||
|
979ac86095 | ||
|
695675f539 | ||
|
142d12d829 | ||
|
30f1f37638 | ||
|
65be6de155 | ||
|
be8e775776 | ||
|
98a95ac17f | ||
|
7921ab1593 | ||
|
7dba11fe32 | ||
|
3ea2260d00 | ||
|
4b59d24f4f | ||
|
697a534ed6 | ||
|
dcfd456640 | ||
|
c939196557 | ||
|
22fd3cd0de | ||
|
d30ed6b6f2 | ||
|
f7e23c5ff7 | ||
|
c22930e24b | ||
|
27ca0436ac | ||
|
2e5e94c328 | ||
|
4adb136da6 | ||
|
665acd1dbd | ||
|
416c08f9ed | ||
|
a1e0373224 | ||
|
207f4a5deb | ||
|
98647ca0ef | ||
|
be2c8d9358 | ||
|
33b6dadc88 | ||
|
70d8e31a74 | ||
|
901c40f550 | ||
|
af792d6bb2 | ||
|
8ff3fb04f2 | ||
|
bd0cf1190a | ||
|
65d8273bf3 | ||
|
0acc0018d9 | ||
|
1e30a28e51 | ||
|
dae1f64ba6 | ||
|
f07c605361 | ||
|
1f6cce772e | ||
|
5eebb7a814 | ||
|
de4bbc7146 | ||
|
aec03a1f13 | ||
|
59ac49dc1f | ||
|
175a240285 | ||
|
a49b2c010e | ||
|
b92a538d23 | ||
|
8a64141a53 | ||
|
b1461152e6 | ||
|
b1edf7b64f | ||
|
619b014d3a | ||
|
02ab91e6a7 | ||
|
a0b6efb368 | ||
|
f951a01bb2 | ||
|
f6e7d99d54 | ||
|
c4f9bf3142 | ||
|
80d07e30c7 | ||
|
106f547733 | ||
|
144b8b1ca7 | ||
|
423f8bfa02 | ||
|
0c06f98ced | ||
|
b1c074f62c | ||
|
abdf02b9b9 | ||
|
a790456f1b | ||
|
0074a77424 | ||
|
93eae8ec78 | ||
|
3911880b68 | ||
|
cdd4302c6d | ||
|
27cb4d57e0 | ||
|
94ef1c0da9 | ||
|
4110868029 | ||
|
0d8ac0eac0 | ||
|
054bc24e6d | ||
|
74b2028167 | ||
|
33f2c4d898 | ||
|
1464a121c0 | ||
|
9d0fb1e97a | ||
|
de74e721b2 | ||
|
14ae582064 | ||
|
7067142100 | ||
|
db64f2e45a | ||
|
76606d3473 | ||
|
5a38f6470e | ||
|
b9ab0d4f39 | ||
|
189999d654 | ||
|
abc16a55b2 | ||
|
3b5d407203 | ||
|
fb26c60a2f | ||
|
c37ef6cd0e | ||
|
91e9f555b6 | ||
|
e99c333d61 | ||
|
fb83ed32d2 | ||
|
78ecaf0561 | ||
|
99985b5ea8 | ||
|
ae20b4b31b | ||
|
19e990d6a7 | ||
|
6a1d428f56 | ||
|
c79beec8f6 | ||
|
058ae12135 | ||
|
f9ffd1fa18 | ||
|
b4f0e8089d | ||
|
1c407aa993 | ||
|
9b07135b92 | ||
|
cc8856f9d3 | ||
|
49389178cc | ||
|
43b8f9f8a1 | ||
|
f349baeec8 | ||
|
c9cd15fbc9 | ||
|
b36032cb27 | ||
|
6c3fdc1091 | ||
|
9ccc41ea05 | ||
|
9a83d7af55 | ||
|
55ec2bf97f | ||
|
acfaff38db | ||
|
7e31f847af | ||
|
657502812b | ||
|
d211d1d999 | ||
|
9c65c8116f | ||
|
2bf326186a | ||
|
ea71b4880c | ||
|
51fde08b07 | ||
|
c6807c4405 | ||
|
ba6267f05a | ||
|
d4c79a458b | ||
|
f8562e362b | ||
|
91d2f8a704 | ||
|
9a7b0d5641 | ||
|
9a6b763507 | ||
|
8992f30866 | ||
|
08fbeb8fa4 | ||
|
e27ab916d6 | ||
|
2ec2757def | ||
|
258ce3ded5 | ||
|
fe92133132 | ||
|
4299c0560f | ||
|
68c6f887c2 | ||
|
7b76f82b6e | ||
|
05d481a42c | ||
|
a5a59c9a05 | ||
|
2a7ab868e3 | ||
|
ed04a0d060 | ||
|
47c624b561 | ||
|
f8070f4793 | ||
|
465531403c | ||
|
b15ceec33f | ||
|
25ad52cf6a | ||
|
91a0e8639a | ||
|
af952baffc | ||
|
2bb4543809 | ||
|
1a02442f66 | ||
|
04f679be73 | ||
|
85e5c8f905 | ||
|
cdd37837b3 | ||
|
d3bde96b36 | ||
|
16a3cd3847 | ||
|
7430da621a | ||
|
cba4c0cc60 | ||
|
772a22b529 | ||
|
a42fe9f61e | ||
|
2a5096dfc6 | ||
|
948c07f490 | ||
|
991606b57a | ||
|
2fd1ba4c6d | ||
|
6bafa4ce0d | ||
|
0b243a106a | ||
|
ee11bc0f5c | ||
|
8d2fe43c7f | ||
|
115e81ee19 | ||
|
1abfdc218e | ||
|
7fb26c2943 | ||
|
31591142e9 | ||
|
ea1698e322 | ||
|
b1ee5cd3b6 | ||
|
37fda77814 | ||
|
52f070a099 | ||
|
cd9e1c94e5 | ||
|
146e30736d | ||
|
1e65b0e7a1 | ||
|
17b42b81f0 | ||
|
18a3787296 | ||
|
82add78f89 | ||
|
25f98e618a | ||
|
c1c57d3a26 | ||
|
cabd24b33f | ||
|
f181f9ec2a | ||
|
f4d60c8788 | ||
|
5930064700 | ||
|
1a8dbc4fc9 | ||
|
56cb729907 | ||
|
0169971a59 | ||
|
0454e32861 | ||
|
5f4ef321a6 | ||
|
28fe98891f | ||
|
4b663ac34a | ||
|
299389a99f | ||
|
46f1d6fddb | ||
|
48bb3a37da | ||
|
e3283ec3eb | ||
|
4680121fe6 | ||
|
e46bc2714d | ||
|
fa80d07de0 | ||
|
cac2438b0c | ||
|
3713f78ac2 | ||
|
c20a661272 | ||
|
fcec6d85d0 | ||
|
9224010859 | ||
|
08726e2837 | ||
|
03ab79abac | ||
|
308d5f8912 | ||
|
73ec6980d5 | ||
|
dc16bdd369 | ||
|
cd48525ecb | ||
|
fcc30a3df7 | ||
|
dfa91df289 | ||
|
ecbd56c625 | ||
|
3ba3cf85e1 | ||
|
4ef66b1c5f | ||
|
caa0aace21 | ||
|
7a83f4d264 | ||
|
91ca4a77b7 | ||
|
f892763b0f | ||
|
eb7aeb19a2 | ||
|
0fe78d39bd | ||
|
36a03bdfcb | ||
|
1c81045521 | ||
|
1e1558f548 | ||
|
a1efcc26cb | ||
|
72b187be6d | ||
|
b769f3ce0b | ||
|
8be171e88f | ||
|
fd1d961af5 | ||
|
63650bbc5d | ||
|
a4faeb1a79 | ||
|
7ff4f0e0fc | ||
|
5160996d4a | ||
|
55dc31e781 | ||
|
6e68808247 | ||
|
101c5c2a3a | ||
|
ddbbe695b3 | ||
|
5f1faa3cd2 | ||
|
9114bee242 | ||
|
6bd7ded71e | ||
|
0d37671824 | ||
|
643d5228ed | ||
|
03ca10e863 | ||
|
e37487e083 | ||
|
3b23d639ab | ||
|
12496dd7db | ||
|
311592fc39 | ||
|
0d4236be54 | ||
|
9057bc3c72 | ||
|
c53f2a6961 | ||
|
425afaca2f | ||
|
59748e653b | ||
|
3c5b40fb75 | ||
|
3e23ddf88b | ||
|
1449c9f06f | ||
|
dd588ae2ce | ||
|
29805da6d1 | ||
|
d2eb5e911e | ||
|
e263187a36 | ||
|
0ad2382131 | ||
|
74d4adcbba | ||
|
02cc2b668a | ||
|
a67455f8d8 | ||
|
ba874b82be | ||
|
0e167fc974 | ||
|
248b38539d | ||
|
4a88a49c03 | ||
|
eb62301938 | ||
|
948b730fea | ||
|
5e68ecf3b2 | ||
|
2dec9851bd | ||
|
f494620c55 | ||
|
7b821d031a | ||
|
aad32bccc0 | ||
|
12828c1b30 | ||
|
c812882dbf | ||
|
291f0508c5 | ||
|
89d3d343d1 | ||
|
58da91d5d0 | ||
|
fb22ac52b0 | ||
|
690768a171 | ||
|
2db2512f4d | ||
|
2bdd253d54 | ||
|
0cee7ad2bf | ||
|
2c6b59ca6a | ||
|
93dfa24f42 | ||
|
350de9fe80 | ||
|
da4b492f56 | ||
|
477c69a9c5 | ||
|
b773fbf335 | ||
|
58cf664d28 | ||
|
0196c9936c | ||
|
d8a7e22709 | ||
|
3fa26448d1 | ||
|
3748ada073 | ||
|
eece627799 | ||
|
fa7a8bc6eb | ||
|
ce1b22e817 | ||
|
4d9fc422d2 | ||
|
7127b0295e | ||
|
1ddd9e518e | ||
|
b900459e96 | ||
|
16f30b5373 | ||
|
a7027a04dd | ||
|
d4d36f22ee | ||
|
18739ea32d | ||
|
035b874fdf | ||
|
723a751e5f | ||
|
1011d5b505 | ||
|
c7548a116c | ||
|
9b62580595 | ||
|
a5cae441e2 | ||
|
652cdb4699 | ||
|
922ef5dc86 | ||
|
03551e5f3c | ||
|
2e2650f8f3 | ||
|
35cc03f97d | ||
|
aefaf92d1a | ||
|
b138106423 | ||
|
040b4012a7 | ||
|
aa3e334608 | ||
|
25049b93b1 | ||
|
7dd498de64 | ||
|
7c101d922e | ||
|
006c038212 | ||
|
cf02eb1b20 | ||
|
1166974bca | ||
|
736852825a | ||
|
91fb680236 | ||
|
67a4445675 | ||
|
fd636aed1e | ||
|
ff0d65aaf6 | ||
|
524edccb61 | ||
|
a563641d25 | ||
|
ea7ef38734 | ||
|
48a071e366 | ||
|
07ec8eebe0 | ||
|
25a2db018e | ||
|
cb6ad70994 | ||
|
34a1976d5d | ||
|
b936278b2e | ||
|
4c18d79475 | ||
|
c8b29083d2 | ||
|
bd4109babc | ||
|
91eeeae312 | ||
|
1fc1ed23b2 | ||
|
77ceaaf7f5 | ||
|
7bcbe2a9cc | ||
|
dd1f81512d | ||
|
4fb7e64da2 | ||
|
6041c8db27 | ||
|
83cbac2ac0 | ||
|
e52ca9aad1 | ||
|
a7992e0389 | ||
|
3d93d35a93 | ||
|
c5c239f361 | ||
|
24fc435dad | ||
|
94f83e1787 | ||
|
0d7efef394 | ||
|
d29b8a4745 | ||
|
c6e9049f9c | ||
|
9d43cee88c | ||
|
7239f574aa | ||
|
6b0ba01bf3 | ||
|
768580b3ec | ||
|
891b0a857d | ||
|
627e7d9bfe | ||
|
2840b3f6c3 | ||
|
461966b8ef | ||
|
8d998a713e | ||
|
2947411383 | ||
|
983c99113d | ||
|
6019b5a508 | ||
|
84db98fdbe | ||
|
46d13268b8 | ||
|
8a485f0bec | ||
|
99a20d6be1 | ||
|
7fb42dbd27 | ||
|
2e038f7336 | ||
|
b32d3c041b | ||
|
b115cb6655 | ||
|
9f109dfb99 | ||
|
db0caf239e | ||
|
421365eeaa | ||
|
8f50359ebf | ||
|
cb04ca2fc3 | ||
|
bebf92d7f0 | ||
|
4e5f93ccdc | ||
|
b07df2bfd4 | ||
|
efd266ae12 | ||
|
452c183c5e | ||
|
909fac6689 | ||
|
84a45cbf83 | ||
|
07886d9b0a | ||
|
42a833e89f | ||
|
136a319e91 | ||
|
239a853f40 | ||
|
997e1e8e9d | ||
|
168ca00b02 | ||
|
845d0054b4 | ||
|
a0d64ce063 | ||
|
b492d39177 | ||
|
def0391ec5 | ||
|
cc84c9535c | ||
|
889710c890 | ||
|
0e4e73a891 | ||
|
1e93b79cce | ||
|
f0405068d8 | ||
|
5308fffc53 | ||
|
4f0381b1c3 | ||
|
b691bf1d54 | ||
|
f6b61e6154 | ||
|
ee41ecff98 | ||
|
4f200491ff | ||
|
1cc5ff8e19 | ||
|
f259bd8359 | ||
|
cab6e7528c | ||
|
038f97a69f | ||
|
45fcb85236 | ||
|
a4c63b0cdb | ||
|
ec75798644 | ||
|
a87f8f9891 | ||
|
d8967f76a5 | ||
|
72c0dbd753 | ||
|
a4d0e3cc6b | ||
|
20f6e946e1 | ||
|
b66f158b05 | ||
|
6e36255221 | ||
|
1159005ae0 | ||
|
268b2e6544 | ||
|
47d8f02c06 | ||
|
543e11496e | ||
|
10bad1031e | ||
|
b9f45987b3 | ||
|
abddd6aa44 | ||
|
3c9068f185 | ||
|
f242e7afef | ||
|
edfdc9829c | ||
|
6114401b9b | ||
|
e7cc9aa447 | ||
|
ca7ed2d2df | ||
|
73bc51deea | ||
|
ca3c256579 | ||
|
1b148ec100 | ||
|
e9faa6f3a4 | ||
|
86decfb53c | ||
|
5dd295ff44 | ||
|
444d7d8e65 | ||
|
686191a1c9 | ||
|
90e9a445c8 | ||
|
5a1b329a9e | ||
|
65762e0455 | ||
|
744568b569 | ||
|
cfee952e23 | ||
|
1768a5765d | ||
|
4766524d17 | ||
|
d219507d63 | ||
|
bd30cd3e1f | ||
|
cb4567f117 | ||
|
8a080be4ad | ||
|
4ace424fa7 | ||
|
c8b2c2f10e | ||
|
27aab2e1c5 | ||
|
bb8d68196c | ||
|
e827812051 | ||
|
8a158bb1ea | ||
|
a27303094a | ||
|
49f9e5b6b4 | ||
|
d883db027b | ||
|
2d99eeb7f2 | ||
|
9dbc3f8db7 | ||
|
d092f48648 | ||
|
ebe55aa95a | ||
|
2826cb58bb | ||
|
870cc0fdac | ||
|
63bfdd83ea | ||
|
9acbe4cefe | ||
|
f78fc4e76e | ||
|
f50f70452f | ||
|
162a0becc5 | ||
|
9e55636fe0 | ||
|
9e15e187cc | ||
|
1e77e3dc5b | ||
|
82a1858eb0 | ||
|
7e20f64f27 | ||
|
e0bd8efcc0 | ||
|
ed0d4f6222 | ||
|
1fc8ec66a3 | ||
|
b6f01e77b1 | ||
|
a4540b2c3b | ||
|
ec6e4f8b3d | ||
|
1a1463725b | ||
|
4ecc6877a2 | ||
|
472f3bd198 | ||
|
bc3780a73f | ||
|
ecdf912ffb | ||
|
3adb772853 | ||
|
6ca9f4f5c3 | ||
|
f8c42191de | ||
|
93de8b2591 | ||
|
024dc77de2 | ||
|
98258dbbc6 | ||
|
7e40be3949 | ||
|
ca114432be | ||
|
6ab5d4f861 | ||
|
34235294d7 | ||
|
a9fae1ae66 | ||
|
362d10f20a | ||
|
8cedb11350 | ||
|
2c7032e4eb | ||
|
cdfc2061bb | ||
|
ba41978b97 | ||
|
757971ade8 | ||
|
b281e4e6f4 | ||
|
eacc9b92a1 | ||
|
303b54a2a4 | ||
|
e763f3e73e | ||
|
cf577c3492 | ||
|
8e68b56fe5 | ||
|
dcf38e1c96 | ||
|
88012b6e87 | ||
|
6419018e68 | ||
|
415cd2eebb | ||
|
ead0529e07 | ||
|
e35fd13697 | ||
|
8857c90e36 | ||
|
94bc1e0b5e | ||
|
1fe2412949 | ||
|
903aaea668 | ||
|
cd4e74df95 | ||
|
1dc022cb62 | ||
|
caae10b71f | ||
|
fbb1c8f6fe | ||
|
075a9ebdcc | ||
|
34bdc9f8fe | ||
|
785e3c95d7 | ||
|
2645c9e7fc | ||
|
84dfba1579 | ||
|
68c74f59a4 | ||
|
1b653af283 | ||
|
0970bab2a3 | ||
|
b830008020 | ||
|
d9c1d31a6a | ||
|
64277e6514 | ||
|
f8f72e23ca | ||
|
45014a0cad | ||
|
131406c86d | ||
|
9444d4f8e2 | ||
|
4b903b4afb | ||
|
65d114fe43 | ||
|
a83d511b61 | ||
|
7d8fa3418f | ||
|
f46e226428 | ||
|
095bd36627 | ||
|
249b3f38c5 | ||
|
ea730327d1 | ||
|
f76ed2d089 | ||
|
900394acf3 | ||
|
b1d71d4267 | ||
|
8effcb747d | ||
|
1a345ca48f | ||
|
2147bc4cc9 | ||
|
defb10fa62 | ||
|
80ba9b5dd6 | ||
|
91acfa0720 | ||
|
1f229b344e | ||
|
c9763a3de4 | ||
|
4bbddc6de9 | ||
|
65c7a4551a | ||
|
93c9da3b37 | ||
|
d074f8f396 | ||
|
b6f9516193 | ||
|
eddaa9f19e | ||
|
daf2a38eb6 | ||
|
0a1bc56e5a | ||
|
24754f0490 | ||
|
2c2ca4df38 | ||
|
ba477d2ba3 | ||
|
33f300915a | ||
|
e8ae1ac76a | ||
|
8b66649883 | ||
|
e828b661a7 | ||
|
a066d38fbf | ||
|
fd465bcdf1 | ||
|
5b0e8706e8 | ||
|
876b55af33 | ||
|
27a788ddb9 | ||
|
e18209c975 | ||
|
7f180e83c3 | ||
|
a5ddf489e1 | ||
|
7672db33bd | ||
|
109583dacb | ||
|
a80100644c | ||
|
12355ae658 | ||
|
65f7427e02 | ||
|
9f4f4e6c29 | ||
|
f6ec0e9fc4 | ||
|
58340e5b5b | ||
|
e2292f3aa1 | ||
|
3da9e4e441 | ||
|
30ce42250f | ||
|
b35a77751b | ||
|
5e9549e6a9 | ||
|
db2d431697 | ||
|
55ba140da1 | ||
|
83c0523739 | ||
|
598b1c7231 | ||
|
78a9501cfd | ||
|
3dff27d38d | ||
|
9107e2da13 | ||
|
1771171e05 | ||
|
a52ac66e52 | ||
|
2bee7f96ff | ||
|
a01bd60851 | ||
|
19d8742820 | ||
|
72c309021a | ||
|
d62419b574 | ||
|
50079a1843 | ||
|
ec37bb2956 | ||
|
d9e4039516 | ||
|
33b9641025 | ||
|
92ce02e644 | ||
|
558bdb4330 | ||
|
49976f4c1e | ||
|
82e644b572 | ||
|
aff2d62b8c | ||
|
b1250312ba | ||
|
24d3b91d46 | ||
|
28e183f385 | ||
|
61bd965b04 | ||
|
6e919dbb65 | ||
|
36722e13da | ||
|
fc7a75f5df | ||
|
64cb924634 | ||
|
72b401f33d | ||
|
4211d79cd1 | ||
|
90267a961c | ||
|
02ca7783ab | ||
|
6d23371805 | ||
|
7587727445 | ||
|
f0f63a4113 | ||
|
da890c7733 | ||
|
bc555742aa | ||
|
c5085f9d3d | ||
|
2082afa76e | ||
|
e75fec60d0 | ||
|
51a869c80c | ||
|
475f513aea | ||
|
8c90f47b09 | ||
|
7634ec1de1 | ||
|
0c48fc7c62 | ||
|
caa98d51b6 | ||
|
bd6d40f1fb | ||
|
4ad593c8f6 | ||
|
a3d41c9124 | ||
|
8c16928beb | ||
|
86d46c5c7a | ||
|
cc391b8880 | ||
|
55e34a3325 | ||
|
cb78612689 | ||
|
946d1415c2 | ||
|
6792059d50 | ||
|
4f13d03213 | ||
|
0760a83910 | ||
|
cd40fb4dea | ||
|
779a72819d | ||
|
733bec8626 | ||
|
56595f8647 | ||
|
3ffd9bc0a4 | ||
|
1b9902c128 | ||
|
ff98b3cffa | ||
|
33eb5873d9 | ||
|
c1a8687cb8 | ||
|
0df1ab97a2 | ||
|
4c9dff5d8e | ||
|
0ae92a950a | ||
|
190acf6fd0 | ||
|
96903c4b2d | ||
|
6a399efb72 | ||
|
6fcc3a9e8a | ||
|
5741256703 | ||
|
c85ed4e8db | ||
|
9303df22bd | ||
|
0b4f1b9e75 | ||
|
97e139f267 | ||
|
1b894022fd | ||
|
0c0e1c308f | ||
|
326b5d80b3 | ||
|
d81fec021e | ||
|
a874b8d396 | ||
|
66b52c1df8 | ||
|
6cb2cccc8d | ||
|
27876a2df0 | ||
|
9962151230 | ||
|
3db24b5fe4 | ||
|
045f402298 | ||
|
99e273db00 | ||
|
1aeb2af75d | ||
|
14d1177735 | ||
|
52f705eaab | ||
|
67e423c256 | ||
|
3615a30d3d | ||
|
ddf191eafc | ||
|
85d3b34ed2 | ||
|
b718ad397e | ||
|
aa93bac34b | ||
|
7e0fec17ce | ||
|
964a9b3e20 | ||
|
012a7eec29 | ||
|
598e7b3cdf | ||
|
92aa6bb9dc | ||
|
c0438e3587 | ||
|
c63f6f1f32 | ||
|
e7bd863f76 | ||
|
b97089432f | ||
|
a7328a5642 | ||
|
5ecbc93656 | ||
|
649e1ff4b3 | ||
|
b4b21f59f6 | ||
|
badb12f6a6 | ||
|
3dfb549a6f | ||
|
7f6da485f5 | ||
|
cb5353d851 | ||
|
1b624ba1f6 | ||
|
c962d45669 | ||
|
921b2278df | ||
|
ae9d8d3131 | ||
|
c9251fa8c9 | ||
|
3aedba66bd | ||
|
5ccd015371 | ||
|
995ff35f39 | ||
|
4c5babc06c | ||
|
641475cb81 | ||
|
46bd4244a1 | ||
|
1e61b25661 | ||
|
096dc3a466 | ||
|
7346081ba3 | ||
|
9bec10ecd3 | ||
|
b0b8a34dd5 | ||
|
9feef48eaf | ||
|
e885951f27 | ||
|
81cff91ec0 | ||
|
7b76934f03 | ||
|
b18c7456cb | ||
|
7d8139a42e | ||
|
aa63d70f39 | ||
|
80e036560d | ||
|
3a708afe63 | ||
|
84402c0c82 | ||
|
f0167ddfc2 | ||
|
a164d5291e | ||
|
1eba7de0c2 | ||
|
d5c270e71c | ||
|
8690b98e7c | ||
|
8bb0720ebb | ||
|
eb0acb6e02 | ||
|
9e22e69266 | ||
|
e0aee7aaa9 | ||
|
cc6b2d2fa3 | ||
|
1304b35a64 | ||
|
abadd54346 | ||
|
22ce59826a | ||
|
b0bf1da4c8 | ||
|
a1c09a401d | ||
|
846d8dca9f | ||
|
c75ed6d593 | ||
|
27d5e65640 | ||
|
61e1935a5f | ||
|
9f3835b988 | ||
|
0a244b40c9 | ||
|
2177624ca9 | ||
|
e152a46f6e | ||
|
e48c1871af | ||
|
4b0e36ae7f | ||
|
84b033f8c7 | ||
|
e84dd98d26 | ||
|
7a0010bdd4 | ||
|
d7b22c624b | ||
|
2bc90c274d | ||
|
ab22335378 | ||
|
7e9b039a94 | ||
|
70c58ef03b | ||
|
d38cf50d0a | ||
|
b2b291d3ef | ||
|
c279e39c12 | ||
|
0e5f5aeaad | ||
|
dbd9449a16 | ||
|
27b6184225 | ||
|
dc3a78f0c4 | ||
|
ac04d8d55e | ||
|
7d7054eafa | ||
|
7c831ecd19 | ||
|
931ad6ac33 | ||
|
462b7d7158 | ||
|
c327187259 | ||
|
77956aa034 | ||
|
6de9d0ba35 | ||
|
1c0c317094 | ||
|
30156e1eea | ||
|
d34adb2f9f | ||
|
8ae35c1606 | ||
|
0c908b6e72 | ||
|
0c8f9ca30b | ||
|
7159e8bea3 | ||
|
3f78600346 | ||
|
76afa16d04 | ||
|
8b29180cad | ||
|
1af682adb9 | ||
|
f876c39887 | ||
|
e1145cf0f9 | ||
|
e972dba8dd | ||
|
9b5192b153 | ||
|
f4be327b4c | ||
|
63b0e44f65 | ||
|
456fccf697 | ||
|
b02fc1e9bb | ||
|
75e13a41dc | ||
|
647db848e3 | ||
|
ce1d742f27 | ||
|
af33e1d3a1 | ||
|
0a7c6a3549 | ||
|
883fbc9d04 | ||
|
dc030960fc | ||
|
3d119f1de4 | ||
|
e30d40de0e | ||
|
e7ea08379e | ||
|
1590727b64 | ||
|
c5e0851054 | ||
|
b862cef60d | ||
|
6a85c15eea | ||
|
b5a4edd09b | ||
|
d4d1d5e751 | ||
|
9e1952a901 | ||
|
164ee307b2 | ||
|
69665f8722 | ||
|
7d10983865 | ||
|
2a896070a7 | ||
|
036b25fb7f | ||
|
c7de8ef014 | ||
|
431ceada36 | ||
|
25eca0bfdc | ||
|
23446844a8 | ||
|
7b6ea56f41 | ||
|
baa1a2df20 | ||
|
ed0374ffeb | ||
|
ba36bf4c5d | ||
|
30a3d2f0fe | ||
|
4babba62b8 | ||
|
3749dc93a3 | ||
|
f2621e506d | ||
|
608ac2a8a4 | ||
|
bac7dcc367 | ||
|
75077955e9 | ||
|
25aa749f10 | ||
|
ff799f0912 | ||
|
0b19d55dd6 | ||
|
c7db4dce4a | ||
|
d5edc4f84d | ||
|
83d2d38a3c | ||
|
ea46b77f3e | ||
|
aa191adce6 | ||
|
1f8276e588 | ||
|
0434faedc9 | ||
|
184950e298 | ||
|
bdf764a025 | ||
|
adc2e87372 | ||
|
6fbd864a65 | ||
|
6ecb3cb599 | ||
|
b9b828b1e5 | ||
|
b5ae7288a9 | ||
|
1c201c6055 | ||
|
bfbdeec714 | ||
|
4d62d63151 | ||
|
4d2a68cf11 | ||
|
39c31dea2e | ||
|
01c13a3a45 | ||
|
11c1b6e014 | ||
|
977cd13741 | ||
|
0c282f5268 | ||
|
324c8052ae | ||
|
4173b174eb | ||
|
56260b648c | ||
|
cf77b3a2cf | ||
|
c121bb3188 | ||
|
006e3d87e0 | ||
|
48ea4e8aec | ||
|
6e300682df | ||
|
4485321219 | ||
|
7d0f60dce6 | ||
|
b348939d86 | ||
|
638da51a78 | ||
|
9d50a27695 | ||
|
8582535c82 | ||
|
960c4044e6 | ||
|
93599a2c2c | ||
|
d66777f9cf | ||
|
5ca825e431 | ||
|
1411c066cc | ||
|
10049bc3b7 | ||
|
3e9b2ec257 | ||
|
405824c057 | ||
|
25b70cea9d | ||
|
0e0a09c610 | ||
|
3a41b80bd7 | ||
|
2f25747e3f | ||
|
bce5675e5f | ||
|
c751cf92cb | ||
|
408208d887 | ||
|
5ea1bc77a3 | ||
|
7e7ee5f8c6 | ||
|
1bf6610ce7 | ||
|
ce55361e93 | ||
|
29de346b32 | ||
|
a769dcb889 | ||
|
cf2f158caa | ||
|
d267f4d685 | ||
|
0d904e004a | ||
|
01d315f19c | ||
|
3d4d79d890 | ||
|
d2361d970a | ||
|
f589221ed0 | ||
|
b3089e437d | ||
|
383d3c33e6 | ||
|
c5903a2b01 | ||
|
536a10b63b | ||
|
bc6c43f759 | ||
|
f7396eac2f | ||
|
07dec137de | ||
|
70ae5d3000 | ||
|
6d818839a9 | ||
|
8d0be259cb | ||
|
0d0c9ec5c5 | ||
|
c6483683eb | ||
|
b8a1f967c5 | ||
|
c0de14da8f | ||
|
e07b6a77e5 | ||
|
338e3b3b4b | ||
|
eff4094950 | ||
|
366c33185b | ||
|
0a1a312311 | ||
|
6c7680d726 | ||
|
1a2993adb7 | ||
|
9122c13933 | ||
|
874f9f1aa7 | ||
|
8a1b056bff | ||
|
9ad0362429 | ||
|
4dbcdad903 | ||
|
e94db49698 | ||
|
d4bdee79e9 | ||
|
f1033cc752 | ||
|
90d7f26f67 | ||
|
eedb45362d | ||
|
98da544992 | ||
|
88c06bcd64 | ||
|
cb306a689e | ||
|
30690adbc8 | ||
|
38e02c5125 | ||
|
769912c9e9 | ||
|
1e85af661c | ||
|
ed3a661d0b | ||
|
0bf15a8187 | ||
|
2e8e659586 | ||
|
952f752ffa | ||
|
2a60a11c48 | ||
|
de1674ab02 | ||
|
75172124e7 | ||
|
3dfe8a1705 | ||
|
e2f34d588c | ||
|
93fda87cf8 | ||
|
e0b5972d30 | ||
|
f3a317ceed | ||
|
e600eed7fa | ||
|
6b55f603e3 | ||
|
7456891439 | ||
|
cb3c2c95bf | ||
|
07fc097fc4 | ||
|
aff20717e4 | ||
|
511f9c3e4a | ||
|
d49eb74732 | ||
|
2ee7ecddeb | ||
|
94c2b0578b | ||
|
c15d0ac8dd | ||
|
d9173c3fce | ||
|
8936d00587 | ||
|
becc89a98e | ||
|
778695d0b4 | ||
|
221ff66327 | ||
|
bf0a7c97be | ||
|
34203bd487 | ||
|
9ceea68ba9 | ||
|
ca5d211113 | ||
|
31b245b91a | ||
|
cbaa880ae8 | ||
|
18fa70aa3a | ||
|
210565ed8c | ||
|
c11889f3dd | ||
|
f67d9a9bed | ||
|
644b0bf3da | ||
|
076af1c54b | ||
|
354c87cdfc | ||
|
8b902d74cf | ||
|
8c176cc6ab | ||
|
ffd6856249 | ||
|
7a7c2f8567 | ||
|
806d6549f8 | ||
|
6dc6910b79 | ||
|
6088f149b5 | ||
|
65924a5fe8 | ||
|
11620111f4 | ||
|
d08ad7d6d9 | ||
|
ebe22375a6 | ||
|
7aa4f0a263 | ||
|
fa0ec157af | ||
|
a5352a0174 | ||
|
47b5b3eeb2 | ||
|
5e95f45af0 | ||
|
5ff06af6f5 | ||
|
d5eb431c47 | ||
|
adcde9f8f5 | ||
|
47824541f0 | ||
|
ad2946ce03 | ||
|
d79da3baac | ||
|
721f0325b5 | ||
|
114a010c33 | ||
|
6fc4a98fc5 | ||
|
f3b31eb349 | ||
|
4dd84ff7c2 | ||
|
8c3d0695e4 | ||
|
d98136d25c | ||
|
a5050b14c9 | ||
|
86f240aded | ||
|
79c34ffb4f | ||
|
4c889a5c49 | ||
|
0818f31144 | ||
|
240a828ffd | ||
|
037065deee | ||
|
e422798866 | ||
|
bb53e3577a | ||
|
9fc70f365a | ||
|
6fcac63cc0 | ||
|
b561459dd6 | ||
|
6e7d137e79 | ||
|
3d610e63cc | ||
|
dd68fcaeee | ||
|
010c9551ff | ||
|
a73ca05db6 | ||
|
570ce24deb | ||
|
e555c2b545 | ||
|
57e0724ed4 | ||
|
4ab9d7c012 | ||
|
13fe21939c | ||
|
d13e0cd6db | ||
|
cfaabbb21e | ||
|
fe568f235f | ||
|
df49a983e2 | ||
|
b7b6cf5695 | ||
|
f42e908cea | ||
|
602559fd9f | ||
|
4552d8061a | ||
|
59043d8c94 | ||
|
9b5db287c6 | ||
|
1a6b83c919 | ||
|
bc6a54dadc | ||
|
d028807658 | ||
|
64c17fa598 | ||
|
3217fa2412 | ||
|
70f9205cd9 | ||
|
ae1d010220 | ||
|
fdf453c0a9 | ||
|
7b022eed2d | ||
|
45f9171175 | ||
|
25cf824edc | ||
|
153b13b02e | ||
|
8c00496e42 | ||
|
ad66a2d150 | ||
|
f383aa11a5 | ||
|
0c1bd61bb3 | ||
|
019f913ca3 | ||
|
c95175fb88 | ||
|
edcba4e307 | ||
|
b46d566559 | ||
|
d24566ac6e | ||
|
ce95b27b68 | ||
|
11461a6457 | ||
|
e6599ee180 | ||
|
b1fd9022eb | ||
|
faa70ff2c6 | ||
|
0d5e8e0b56 | ||
|
68d85d5610 | ||
|
fdd8b3b40d | ||
|
a6a20b4ff6 | ||
|
8645e101da | ||
|
ea34a4e3a7 | ||
|
704cb8680b | ||
|
67161f27d1 | ||
|
66d360661a | ||
|
f25b55ec71 | ||
|
c513ded578 | ||
|
3fab3fdd24 | ||
|
bea9a1206b | ||
|
2c9ea91317 | ||
|
41a93dc2f0 | ||
|
a8090d54d6 | ||
|
c50e04a409 | ||
|
5e80cc4adc | ||
|
fda74ee055 | ||
|
6e8dcf304c | ||
|
0e9311df40 | ||
|
46cb8514a5 | ||
|
afa0ad1723 | ||
|
cc7b22a53b | ||
|
ec2542627e | ||
|
a5dcdd9a9a | ||
|
5d52c97cff | ||
|
9c3dc90d16 | ||
|
a334c296e0 | ||
|
09db1a44bc | ||
|
2f2be578cb | ||
|
20fea24515 | ||
|
44e5dad3e2 | ||
|
abd668a68d | ||
|
f936fb4086 | ||
|
4cdb050d13 | ||
|
f31a4a4810 | ||
|
8ec4952557 | ||
|
4d31900e2d | ||
|
dc3389f9c8 | ||
|
ae1997248c | ||
|
6b36b90f75 | ||
|
ec7683f3b0 | ||
|
d77023b1c2 | ||
|
5563e6c268 | ||
|
3e60348b3b | ||
|
a8ddb08e05 | ||
|
c50543b18a | ||
|
c33d7d71cb | ||
|
2935034b5e | ||
|
c8ddf73c8f | ||
|
863dc9bc84 | ||
|
54fa2c7eab | ||
|
c6d0a17100 | ||
|
06b04f851b | ||
|
37e6523c0f | ||
|
dae5307a57 | ||
|
f02bb200c5 | ||
|
1fe73a19cd | ||
|
94b499c9bd | ||
|
78b5586e25 | ||
|
6a85705d51 | ||
|
50f93a4acd | ||
|
27fa7901bb | ||
|
f74da14c01 | ||
|
8819d8289d | ||
|
cf149eebb6 | ||
|
95e862cab4 | ||
|
d55cef9b07 | ||
|
7d60bdb2c2 | ||
|
2718845967 | ||
|
47b144b002 | ||
|
8e60f629e2 | ||
|
be53012f9c | ||
|
0354a80357 | ||
|
445d00543a | ||
|
9592c45e34 | ||
|
523a99d3a6 | ||
|
f95f2733e6 | ||
|
1d7f7c8ca8 | ||
|
aa433d2d84 | ||
|
794e8f2649 | ||
|
9e7837a14d | ||
|
c0a6674614 | ||
|
dfcfe65f24 | ||
|
ded0268a8d | ||
|
bbf2139fdc | ||
|
c55f0a5415 | ||
|
7173f63eed | ||
|
0977e0c4b8 | ||
|
68368dd99a | ||
|
50be1a9d7f | ||
|
951f34b885 | ||
|
c2c0ea700b | ||
|
8c36fdb1d8 | ||
|
55466197f0 | ||
|
dec7387a22 | ||
|
998a98185f | ||
|
5d2a30a83c | ||
|
c5df08b388 | ||
|
93ef33edb6 | ||
|
03ff1c8477 | ||
|
41b42c7229 | ||
|
faf1f64a2d | ||
|
26d0fe3c89 | ||
|
6c88217c19 | ||
|
d5b3ca621b | ||
|
300457b7d2 | ||
|
45222a79e2 | ||
|
08e324fda7 | ||
|
f5ede52a22 | ||
|
40aac3f7f6 | ||
|
3365cd1cfe | ||
|
2957de9228 | ||
|
1c5dd2c9bb | ||
|
6b8a56c365 | ||
|
511bd8e98c | ||
|
b52b4cfc48 | ||
|
8cbc4a406d | ||
|
914660d6f6 | ||
|
63ef215e15 | ||
|
f7e94106bb | ||
|
2692e3bcff | ||
|
347e7ba377 | ||
|
1491f2e7a9 | ||
|
2eb6e2c0ad | ||
|
3ffcf2045c | ||
|
da6597ea29 | ||
|
694c82d8e3 | ||
|
2a260ee9bc | ||
|
bb5c594e15 | ||
|
86aaefe17b | ||
|
2192ed8d61 | ||
|
c951946691 | ||
|
67c0c7f8aa | ||
|
851f1206a8 | ||
|
d4c6f8b343 | ||
|
066a0f5c0b | ||
|
2b697a6671 | ||
|
0c1a30312d | ||
|
37a63ca34a | ||
|
3dccda5ef0 | ||
|
6142dc407a | ||
|
2b17454f4a | ||
|
42b9195023 | ||
|
30ebcf71d0 | ||
|
00a8ab9d3b | ||
|
670ffe3290 | ||
|
74c7dc36b6 | ||
|
cc98d188eb | ||
|
df82b72375 | ||
|
08542564fe | ||
|
a3199070e9 | ||
|
a62b247b02 | ||
|
d271a350b4 | ||
|
c57e6eda9b | ||
|
15eae8dcaf | ||
|
4f8ad5350a | ||
|
1942729fa7 | ||
|
ca86dd5776 | ||
|
b70bd52c2a | ||
|
4329099e28 | ||
|
f3b5932ecf | ||
|
7c78c479ac | ||
|
d02e68b24d | ||
|
e1d2e1c74c | ||
|
0a65461065 | ||
|
59947a0329 | ||
|
135a6bd3c6 | ||
|
ab386e6120 | ||
|
6b353778c4 | ||
|
cab0d7bedc | ||
|
b4d913d336 | ||
|
0eae6136e2 | ||
|
f7a2b19771 | ||
|
90dc4679e1 | ||
|
bc56b0b771 | ||
|
a90eb0066a | ||
|
05ac9e365c | ||
|
9cc771bd3d | ||
|
5763093285 | ||
|
bc076ae53b | ||
|
4ad44249c3 | ||
|
e54db171ee | ||
|
7c3298af9e | ||
|
80c37bd806 | ||
|
594b322a4e | ||
|
ed999b29bc | ||
|
128892f55f | ||
|
3488c3ddc4 | ||
|
c7e49d35ea | ||
|
06c9da6c22 | ||
|
8697e43bb2 |
83
.gitignore
vendored
Normal file
83
.gitignore
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
debian/*.log
|
||||
*.o
|
||||
*.lo
|
||||
*.a
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
bscconfig.h
|
||||
bscconfig.h.in
|
||||
openbsc.pc
|
||||
src/osmo-nitb/osmo-nitb
|
||||
src/osmo-bsc_mgcp/osmo-bsc_mgcp
|
||||
src/osmo-bsc/osmo-bsc
|
||||
src/utils/meas_vis
|
||||
src/utils/meas_json
|
||||
src/utils/osmo-meas-pcap2db
|
||||
src/utils/osmo-meas-udp2db
|
||||
src/utils/smpp_mirror
|
||||
*.*~
|
||||
*.sw?
|
||||
.libs
|
||||
*.pyc
|
||||
*.gcda
|
||||
*.gcno
|
||||
|
||||
#configure
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
config.log
|
||||
config.status
|
||||
config.guess
|
||||
config.sub
|
||||
configure
|
||||
compile
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
stamp-h1
|
||||
libtool
|
||||
ltmain.sh
|
||||
|
||||
# git-version-gen magic
|
||||
.tarball-version
|
||||
.version
|
||||
|
||||
|
||||
# apps and app data
|
||||
hlr.sqlite3
|
||||
src/utils/bs11_config
|
||||
src/ipaccess/ipaccess-config
|
||||
src/ipaccess/abisip-find
|
||||
src/ipaccess/ipaccess-firmware
|
||||
src/ipaccess/ipaccess-proxy
|
||||
src/utils/isdnsync
|
||||
src/nat/bsc_nat
|
||||
src/gprs/osmo-sgsn
|
||||
src/gprs/osmo-gbproxy
|
||||
src/gprs/osmo-gtphub
|
||||
src/osmo-bsc_nat/osmo-bsc_nat
|
||||
src/libcommon/gsup_test_client
|
||||
src/osmo-msc/osmo-msc
|
||||
|
||||
#tests
|
||||
tests/testsuite.dir
|
||||
tests/*/*_test
|
||||
# ignore compiled binaries like msc_vlr_test_foo; do not ignore
|
||||
# msc_vlr_test_foo.{c,ok,err}, but do still ignore the corresponding .o object
|
||||
# files:
|
||||
tests/msc_vlr/msc_vlr_test_*
|
||||
!tests/msc_vlr/msc_vlr_test_*.*
|
||||
tests/msc_vlr/msc_vlr_test_*.o
|
||||
|
||||
|
||||
tests/atconfig
|
||||
tests/atlocal
|
||||
tests/package.m4
|
||||
tests/testsuite
|
||||
tests/testsuite.log
|
||||
|
||||
gsn_restart
|
||||
src/openbsc.cfg*
|
||||
writtenconfig/
|
||||
gtphub_restart_count
|
3
.gitreview
Normal file
3
.gitreview
Normal file
@@ -0,0 +1,3 @@
|
||||
[gerrit]
|
||||
host=gerrit.osmocom.org
|
||||
project=osmo-mgw
|
12
.mailmap
Normal file
12
.mailmap
Normal file
@@ -0,0 +1,12 @@
|
||||
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>
|
@@ -5,3 +5,5 @@ Stefan Schmidt <stefan@datenfreihafen.org>
|
||||
Daniel Willmann <daniel@totalueberwachung.de>
|
||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||
Sylvain Munaut <246tnt@gmail.com>
|
||||
Jacob Erlbeck <jerlbeck@sysmocom.de>
|
||||
Neels Hofmeyr <nhofmeyr@sysmocom.de>
|
33
Makefile.am
Normal file
33
Makefile.am
Normal file
@@ -0,0 +1,33 @@
|
||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
||||
|
||||
## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac
|
||||
## remove line below when OE toolchain is updated to version which include those
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
AM_CPPFLAGS = \
|
||||
$(all_includes) \
|
||||
-I$(top_srcdir)/include \
|
||||
$(NULL)
|
||||
|
||||
SUBDIRS = \
|
||||
doc \
|
||||
include \
|
||||
src \
|
||||
tests \
|
||||
contrib \
|
||||
$(NULL)
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = \
|
||||
libosmo-legacy-mgcp.pc \
|
||||
libosmo-mgcp-client.pc \
|
||||
$(NULL)
|
||||
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
|
||||
|
||||
@RELMAKE@
|
||||
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
28
README
28
README
@@ -0,0 +1,28 @@
|
||||
About OsmoMGW
|
||||
=============
|
||||
|
||||
OsmoMGW originated from the OpenBSC project, which started as a minimalistic
|
||||
all-in-one implementation of the GSM Network. In 2017, OpenBSC had reached
|
||||
maturity and diversity (including M3UA SIGTRAN and 3G support in the form of
|
||||
IuCS and IuPS interfaces) that naturally lead to a separation of the all-in-one
|
||||
approach to fully independent separate programs as in typical GSM networks.
|
||||
|
||||
OsmoMGW was one of the parts split off from the old openbsc.git. It originated
|
||||
as a solution to merely navigate RTP streams through a NAT, but has since
|
||||
matured to a Media Gateway implementation that is capable of streaming RTP for
|
||||
2G (AoIP) and 3G (IuCS) GSM networks as well as (still not implemented at time
|
||||
of writing) transcoding between TRAU, various RTP payloads and IuUP.
|
||||
|
||||
The OsmoMGW program exposes an MGCP interface towards clients like OsmoMSC and
|
||||
OsmoBSC, and receives and sends RTP streams as configured via MGCP.
|
||||
|
||||
The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
|
||||
in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
|
||||
|
||||
The libosmo-mgcp library exposes MGCP server utilities used by e.g. OsmoBSC-NAT
|
||||
(found in osmo-bsc.git) to navigate RTP streams through a NAT.
|
||||
(At time of writing, this is still called libosmo-legacy-mgcp.)
|
||||
|
||||
Find OsmoMGW issue tracker and wiki online at
|
||||
https://osmocom.org/projects/osmo-mgw
|
||||
https://osmocom.org/projects/osmo-mgw/wiki
|
||||
|
11
README.vty-tests
Normal file
11
README.vty-tests
Normal file
@@ -0,0 +1,11 @@
|
||||
To run the configuration parsing and output (VTY) test suite, first install
|
||||
|
||||
git://git.osmocom.org/python/osmo-python-tests
|
||||
|
||||
and pass the following configure options here:
|
||||
|
||||
./configure --enable-vty-tests --enable-external-tests
|
||||
|
||||
The VTY tests are then included in the standard check target:
|
||||
|
||||
make check
|
26
TODO-RELEASE
Normal file
26
TODO-RELEASE
Normal file
@@ -0,0 +1,26 @@
|
||||
# When cleaning up this file upon a release:
|
||||
#
|
||||
# - Note that the release version number is entirely unrelated to the API
|
||||
# versions. A release version 5.2.3 may happily have an API version of 42:7:5.
|
||||
#
|
||||
# - Bump API version in src/lib*/Makefile.am files according to chapter
|
||||
# "Library interface versions" of the libtool documentation.
|
||||
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||
#
|
||||
# - Iff the 'current' API version has changed, rename debian/lib*.install
|
||||
#
|
||||
# API version bumping for the impatient:
|
||||
# LIBVERSION=c:r:a (current:revision_of_current:backwards_compat_age)
|
||||
# 5:2:4 means that
|
||||
# - this implements version 5 of the API;
|
||||
# - this is the 2nd (compatible) revision of API version 5;
|
||||
# - this is backwards compatible to all APIs since 4 versions ago,
|
||||
# i.e. callers that need API versions from 1 to 5 can use this.
|
||||
#
|
||||
# Bumping API versions recipe:
|
||||
# If the library source code has changed at all since the last update, r++;
|
||||
# If any interfaces have been added, removed, or changed since the last update, c++, r=0;
|
||||
# If any interfaces have been added since the last public release, a++;
|
||||
# If any interfaces have been removed or changed since the last public release, a=0.
|
||||
#
|
||||
#library what description / commit summary line
|
175
configure.ac
Normal file
175
configure.ac
Normal file
@@ -0,0 +1,175 @@
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
AC_INIT([osmo-mgw],
|
||||
m4_esyscmd([./git-version-gen .tarball-version]),
|
||||
[openbsc@lists.osmocom.org])
|
||||
|
||||
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
|
||||
AC_CONFIG_AUX_DIR([.])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
AC_CONFIG_TESTDIR(tests)
|
||||
|
||||
dnl kernel style compile messages
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
dnl include release helper
|
||||
RELMAKE='-include osmo-release.mk'
|
||||
AC_SUBST([RELMAKE])
|
||||
|
||||
dnl checks for programs
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
LT_INIT
|
||||
|
||||
dnl check for pkg-config (explained in detail in libosmocore/configure.ac)
|
||||
AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)
|
||||
if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
|
||||
AC_MSG_WARN([You need to install pkg-config])
|
||||
fi
|
||||
PKG_PROG_PKG_CONFIG([0.20])
|
||||
|
||||
dnl check for AX_CHECK_COMPILE_FLAG
|
||||
m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [
|
||||
AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])
|
||||
])
|
||||
|
||||
dnl checks for libraries
|
||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
|
||||
AC_SUBST(LIBRARY_DL)
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.11.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.11.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.11.0)
|
||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.2.0)
|
||||
|
||||
AC_ARG_ENABLE(sanitize,
|
||||
[AS_HELP_STRING(
|
||||
[--enable-sanitize],
|
||||
[Compile with address sanitizer enabled],
|
||||
)],
|
||||
[sanitize=$enableval], [sanitize="no"])
|
||||
if test x"$sanitize" = x"yes"
|
||||
then
|
||||
CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"
|
||||
CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(werror,
|
||||
[AS_HELP_STRING(
|
||||
[--enable-werror],
|
||||
[Turn all compiler warnings into errors, with exceptions:
|
||||
a) deprecation (allow upstream to mark deprecation without breaking builds);
|
||||
b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)
|
||||
]
|
||||
)],
|
||||
[werror=$enableval], [werror="no"])
|
||||
if test x"$werror" = x"yes"
|
||||
then
|
||||
WERROR_FLAGS="-Werror"
|
||||
WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"
|
||||
WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"
|
||||
CFLAGS="$CFLAGS $WERROR_FLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"
|
||||
fi
|
||||
|
||||
# Enable/disable transcoding within osmo-bsc_mgcp?
|
||||
AC_ARG_ENABLE([mgcp-transcoding], [AS_HELP_STRING([--enable-mgcp-transcoding], [Build the MGCP gateway with internal transcoding enabled.])],
|
||||
[osmo_ac_mgcp_transcoding="$enableval"],[osmo_ac_mgcp_transcoding="no"])
|
||||
AC_ARG_WITH([g729], [AS_HELP_STRING([--with-g729], [Enable G.729 encoding/decoding.])], [osmo_ac_with_g729="$withval"],[osmo_ac_with_g729="no"])
|
||||
|
||||
if test "$osmo_ac_mgcp_transcoding" = "yes" ; then
|
||||
AC_SEARCH_LIBS([gsm_create], [gsm], [LIBRARY_GSM="$LIBS";LIBS=""], [AC_MSG_ERROR([--enable-mgcp-transcoding: cannot find usable libgsm])])
|
||||
AC_SUBST(LIBRARY_GSM)
|
||||
if test "$osmo_ac_with_g729" = "yes" ; then
|
||||
PKG_CHECK_MODULES(LIBBCG729, libbcg729 >= 0.1, [AC_DEFINE([HAVE_BCG729], [1], [Use bgc729 decoder/encoder])])
|
||||
fi
|
||||
AC_DEFINE(BUILD_MGCP_TRANSCODING, 1, [Define if we want to build the MGCP gateway with transcoding support])
|
||||
fi
|
||||
AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")
|
||||
AC_SUBST(osmo_ac_mgcp_transcoding)
|
||||
|
||||
dnl Checks for typedefs, structures and compiler characteristics
|
||||
|
||||
# The following test is taken from WebKit's webkit.m4
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fvisibility=hidden "
|
||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
SYMBOL_VISIBILITY="-fvisibility=hidden"],
|
||||
AC_MSG_RESULT([no]))
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
AC_SUBST(SYMBOL_VISIBILITY)
|
||||
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=null-dereference], [CFLAGS="$CFLAGS -Werror=null-dereference"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])
|
||||
|
||||
# Coverage build taken from WebKit's configure.in
|
||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||
AC_ARG_ENABLE(coverage,
|
||||
AC_HELP_STRING([--enable-coverage],
|
||||
[enable code coverage support [default=no]]),
|
||||
[],[enable_coverage="no"])
|
||||
AC_MSG_RESULT([$enable_coverage])
|
||||
if test "$enable_coverage" = "yes"; then
|
||||
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
AC_SUBST([COVERAGE_CFLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([vty_tests],
|
||||
AC_HELP_STRING([--enable-vty-tests],
|
||||
[Include the VTY/CTRL tests in make check (deprecated)
|
||||
[default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
AC_ARG_ENABLE([external_tests],
|
||||
AC_HELP_STRING([--enable-external-tests],
|
||||
[Include the VTY/CTRL tests in make check [default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
if test "x$enable_ext_tests" = "xyes" ; then
|
||||
AM_PATH_PYTHON
|
||||
AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
|
||||
if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
|
||||
AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING([whether to enable VTY/CTRL tests])
|
||||
AC_MSG_RESULT([$enable_ext_tests])
|
||||
AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")
|
||||
|
||||
AC_MSG_RESULT([CFLAGS="$CFLAGS"])
|
||||
AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])
|
||||
|
||||
dnl Generate the output
|
||||
AM_CONFIG_HEADER(bscconfig.h)
|
||||
|
||||
AC_OUTPUT(
|
||||
libosmo-legacy-mgcp.pc
|
||||
libosmo-mgcp-client.pc
|
||||
include/Makefile
|
||||
include/osmocom/Makefile
|
||||
include/osmocom/legacy_mgcp/Makefile
|
||||
include/osmocom/mgcp_client/Makefile
|
||||
include/osmocom/mgcp/Makefile
|
||||
src/Makefile
|
||||
src/libosmo-legacy-mgcp/Makefile
|
||||
src/libosmo-mgcp-client/Makefile
|
||||
src/libosmo-mgcp/Makefile
|
||||
src/osmo-bsc_mgcp/Makefile
|
||||
src/osmo-mgw/Makefile
|
||||
tests/Makefile
|
||||
tests/atlocal
|
||||
tests/legacy_mgcp/Makefile
|
||||
tests/mgcp_client/Makefile
|
||||
tests/mgcp/Makefile
|
||||
doc/Makefile
|
||||
doc/examples/Makefile
|
||||
contrib/Makefile
|
||||
Makefile)
|
1
contrib/Makefile.am
Normal file
1
contrib/Makefile.am
Normal file
@@ -0,0 +1 @@
|
||||
EXTRA_DIST = ipa.py
|
278
contrib/ipa.py
Executable file
278
contrib/ipa.py
Executable file
@@ -0,0 +1,278 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- mode: python-mode; py-indent-tabs-mode: nil -*-
|
||||
"""
|
||||
/*
|
||||
* Copyright (C) 2016 sysmocom s.f.m.c. GmbH
|
||||
*
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
"""
|
||||
|
||||
import struct, random, sys
|
||||
|
||||
class IPA(object):
|
||||
"""
|
||||
Stateless IPA protocol multiplexer: add/remove/parse (extended) header
|
||||
"""
|
||||
version = "0.0.5"
|
||||
TCP_PORT_OML = 3002
|
||||
TCP_PORT_RSL = 3003
|
||||
# OpenBSC extensions: OSMO, MGCP_OLD
|
||||
PROTO = dict(RSL=0x00, CCM=0xFE, SCCP=0xFD, OML=0xFF, OSMO=0xEE, MGCP_OLD=0xFC)
|
||||
# ...OML Router Control, GSUP GPRS extension, Osmocom Authn Protocol
|
||||
EXT = dict(CTRL=0, MGCP=1, LAC=2, SMSC=3, ORC=4, GSUP=5, OAP=6)
|
||||
# OpenBSC extension: SCCP_OLD
|
||||
MSGT = dict(PING=0x00, PONG=0x01, ID_GET=0x04, ID_RESP=0x05, ID_ACK=0x06, SCCP_OLD=0xFF)
|
||||
_IDTAG = dict(SERNR=0, UNITNAME=1, LOCATION=2, TYPE=3, EQUIPVERS=4, SWVERSION=5, IPADDR=6, MACADDR=7, UNIT=8)
|
||||
CTRL_GET = 'GET'
|
||||
CTRL_SET = 'SET'
|
||||
CTRL_REP = 'REPLY'
|
||||
CTRL_ERR = 'ERR'
|
||||
CTRL_TRAP = 'TRAP'
|
||||
|
||||
def _l(self, d, p):
|
||||
"""
|
||||
Reverse dictionary lookup: return key for a given value
|
||||
"""
|
||||
if p is None:
|
||||
return 'UNKNOWN'
|
||||
return list(d.keys())[list(d.values()).index(p)]
|
||||
|
||||
def _tag(self, t, v):
|
||||
"""
|
||||
Create TAG as TLV data
|
||||
"""
|
||||
return struct.pack(">HB", len(v) + 1, t) + v
|
||||
|
||||
def proto(self, p):
|
||||
"""
|
||||
Lookup protocol name
|
||||
"""
|
||||
return self._l(self.PROTO, p)
|
||||
|
||||
def ext(self, p):
|
||||
"""
|
||||
Lookup protocol extension name
|
||||
"""
|
||||
return self._l(self.EXT, p)
|
||||
|
||||
def msgt(self, p):
|
||||
"""
|
||||
Lookup message type name
|
||||
"""
|
||||
return self._l(self.MSGT, p)
|
||||
|
||||
def idtag(self, p):
|
||||
"""
|
||||
Lookup ID tag name
|
||||
"""
|
||||
return self._l(self._IDTAG, p)
|
||||
|
||||
def ext_name(self, proto, exten):
|
||||
"""
|
||||
Return proper extension byte name depending on the protocol used
|
||||
"""
|
||||
if self.PROTO['CCM'] == proto:
|
||||
return self.msgt(exten)
|
||||
if self.PROTO['OSMO'] == proto:
|
||||
return self.ext(exten)
|
||||
return None
|
||||
|
||||
def add_header(self, data, proto, ext=None):
|
||||
"""
|
||||
Add IPA header (with extension if necessary), data must be represented as bytes
|
||||
"""
|
||||
if ext is None:
|
||||
return struct.pack(">HB", len(data) + 1, proto) + data
|
||||
return struct.pack(">HBB", len(data) + 1, proto, ext) + data
|
||||
|
||||
def del_header(self, data):
|
||||
"""
|
||||
Strip IPA protocol header correctly removing extension if present
|
||||
Returns data length, IPA protocol, extension (or None if not defined for a give protocol) and the data without header
|
||||
"""
|
||||
if not len(data):
|
||||
return None, None, None, None
|
||||
(dlen, proto) = struct.unpack('>HB', data[:3])
|
||||
if self.PROTO['OSMO'] == proto or self.PROTO['CCM'] == proto: # there's extension which we have to unpack
|
||||
return struct.unpack('>HBB', data[:4]) + (data[4:], ) # length, protocol, extension, data
|
||||
return dlen, proto, None, data[3:] # length, protocol, _, data
|
||||
|
||||
def split_combined(self, data):
|
||||
"""
|
||||
Split the data which contains multiple concatenated IPA messages into tuple (first, rest) where rest contains remaining messages, first is the single IPA message
|
||||
"""
|
||||
(length, _, _, _) = self.del_header(data)
|
||||
return data[:(length + 3)], data[(length + 3):]
|
||||
|
||||
def tag_serial(self, data):
|
||||
"""
|
||||
Make TAG for serial number
|
||||
"""
|
||||
return self._tag(self._IDTAG['SERNR'], data)
|
||||
|
||||
def tag_name(self, data):
|
||||
"""
|
||||
Make TAG for unit name
|
||||
"""
|
||||
return self._tag(self._IDTAG['UNITNAME'], data)
|
||||
|
||||
def tag_loc(self, data):
|
||||
"""
|
||||
Make TAG for location
|
||||
"""
|
||||
return self._tag(self._IDTAG['LOCATION'], data)
|
||||
|
||||
def tag_type(self, data):
|
||||
"""
|
||||
Make TAG for unit type
|
||||
"""
|
||||
return self._tag(self._IDTAG['TYPE'], data)
|
||||
|
||||
def tag_equip(self, data):
|
||||
"""
|
||||
Make TAG for equipment version
|
||||
"""
|
||||
return self._tag(self._IDTAG['EQUIPVERS'], data)
|
||||
|
||||
def tag_sw(self, data):
|
||||
"""
|
||||
Make TAG for software version
|
||||
"""
|
||||
return self._tag(self._IDTAG['SWVERSION'], data)
|
||||
|
||||
def tag_ip(self, data):
|
||||
"""
|
||||
Make TAG for IP address
|
||||
"""
|
||||
return self._tag(self._IDTAG['IPADDR'], data)
|
||||
|
||||
def tag_mac(self, data):
|
||||
"""
|
||||
Make TAG for MAC address
|
||||
"""
|
||||
return self._tag(self._IDTAG['MACADDR'], data)
|
||||
|
||||
def tag_unit(self, data):
|
||||
"""
|
||||
Make TAG for unit ID
|
||||
"""
|
||||
return self._tag(self._IDTAG['UNIT'], data)
|
||||
|
||||
def identity(self, unit=b'', mac=b'', location=b'', utype=b'', equip=b'', sw=b'', name=b'', serial=b''):
|
||||
"""
|
||||
Make IPA IDENTITY tag list, by default returns empty concatenated bytes of tag list
|
||||
"""
|
||||
return self.tag_unit(unit) + self.tag_mac(mac) + self.tag_loc(location) + self.tag_type(utype) + self.tag_equip(equip) + self.tag_sw(sw) + self.tag_name(name) + self.tag_serial(serial)
|
||||
|
||||
def ping(self):
|
||||
"""
|
||||
Make PING message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PING'])
|
||||
|
||||
def pong(self):
|
||||
"""
|
||||
Make PONG message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['PONG'])
|
||||
|
||||
def id_ack(self):
|
||||
"""
|
||||
Make ID_ACK CCM message
|
||||
"""
|
||||
return self.add_header(b'', self.PROTO['CCM'], self.MSGT['ID_ACK'])
|
||||
|
||||
def id_get(self):
|
||||
"""
|
||||
Make ID_GET CCM message
|
||||
"""
|
||||
return self.add_header(self.identity(), self.PROTO['CCM'], self.MSGT['ID_GET'])
|
||||
|
||||
def id_resp(self, data):
|
||||
"""
|
||||
Make ID_RESP CCM message
|
||||
"""
|
||||
return self.add_header(data, self.PROTO['CCM'], self.MSGT['ID_RESP'])
|
||||
|
||||
class Ctrl(IPA):
|
||||
"""
|
||||
Osmocom CTRL protocol implemented on top of IPA multiplexer
|
||||
"""
|
||||
def __init__(self):
|
||||
random.seed()
|
||||
|
||||
def add_header(self, data):
|
||||
"""
|
||||
Add CTRL header
|
||||
"""
|
||||
return super(Ctrl, self).add_header(data.encode('utf-8'), IPA.PROTO['OSMO'], IPA.EXT['CTRL'])
|
||||
|
||||
def rem_header(self, data):
|
||||
"""
|
||||
Remove CTRL header, check for appropriate protocol and extension
|
||||
"""
|
||||
(_, proto, ext, d) = super(Ctrl, self).del_header(data)
|
||||
if self.PROTO['OSMO'] != proto or self.EXT['CTRL'] != ext:
|
||||
return None
|
||||
return d
|
||||
|
||||
def parse(self, data, op=None):
|
||||
"""
|
||||
Parse Ctrl string returning (var, value) pair
|
||||
var could be None in case of ERROR message
|
||||
value could be None in case of GET message
|
||||
"""
|
||||
(s, i, v) = data.split(' ', 2)
|
||||
if s == self.CTRL_ERR:
|
||||
return None, v
|
||||
if s == self.CTRL_GET:
|
||||
return v, None
|
||||
(s, i, var, val) = data.split(' ', 3)
|
||||
if s == self.CTRL_TRAP and i != '0':
|
||||
return None, '%s with non-zero id %s' % (s, i)
|
||||
if op is not None and i != op:
|
||||
if s == self.CTRL_GET + '_' + self.CTRL_REP or s == self.CTRL_SET + '_' + self.CTRL_REP:
|
||||
return None, '%s with unexpected id %s' % (s, i)
|
||||
return var, val
|
||||
|
||||
def trap(self, var, val):
|
||||
"""
|
||||
Make TRAP message with given (vak, val) pair
|
||||
"""
|
||||
return self.add_header("%s 0 %s %s" % (self.CTRL_TRAP, var, val))
|
||||
|
||||
def cmd(self, var, val=None):
|
||||
"""
|
||||
Make SET/GET command message: returns (r, m) tuple where r is random operation id and m is assembled message
|
||||
"""
|
||||
r = random.randint(1, sys.maxsize)
|
||||
if val is not None:
|
||||
return r, self.add_header("%s %s %s %s" % (self.CTRL_SET, r, var, val))
|
||||
return r, self.add_header("%s %s %s" % (self.CTRL_GET, r, var))
|
||||
|
||||
def verify(self, reply, r, var, val=None):
|
||||
"""
|
||||
Verify reply to SET/GET command: returns (b, v) tuple where v is True/False verification result and v is the variable value
|
||||
"""
|
||||
(k, v) = self.parse(reply)
|
||||
if k != var or (val is not None and v != val):
|
||||
return False, v
|
||||
return True, v
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("IPA multiplexer v%s loaded." % IPA.version)
|
49
contrib/jenkins.sh
Executable file
49
contrib/jenkins.sh
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
# jenkins build helper script for openbsc. This is how we build on jenkins.osmocom.org
|
||||
|
||||
if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then
|
||||
echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
|
||||
set -ex
|
||||
|
||||
base="$PWD"
|
||||
deps="$base/deps"
|
||||
inst="$deps/install"
|
||||
export deps inst
|
||||
|
||||
osmo-clean-workspace.sh
|
||||
|
||||
mkdir "$deps" || true
|
||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
|
||||
|
||||
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
|
||||
|
||||
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
export LD_LIBRARY_PATH="$inst/lib"
|
||||
|
||||
osmo-build-dep.sh libosmo-abis
|
||||
osmo-build-dep.sh libosmo-netif
|
||||
|
||||
set +x
|
||||
echo
|
||||
echo
|
||||
echo
|
||||
echo " =============================== osmo-mgw ==============================="
|
||||
echo
|
||||
set -x
|
||||
|
||||
cd "$base"
|
||||
autoreconf --install --force
|
||||
./configure $MGCP --enable-vty-tests --enable-external-tests --enable-werror
|
||||
$MAKE $PARALLEL_MAKE
|
||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
|
||||
|| cat-testlogs.sh
|
||||
LD_LIBRARY_PATH="$inst/lib" \
|
||||
DISTCHECK_CONFIGURE_FLAGS="$MGCP --enable-vty-tests --enable-external-tests" \
|
||||
$MAKE distcheck \
|
||||
|| cat-testlogs.sh
|
||||
|
||||
osmo-clean-workspace.sh
|
11
contrib/systemd/osmo-bsc-mgcp.service
Normal file
11
contrib/systemd/osmo-bsc-mgcp.service
Normal file
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=OpenBSC MGCP
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/osmo-bsc_mgcp -s -c /etc/osmocom/osmo-bsc-mgcp.cfg
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
11
contrib/systemd/osmo-mgw.service
Normal file
11
contrib/systemd/osmo-mgw.service
Normal file
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=Osmocom Media Gateway (MGW)
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/osmo-mgw -s -c /etc/osmocom/osmo-mgw.cfg
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
173
debian/changelog
vendored
Normal file
173
debian/changelog
vendored
Normal file
@@ -0,0 +1,173 @@
|
||||
osmo-mgw (1.3.0) unstable; urgency=medium
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* contrib: Add osmo-mgw systemd service
|
||||
* legacy: mgcp_protocol: Don't print osmux stats if it is off
|
||||
* mgcp_stat: Don't print osmux stats if it is off
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* fix segfault: DLCX for unknown endpoint: dont try to log NULL endpoint
|
||||
* MGCP endpoints: parse as decimal, not hex
|
||||
* add --enable-sanitize config option
|
||||
* legacy_mgcp: mgcp_test: sanitize: free msgb_ctx
|
||||
* mgcp_test: test_packet_error_detection: sanitize: free all conns
|
||||
* mgcp_test: test_no_cycle: sanitize: free endp
|
||||
* mgcp_test: sanitize: free msgb_ctx
|
||||
* mgcp_client: don't configure "bts base"
|
||||
* Revert "mgcp_client: don't configure "bts base"" until osmo-msc is ready
|
||||
* mgcp_client: add transaction cleanup
|
||||
* mgcp_client_test makefile: add update_exp target
|
||||
* cosmetic: mgcp_network: typo in log
|
||||
* osmo-mgw: Add talloc context introspection via VTY
|
||||
* mgcp_client: show failure by MGCP SDP section parsing test
|
||||
* mgcp_client: cosmetic: clean up SDP params parsing
|
||||
* mgcp_client: detect SDP section-start parsing errors
|
||||
* compiler warning: ignore deprecated in mgcp_client_test.c
|
||||
* configure: add --enable-werror
|
||||
* jenkins.sh: add --enable-werror to configure flags
|
||||
* cosmetic: mgcp, legacy_mgcp: drop unused vty.h definitions
|
||||
* use osmo_init_logging2() with proper talloc ctx
|
||||
|
||||
[ Philipp Maier ]
|
||||
* osmux: fix nullpointer dereference
|
||||
* cosmetic: guard dead osmux vty code with ifdef
|
||||
* cosmetic: remove prefix "net" from rtp related vty commands
|
||||
* doc: update sample config file
|
||||
* cosmetic: use correct VTY port number constant
|
||||
* vty: simplify endpoint allocation
|
||||
* vty: do not change number_endpoints at runtime
|
||||
* MGCP: Connection Identifiers are hex strings
|
||||
* libosmo-mgcp: Connection Identifiers are allocated by MGW, not CA
|
||||
* client: use osmo_strlcpy instead of strncpy
|
||||
* cosmetic: fix sourcecode formatting
|
||||
* cosmetic: clearly mark endpoint numbers as hex
|
||||
* client: use string as connection identifier
|
||||
* conn: remove assertions
|
||||
* mgcp_test: fix wrong strcmp() parameters
|
||||
* mgcp_test: fix nullpointer dereference
|
||||
* mgcp_test: add returncode check
|
||||
* mgcp_test: fix possible double free
|
||||
* mcgp_client: mgcp_msg_gen(): add checks to verify params
|
||||
* network: use originating RTP packet address for loopback
|
||||
* client: mgcp_response_parse_params: check rtp port
|
||||
* mgcp: allow endpoints beginning from zero
|
||||
* client/common: move constant MGCP_ENDPOINT_MAXLEN
|
||||
* mgcp: make domain name configurable
|
||||
* cosmetic: protocol: remove unnecessary nul termination
|
||||
* client: do not insist on \n\n when parsing MGCP messages
|
||||
* main: display mgcp ip/port
|
||||
* client: make callid in MDCX mandatory
|
||||
* client: add missing mandatory SDP fields
|
||||
* mgcp: permit wildcarded endpoint assignment (CRCX)
|
||||
* mgcp: add prefix to virtual trunk
|
||||
* client: eliminate destructive parameter parsing
|
||||
* client: eliminate destructive head parsing
|
||||
* cosmetic: client: add doxygen comments
|
||||
* protocol: fix problem with line break and OSMUX
|
||||
* protocol: fix missing carriage return
|
||||
* client: fix sdp parameter ordering
|
||||
* protocol: check the packetization in local cx options
|
||||
* cosmetic: remove spaces from pointer symbol
|
||||
* client: Do not accept endpoint ids with wildcards in responses
|
||||
* client: do not accept endpoint ids without @ character in responses
|
||||
* client: prohibit endpoint ids without @ character
|
||||
* protocol: on wildcarded CRCX return endpoint number as hex
|
||||
* msg: fix response code on exhausted endp resources
|
||||
* cosmetic: move mgcp_release_endp() to mgcp_ep.c
|
||||
* client: use heap to store mgcp_response
|
||||
* ep: move endpoint struct and define to mgcp_ep.h
|
||||
* cosmetic: rename mgcp_release_endp to mgcp_endp_release
|
||||
* cosmetic: rename mgcp_ep.c/h to mgcp_endp.c/h
|
||||
* protocol: reject DLCX/CRCX/MDCX on unsupported parameters
|
||||
* protocol: exit cleanly when local cx options check fails
|
||||
* cosmetic: Add missing \n on log line
|
||||
* protocol: check requested connection mode
|
||||
* protocol: fix tagging of wildcarded requests
|
||||
* protocol: prohibit wildcarded requests for MDCX and DLCX
|
||||
* mgcp: fix use-after-free and add callback for endpoint cleanup
|
||||
* client: add an optional FSM interface
|
||||
* mgcp_client_fsm: Add FSM event names
|
||||
* cosmetic: mgcp_client_fsm: rename enums
|
||||
* cosmetic: rename function .._conn_reset() to .._conn_init()
|
||||
* mgcp_conn: do not touch u.rtp in mgcp_conn_alloc()
|
||||
* cosmetic: rename .._codec_reset() to .._codec_init()
|
||||
* mgcp_conn: add function mgcp_rtp_conn_cleanup()
|
||||
* stats: use libosmocore rate counter for in/out_stream.err_ts_counter
|
||||
|
||||
[ Alexander Couzens ]
|
||||
* debian/control: correct library dependency of osmo-mgw against libosmo-mgcp1
|
||||
* debian: include systemd service osmo-mgw.service
|
||||
* Revert "stats: use libosmocore rate counter for in/out_stream.err_ts_counter"
|
||||
|
||||
[ Harald Welte ]
|
||||
* cosmetic: fix whitespaces; we use tabs for indentation
|
||||
* Fix possible buffer overflow in mgcp_conn_dump()
|
||||
* osmo-mgw: Update copyright statement
|
||||
* osmo-mgw: Config file is osmo-mgw.cfg, and not mgcp.cfg
|
||||
* osmo-mgw: Fix copyright notice
|
||||
* strct mgcp_rtp_state: Group + document struct members related to patching
|
||||
* mgcp_rtp_state: grup 'stats' members into sub-structure
|
||||
* mgcp_rtp_end: Group statistics members into 'stats' sub-struct
|
||||
* libosmo-mgcp: Cosmetic spelling fixes in comments
|
||||
* mgcp_msg: We must parse endpoint numbers as hex, not decimal!
|
||||
* mgcp_internal.h: document more struct members with comments
|
||||
* centralize handling of common errors like "endpoint not found"
|
||||
* Return proper MGCP Error codes, as per spec
|
||||
* osmo-mgw: Use libosmocore socket abstraction
|
||||
* osmo-bsc_mgcp: Add LIBOSMONETIF_{CFLAGS,LIBS}
|
||||
* libosmo-mgcp-client is GPLv2+, not AGPLv3+
|
||||
* Turn libosmo-mgcp into local, non-installed library
|
||||
|
||||
[ Stefan Sperling ]
|
||||
* enable osmo_fsm vty commands in libosmo-mgcp-client vty
|
||||
|
||||
-- Pau Espin Pedrol <pespin@sysmocom.de> Thu, 03 May 2018 17:40:35 +0200
|
||||
|
||||
osmo-mgw (1.2.0) unstable; urgency=medium
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* jenkins: use osmo-clean-workspace.sh before and after build
|
||||
* vty: skip installing cmds now always installed by default
|
||||
* mgcp-client vty: use name 'mgw' instead of 'mgcpgw'
|
||||
* mgcp client: vty: tweak doc strings
|
||||
|
||||
[ Philipp Maier ]
|
||||
* sdp: refactoring sdp parser/generator
|
||||
* cosmetic: rename bts_codec to codec_str
|
||||
* cosmetic: fix coding style for mgcp_parse_sdp_data()
|
||||
* cosmetic: fix commenting style
|
||||
* cosmetic: correct whitespaces
|
||||
* client: fix stderror logging in unit-test
|
||||
* client: add unified function to generate MGCP messages
|
||||
* client: add ip address parsing to the client
|
||||
* protocol: allow wildcarded DLCX
|
||||
* mgcp: remove port/timeslot calculator functions from mgcp.h
|
||||
* network: add separate log category
|
||||
* cosmetic: make dummy packet handling more explicit
|
||||
* network: autdetect rtp bind ip-address
|
||||
* network: fix rtp packet length
|
||||
* network: remove unused return code
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* mgcp_client_vty.c: Fix VTY compatibility with 'mgcpgw bts-base'
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Fri, 10 Nov 2017 11:10:23 +0900
|
||||
|
||||
osmo-mgw (1.1.0) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Harald Welte <lafore@gnumonks.org> Sat, 28 Oct 2017 12:48:41 +0200
|
||||
|
||||
osmo-mgw (1.0.2) unstable; urgency=low
|
||||
|
||||
* First release after major rename.
|
||||
|
||||
-- Max Suraev <msuraev@sysmocom.de> Thu, 14 Sep 2017 18:41:05 +0200
|
||||
|
||||
|
||||
osmo-mgw (0.1.0) unstable; urgency=low
|
||||
|
||||
* Initial release.
|
||||
|
||||
-- Alexander Couzens <lynxis@fe80.eu> Tue, 08 Aug 2017 01:12:53 +0000
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@@ -0,0 +1 @@
|
||||
9
|
56
debian/control
vendored
Normal file
56
debian/control
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
Source: osmo-mgw
|
||||
Section: net
|
||||
Priority: extra
|
||||
Maintainer: Alexander Couzens <lynxis@fe80.eu>
|
||||
Build-Depends: debhelper (>=9),
|
||||
dh-autoreconf,
|
||||
pkg-config,
|
||||
autotools-dev,
|
||||
libosmocore-dev,
|
||||
libosmo-netif-dev
|
||||
Standards-Version: 3.9.8
|
||||
Vcs-Git: git://git.osmocom.org/osmo-mgw.git
|
||||
Vcs-Browser: https://git.osmocom.org/osmo-mgw/
|
||||
Homepage: https://osmocom.org/projects/osmo-mgw
|
||||
|
||||
Package: osmo-mgw
|
||||
Architecture: any
|
||||
Multi-Arch: foreign
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: OsmoMGW: Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
|
||||
|
||||
Package: libosmo-mgcp-client3
|
||||
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-client3 (= ${binary:Version}), ${misc:Depends}
|
||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
|
||||
|
||||
Package: osmo-bsc-mgcp
|
||||
Architecture: any
|
||||
Multi-Arch: foreign
|
||||
Depends: libosmo-legacy-mgcp0, ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: OsmoBSC-MGCP: Osmocom's Legacy Media Gateway; use osmo-mgw instead.
|
||||
|
||||
Package: libosmo-legacy-mgcp0
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
|
||||
|
||||
Package: libosmo-legacy-mgcp-dev
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Depends: libosmo-legacy-mgcp0 (= ${binary:Version}), ${misc:Depends}
|
||||
Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
|
101
debian/copyright
vendored
Normal file
101
debian/copyright
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: osmo-mgw
|
||||
Source: git://git.osmocom.org/osmo-mgw
|
||||
|
||||
Files: *
|
||||
Copyright: 2009-2014 On-Waves
|
||||
2009-2015 Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
|
||||
2016-2017 sysmocom s.m.f.c. GmbH <info@sysmocom.de>
|
||||
License: AGPL-3.0+
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Files: src/libosmo-mgcp-client/* include/osmocom/mgcp_client/*
|
||||
Copyright: 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
|
||||
Based on OpenBSC interface to quagga VTY (libmsc/vty_interface_layer3.c)
|
||||
2009 by Harald Welte <laforge@gnumonks.org>
|
||||
2009-2011 by Holger Hans Peter Freyther
|
||||
License: GPL-2.0+
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Files: src/libosmo-legacy-mgcp/g711common.h
|
||||
Copyright: 2000 Abramo Bagnara <abramo@alsa-project.org>
|
||||
License: GPL-2.0+
|
||||
Wrapper for linphone Codec class by Simon Morlat <simon.morlat@linphone.org>
|
||||
.
|
||||
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
.
|
||||
The FSF address in the above text is the old one.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General Public License
|
||||
Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
|
||||
|
||||
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+
|
||||
|
||||
Files: src/libosmo-legacy-mgcp/mgcp_osmux.c
|
||||
Copyright: 2012-2013 On Waves ehf <http://www.on-waves.com>
|
||||
2012-2013 Pablo Neira Ayuso <pablo@gnumonks.org>
|
||||
License: AGPL-3.0+
|
||||
All rights not specifically granted under this license are 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.
|
||||
|
4
debian/libosmo-legacy-mgcp-dev.install
vendored
Normal file
4
debian/libosmo-legacy-mgcp-dev.install
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
usr/include/osmocom/legacy_mgcp
|
||||
usr/lib/*/libosmo-legacy-mgcp.so
|
||||
usr/lib/*/libosmo-legacy-mgcp.a
|
||||
usr/lib/*/pkgconfig/libosmo-legacy-mgcp.pc
|
1
debian/libosmo-legacy-mgcp0.install
vendored
Normal file
1
debian/libosmo-legacy-mgcp0.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/lib/*/libosmo-legacy-mgcp.so.*
|
4
debian/libosmo-mgcp-client-dev.install
vendored
Normal file
4
debian/libosmo-mgcp-client-dev.install
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
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-client3.install
vendored
Normal file
1
debian/libosmo-mgcp-client3.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/lib/*/libosmo-mgcp-client.so.*
|
1
debian/osmo-bsc-mgcp.install
vendored
Normal file
1
debian/osmo-bsc-mgcp.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/bin/osmo-bsc_mgcp
|
1
debian/osmo-bsc-mgcp.service
vendored
Symbolic link
1
debian/osmo-bsc-mgcp.service
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../contrib/systemd/osmo-bsc-mgcp.service
|
1
debian/osmo-mgw.install
vendored
Normal file
1
debian/osmo-mgw.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/bin/osmo-mgw
|
1
debian/osmo-mgw.service
vendored
Symbolic link
1
debian/osmo-mgw.service
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../contrib/systemd/osmo-mgw.service
|
36
debian/rules
vendored
Executable file
36
debian/rules
vendored
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/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_autoreconf:
|
||||
echo $(VERSION) > .tarball-version
|
||||
dh_autoreconf
|
||||
|
||||
# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
3.0 (native)
|
3
doc/Makefile.am
Normal file
3
doc/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
SUBDIRS = \
|
||||
examples \
|
||||
$(NULL)
|
@@ -1,4 +1,3 @@
|
||||
|
||||
CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'
|
||||
|
||||
dist-hook:
|
14
doc/examples/osmo-bsc_mgcp/mgcp.cfg
Normal file
14
doc/examples/osmo-bsc_mgcp/mgcp.cfg
Normal file
@@ -0,0 +1,14 @@
|
||||
!
|
||||
! MGCP configuration example
|
||||
!
|
||||
mgcp
|
||||
!local ip 10.23.24.2
|
||||
!bts ip 10.24.24.1
|
||||
!bind ip 10.23.24.1
|
||||
bind port 2427
|
||||
rtp base 4000
|
||||
rtp force-ptime 20
|
||||
sdp audio payload number 98
|
||||
sdp audio payload name AMR/8000
|
||||
number endpoints 31
|
||||
no rtcp-omit
|
18
doc/examples/osmo-mgw/osmo-mgw.cfg
Normal file
18
doc/examples/osmo-mgw/osmo-mgw.cfg
Normal file
@@ -0,0 +1,18 @@
|
||||
!
|
||||
! MGCP configuration example
|
||||
!
|
||||
mgcp
|
||||
bind ip 127.0.0.1
|
||||
rtp port-range 4002 16000
|
||||
rtp bind-ip 10.9.1.122
|
||||
rtp ip-probing
|
||||
rtp ip-tos 184
|
||||
bind port 2427
|
||||
sdp audio payload number 98
|
||||
sdp audio payload name GSM
|
||||
number endpoints 31
|
||||
loop 0
|
||||
force-realloc 1
|
||||
rtcp-omit
|
||||
rtp-patch ssrc
|
||||
rtp-patch timestamp
|
@@ -92,7 +92,7 @@ fi
|
||||
if test -n "$v"
|
||||
then
|
||||
: # use $v
|
||||
elif test -d ./../.git \
|
||||
elif test -d ./.git \
|
||||
&& v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
|
||||
|| git describe --abbrev=4 HEAD 2>/dev/null` \
|
||||
&& case $v in
|
@@ -1,125 +0,0 @@
|
||||
#!/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()
|
||||
|
16
include/Makefile.am
Normal file
16
include/Makefile.am
Normal file
@@ -0,0 +1,16 @@
|
||||
SUBDIRS = \
|
||||
osmocom \
|
||||
$(NULL)
|
||||
|
||||
nobase_include_HEADERS = \
|
||||
osmocom/legacy_mgcp/mgcp.h \
|
||||
osmocom/legacy_mgcp/mgcp_internal.h \
|
||||
osmocom/legacy_mgcp/osmux.h \
|
||||
osmocom/mgcp_client/mgcp_client.h \
|
||||
osmocom/mgcp_client/mgcp_client_fsm.h \
|
||||
osmocom/mgcp_client/mgcp_common.h \
|
||||
osmocom/mgcp/mgcp.h \
|
||||
osmocom/mgcp/mgcp_common.h \
|
||||
osmocom/mgcp/mgcp_internal.h \
|
||||
osmocom/mgcp/osmux.h \
|
||||
$(NULL)
|
5
include/osmocom/Makefile.am
Normal file
5
include/osmocom/Makefile.am
Normal file
@@ -0,0 +1,5 @@
|
||||
SUBDIRS = \
|
||||
legacy_mgcp \
|
||||
mgcp_client \
|
||||
mgcp \
|
||||
$(NULL)
|
4
include/osmocom/legacy_mgcp/Makefile.am
Normal file
4
include/osmocom/legacy_mgcp/Makefile.am
Normal file
@@ -0,0 +1,4 @@
|
||||
noinst_HEADERS = \
|
||||
mgcp_transcode.h \
|
||||
vty.h \
|
||||
$(NULL)
|
@@ -1,8 +1,8 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
|
||||
/*
|
||||
* (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2011 by On-Waves
|
||||
* (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
|
||||
@@ -25,10 +25,13 @@
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/write_queue.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include <osmocom/core/timer.h>
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define RTP_PORT_DEFAULT 4000
|
||||
#define RTP_PORT_NET_DEFAULT 16000
|
||||
@@ -64,6 +67,7 @@ static inline int rtp_calculate_port(int multiplex, int base)
|
||||
struct mgcp_endpoint;
|
||||
struct mgcp_config;
|
||||
struct mgcp_trunk_config;
|
||||
struct mgcp_rtp_end;
|
||||
|
||||
#define MGCP_ENDP_CRCX 1
|
||||
#define MGCP_ENDP_DLCX 2
|
||||
@@ -83,6 +87,25 @@ typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
|
||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
|
||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
|
||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
|
||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
|
||||
|
||||
/**
|
||||
* Return:
|
||||
* < 0 in case no audio was processed
|
||||
* >= 0 in case audio was processed. The remaining payload
|
||||
* length will be returned.
|
||||
*/
|
||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
struct mgcp_rtp_end *src_end);
|
||||
|
||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
|
||||
int *payload_type,
|
||||
const char**subtype_name,
|
||||
const char**fmtp_extra);
|
||||
|
||||
#define PORT_ALLOC_STATIC 0
|
||||
#define PORT_ALLOC_DYNAMIC 1
|
||||
@@ -93,6 +116,9 @@ typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
|
||||
struct mgcp_port_range {
|
||||
int mode;
|
||||
|
||||
/* addr or NULL to fall-back to default */
|
||||
char *bind_addr;
|
||||
|
||||
/* pre-allocated from a base? */
|
||||
int base_port;
|
||||
|
||||
@@ -102,6 +128,8 @@ struct mgcp_port_range {
|
||||
int last_port;
|
||||
};
|
||||
|
||||
#define MGCP_KEEPALIVE_ONCE (-1)
|
||||
|
||||
struct mgcp_trunk_config {
|
||||
struct llist_head entry;
|
||||
|
||||
@@ -110,17 +138,45 @@ struct mgcp_trunk_config {
|
||||
int trunk_nr;
|
||||
int trunk_type;
|
||||
|
||||
char *audio_fmtp_extra;
|
||||
char *audio_name;
|
||||
int audio_payload;
|
||||
int audio_send_ptime;
|
||||
int audio_send_name;
|
||||
int audio_loop;
|
||||
|
||||
int no_audio_transcoding;
|
||||
|
||||
int omit_rtcp;
|
||||
int keepalive_interval;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* 0: don't, 1: once */
|
||||
int force_aligned_timing;
|
||||
|
||||
/* spec handling */
|
||||
int force_realloc;
|
||||
|
||||
/* timer */
|
||||
struct osmo_timer_list keepalive_timer;
|
||||
|
||||
unsigned int number_endpoints;
|
||||
struct mgcp_endpoint *endpoints;
|
||||
};
|
||||
|
||||
enum mgcp_role {
|
||||
MGCP_BSC = 0,
|
||||
MGCP_BSC_NAT,
|
||||
};
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
struct mgcp_config {
|
||||
int source_port;
|
||||
char *local_ip;
|
||||
@@ -135,6 +191,12 @@ struct mgcp_config {
|
||||
struct in_addr transcoder_in;
|
||||
int transcoder_remote_base;
|
||||
|
||||
/* RTP processing */
|
||||
mgcp_processing rtp_processing_cb;
|
||||
mgcp_processing_setup setup_rtp_processing_cb;
|
||||
|
||||
mgcp_get_format get_net_downlink_format_cb;
|
||||
|
||||
struct osmo_wqueue gw_fd;
|
||||
|
||||
struct mgcp_port_range bts_ports;
|
||||
@@ -142,10 +204,13 @@ struct mgcp_config {
|
||||
struct mgcp_port_range transcoder_ports;
|
||||
int endp_dscp;
|
||||
|
||||
int bts_force_ptime;
|
||||
|
||||
mgcp_change change_cb;
|
||||
mgcp_policy policy_cb;
|
||||
mgcp_reset reset_cb;
|
||||
mgcp_realloc realloc_cb;
|
||||
mgcp_rqnt rqnt_cb;
|
||||
void *data;
|
||||
|
||||
uint32_t last_call_id;
|
||||
@@ -157,27 +222,59 @@ struct mgcp_config {
|
||||
/* only used for start with a static configuration */
|
||||
int last_net_port;
|
||||
int last_bts_port;
|
||||
|
||||
enum mgcp_role role;
|
||||
|
||||
/* osmux translator: 0 means disabled, 1 means enabled */
|
||||
int osmux;
|
||||
/* addr to bind the server to */
|
||||
char *osmux_addr;
|
||||
/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
|
||||
* the osmux socket is already initialized.
|
||||
*/
|
||||
int osmux_init;
|
||||
/* osmux batch factor: from 1 to 4 maximum */
|
||||
int osmux_batch;
|
||||
/* osmux batch size (in bytes) */
|
||||
int osmux_batch_size;
|
||||
/* osmux port */
|
||||
uint16_t osmux_port;
|
||||
/* Pad circuit with dummy messages until we see the first voice
|
||||
* message.
|
||||
*/
|
||||
uint16_t osmux_dummy;
|
||||
|
||||
/* Use a jitterbuffer on the bts-side receiver */
|
||||
bool bts_use_jibuf;
|
||||
/* Minimum and maximum buffer size for the jitter buffer, in ms */
|
||||
uint32_t bts_jitter_delay_min;
|
||||
uint32_t bts_jitter_delay_max;
|
||||
};
|
||||
|
||||
/* config management */
|
||||
struct mgcp_config *mgcp_config_alloc(void);
|
||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg);
|
||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
|
||||
enum mgcp_role role);
|
||||
int mgcp_vty_init(void);
|
||||
int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
|
||||
void mgcp_free_endp(struct mgcp_endpoint *endp);
|
||||
void mgcp_release_endp(struct mgcp_endpoint *endp);
|
||||
void mgcp_initialize_endp(struct mgcp_endpoint *endp);
|
||||
int mgcp_reset_transcoder(struct mgcp_config *cfg);
|
||||
void mgcp_format_stats(struct mgcp_endpoint *endp, char *stats, size_t size);
|
||||
int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os, uint32_t *pr, uint32_t *_or, int *loss, uint32_t *jitter);
|
||||
|
||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
|
||||
|
||||
/*
|
||||
* format helper functions
|
||||
*/
|
||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
|
||||
struct msgb *mgcp_create_response_with_data(int code, const char *txt, const char *msg, const char *trans, const char *data);
|
||||
|
||||
/* adc helper */
|
||||
static inline int mgcp_timeslot_to_endpoint(int multiplex, int timeslot)
|
||||
{
|
||||
if (timeslot == 0) {
|
||||
LOGP(DMGCP, LOGL_ERROR, "Timeslot should not be 0\n");
|
||||
LOGP(DLMGCP, LOGL_ERROR, "Timeslot should not be 0\n");
|
||||
timeslot = 255;
|
||||
}
|
||||
|
||||
@@ -190,5 +287,12 @@ static inline void mgcp_endpoint_to_timeslot(int endpoint, int *multiplex, int *
|
||||
*timeslot = endpoint % 32;
|
||||
}
|
||||
|
||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
|
||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
|
||||
|
||||
|
||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
|
||||
int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp, struct sockaddr_in *addr, char *buf, int rc);
|
||||
int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
|
||||
|
||||
#endif
|
351
include/osmocom/legacy_mgcp/mgcp_internal.h
Normal file
351
include/osmocom/legacy_mgcp/mgcp_internal.h
Normal file
@@ -0,0 +1,351 @@
|
||||
/* MGCP Private Data */
|
||||
|
||||
/*
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <osmocom/core/select.h>
|
||||
#include <osmocom/netif/jibuf.h>
|
||||
|
||||
#define CI_UNUSED 0
|
||||
|
||||
enum mgcp_trunk_type {
|
||||
MGCP_TRUNK_VIRTUAL,
|
||||
MGCP_TRUNK_E1,
|
||||
};
|
||||
|
||||
struct mgcp_rtp_stream_state {
|
||||
uint32_t ssrc;
|
||||
uint16_t last_seq;
|
||||
uint32_t last_timestamp;
|
||||
uint32_t err_ts_counter;
|
||||
int32_t last_tsdelta;
|
||||
uint32_t last_arrival_time;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_state {
|
||||
int initialized;
|
||||
int patch_ssrc;
|
||||
|
||||
uint32_t orig_ssrc;
|
||||
|
||||
int seq_offset;
|
||||
|
||||
int32_t timestamp_offset;
|
||||
uint32_t packet_duration;
|
||||
|
||||
struct mgcp_rtp_stream_state in_stream;
|
||||
struct mgcp_rtp_stream_state out_stream;
|
||||
|
||||
/* jitter and packet loss calculation */
|
||||
int stats_initialized;
|
||||
uint16_t stats_base_seq;
|
||||
uint16_t stats_max_seq;
|
||||
uint32_t stats_ssrc;
|
||||
uint32_t stats_jitter;
|
||||
int32_t stats_transit;
|
||||
int stats_cycles;
|
||||
bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
|
||||
};
|
||||
|
||||
struct mgcp_rtp_codec {
|
||||
uint32_t rate;
|
||||
int channels;
|
||||
uint32_t frame_duration_num;
|
||||
uint32_t frame_duration_den;
|
||||
|
||||
int payload_type;
|
||||
char *audio_name;
|
||||
char *subtype_name;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_end {
|
||||
/* statistics */
|
||||
unsigned int packets;
|
||||
unsigned int octets;
|
||||
unsigned int dropped_packets;
|
||||
struct in_addr addr;
|
||||
|
||||
/* in network byte order */
|
||||
int rtp_port, rtcp_port;
|
||||
|
||||
/* audio codec information */
|
||||
struct mgcp_rtp_codec codec;
|
||||
struct mgcp_rtp_codec alt_codec; /* TODO/XXX: make it generic */
|
||||
|
||||
/* per endpoint data */
|
||||
int frames_per_packet;
|
||||
uint32_t packet_duration_ms;
|
||||
char *fmtp_extra;
|
||||
int output_enabled;
|
||||
int force_output_ptime;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
|
||||
int force_aligned_timing;
|
||||
void *rtp_process_data;
|
||||
|
||||
/*
|
||||
* Each end has a socket...
|
||||
*/
|
||||
struct osmo_fd rtp;
|
||||
struct osmo_fd rtcp;
|
||||
|
||||
int local_port;
|
||||
int local_alloc;
|
||||
};
|
||||
|
||||
enum {
|
||||
MGCP_TAP_BTS_IN,
|
||||
MGCP_TAP_BTS_OUT,
|
||||
MGCP_TAP_NET_IN,
|
||||
MGCP_TAP_NET_OUT,
|
||||
|
||||
/* last element */
|
||||
MGCP_TAP_COUNT
|
||||
};
|
||||
|
||||
struct mgcp_rtp_tap {
|
||||
int enabled;
|
||||
struct sockaddr_in forward;
|
||||
};
|
||||
|
||||
struct mgcp_lco {
|
||||
char *string;
|
||||
char *codec;
|
||||
int pkt_period_min; /* time in ms */
|
||||
int pkt_period_max; /* time in ms */
|
||||
};
|
||||
|
||||
enum mgcp_type {
|
||||
MGCP_RTP_DEFAULT = 0,
|
||||
MGCP_RTP_TRANSCODED,
|
||||
MGCP_OSMUX_BSC,
|
||||
MGCP_OSMUX_BSC_NAT,
|
||||
};
|
||||
|
||||
#include <osmocom/legacy_mgcp/osmux.h>
|
||||
|
||||
struct mgcp_endpoint {
|
||||
int allocated;
|
||||
uint32_t ci;
|
||||
char *callid;
|
||||
struct mgcp_lco local_options;
|
||||
int conn_mode;
|
||||
int orig_mode;
|
||||
|
||||
/* backpointer */
|
||||
struct mgcp_config *cfg;
|
||||
struct mgcp_trunk_config *tcfg;
|
||||
|
||||
/* port status for bts/net */
|
||||
struct mgcp_rtp_end bts_end;
|
||||
struct mgcp_rtp_end net_end;
|
||||
|
||||
/*
|
||||
* For transcoding we will send from the local_port
|
||||
* of trans_bts and it will arrive at trans_net from
|
||||
* where we will forward it to the network.
|
||||
*/
|
||||
struct mgcp_rtp_end trans_bts;
|
||||
struct mgcp_rtp_end trans_net;
|
||||
enum mgcp_type type;
|
||||
|
||||
/* sequence bits */
|
||||
struct mgcp_rtp_state net_state;
|
||||
struct mgcp_rtp_state bts_state;
|
||||
|
||||
/* fields for re-transmission */
|
||||
char *last_trans;
|
||||
char *last_response;
|
||||
|
||||
/* tap for the endpoint */
|
||||
struct mgcp_rtp_tap taps[MGCP_TAP_COUNT];
|
||||
|
||||
struct {
|
||||
/* Osmux state: disabled, activating, active */
|
||||
enum osmux_state state;
|
||||
/* Allocated Osmux circuit ID for this endpoint */
|
||||
int allocated_cid;
|
||||
/* Used Osmux circuit ID for this endpoint */
|
||||
uint8_t cid;
|
||||
/* handle to batch messages */
|
||||
struct osmux_in_handle *in;
|
||||
/* handle to unbatch messages */
|
||||
struct osmux_out_handle out;
|
||||
/* statistics */
|
||||
struct {
|
||||
uint32_t chunks;
|
||||
uint32_t octets;
|
||||
} stats;
|
||||
} osmux;
|
||||
|
||||
/* Jitter buffer */
|
||||
struct osmo_jibuf* bts_jb;
|
||||
/* Use a jitterbuffer on the bts-side receiver */
|
||||
bool bts_use_jibuf;
|
||||
/* Minimum and maximum buffer size for the jitter buffer, in ms */
|
||||
uint32_t bts_jitter_delay_min;
|
||||
uint32_t bts_jitter_delay_max;
|
||||
};
|
||||
|
||||
#define for_each_line(line, save) \
|
||||
for (line = strline_r(NULL, &save); line;\
|
||||
line = strline_r(NULL, &save))
|
||||
|
||||
static inline char *strline_r(char *str, char **saveptr)
|
||||
{
|
||||
char *result;
|
||||
|
||||
if (str)
|
||||
*saveptr = str;
|
||||
|
||||
result = *saveptr;
|
||||
|
||||
if (*saveptr != NULL) {
|
||||
*saveptr = strpbrk(*saveptr, "\r\n");
|
||||
|
||||
if (*saveptr != NULL) {
|
||||
char *eos = *saveptr;
|
||||
|
||||
if ((*saveptr)[0] == '\r' && (*saveptr)[1] == '\n')
|
||||
(*saveptr)++;
|
||||
(*saveptr)++;
|
||||
if ((*saveptr)[0] == '\0')
|
||||
*saveptr = NULL;
|
||||
|
||||
*eos = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
|
||||
|
||||
/**
|
||||
* Internal structure while parsing a request
|
||||
*/
|
||||
struct mgcp_parse_data {
|
||||
struct mgcp_config *cfg;
|
||||
struct mgcp_endpoint *endp;
|
||||
char *trans;
|
||||
char *save;
|
||||
int found;
|
||||
};
|
||||
|
||||
int mgcp_send_dummy(struct mgcp_endpoint *endp);
|
||||
int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
|
||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
|
||||
int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
|
||||
int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
|
||||
int mgcp_free_rtp_port(struct mgcp_rtp_end *end);
|
||||
|
||||
/* For transcoding we need to manage an in and an output that are connected */
|
||||
static inline int endp_back_channel(int endpoint)
|
||||
{
|
||||
return endpoint + 60;
|
||||
}
|
||||
|
||||
struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
|
||||
struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
|
||||
|
||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
|
||||
void mgcp_state_calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
|
||||
uint32_t *expected, int *loss);
|
||||
uint32_t mgcp_state_calc_jitter(struct mgcp_rtp_state *);
|
||||
|
||||
/* payload processing default functions */
|
||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
|
||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
struct mgcp_rtp_end *src_end);
|
||||
|
||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
|
||||
int *payload_type,
|
||||
const char**subtype_name,
|
||||
const char**fmtp_extra);
|
||||
|
||||
/* internal RTP Annex A counting */
|
||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
|
||||
const uint16_t seq, const int32_t transit,
|
||||
const uint32_t ssrc);
|
||||
|
||||
int mgcp_set_ip_tos(int fd, int tos);
|
||||
|
||||
enum {
|
||||
MGCP_DEST_NET = 0,
|
||||
MGCP_DEST_BTS,
|
||||
};
|
||||
|
||||
|
||||
#define MGCP_DUMMY_LOAD 0x23
|
||||
|
||||
|
||||
/**
|
||||
* SDP related information
|
||||
*/
|
||||
/* Assume audio frame length of 20ms */
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
|
||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE 8000
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
|
||||
|
||||
#define PTYPE_UNDEFINED (-1)
|
||||
int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p);
|
||||
int mgcp_set_audio_info(void *ctx, struct mgcp_rtp_codec *codec,
|
||||
int payload_type, const char *audio_name);
|
||||
|
||||
|
||||
/**
|
||||
* Internal network related
|
||||
*/
|
||||
static inline const char *mgcp_net_src_addr(struct mgcp_endpoint *endp)
|
||||
{
|
||||
if (endp->cfg->net_ports.bind_addr)
|
||||
return endp->cfg->net_ports.bind_addr;
|
||||
return endp->cfg->source_addr;
|
||||
}
|
||||
|
||||
static inline const char *mgcp_bts_src_addr(struct mgcp_endpoint *endp)
|
||||
{
|
||||
if (endp->cfg->bts_ports.bind_addr)
|
||||
return endp->cfg->bts_ports.bind_addr;
|
||||
return endp->cfg->source_addr;
|
||||
}
|
||||
|
||||
int mgcp_msg_terminate_nul(struct msgb *msg);
|
||||
|
||||
/**
|
||||
* Internal jitter buffer related
|
||||
*/
|
||||
void mgcp_dejitter_udp_send(struct msgb *msg, void *data);
|
90
include/osmocom/legacy_mgcp/mgcp_transcode.h
Normal file
90
include/osmocom/legacy_mgcp/mgcp_transcode.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* (C) 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/>.
|
||||
*
|
||||
*/
|
||||
#ifndef OPENBSC_MGCP_TRANSCODE_H
|
||||
#define OPENBSC_MGCP_TRANSCODE_H
|
||||
|
||||
#include "bscconfig.h"
|
||||
|
||||
#include <gsm.h>
|
||||
#ifdef HAVE_BCG729
|
||||
#include <bcg729/decoder.h>
|
||||
#include <bcg729/encoder.h>
|
||||
#endif
|
||||
|
||||
enum audio_format {
|
||||
AF_INVALID,
|
||||
AF_S16,
|
||||
AF_L16,
|
||||
AF_GSM,
|
||||
AF_G729,
|
||||
AF_PCMA,
|
||||
AF_PCMU
|
||||
};
|
||||
|
||||
|
||||
struct mgcp_process_rtp_state {
|
||||
/* decoding */
|
||||
enum audio_format src_fmt;
|
||||
union {
|
||||
gsm gsm_handle;
|
||||
#ifdef HAVE_BCG729
|
||||
bcg729DecoderChannelContextStruct *g729_dec;
|
||||
#endif
|
||||
} src;
|
||||
size_t src_frame_size;
|
||||
size_t src_samples_per_frame;
|
||||
|
||||
/* processing */
|
||||
|
||||
/* encoding */
|
||||
enum audio_format dst_fmt;
|
||||
union {
|
||||
gsm gsm_handle;
|
||||
#ifdef HAVE_BCG729
|
||||
bcg729EncoderChannelContextStruct *g729_enc;
|
||||
#endif
|
||||
} dst;
|
||||
size_t dst_frame_size;
|
||||
size_t dst_samples_per_frame;
|
||||
int dst_packet_duration;
|
||||
|
||||
int is_running;
|
||||
uint16_t next_seq;
|
||||
uint32_t next_time;
|
||||
int16_t samples[10*160];
|
||||
size_t sample_cnt;
|
||||
size_t sample_offs;
|
||||
};
|
||||
|
||||
|
||||
int mgcp_transcoding_setup(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
struct mgcp_rtp_end *src_end);
|
||||
|
||||
void mgcp_transcoding_net_downlink_format(struct mgcp_endpoint *endp,
|
||||
int *payload_type,
|
||||
const char**audio_name,
|
||||
const char**fmtp_extra);
|
||||
|
||||
int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
|
||||
int mgcp_transcoding_get_frame_size(void *state_, int nsamples, int dst);
|
||||
#endif /* OPENBSC_MGCP_TRANSCODE_H */
|
41
include/osmocom/legacy_mgcp/osmux.h
Normal file
41
include/osmocom/legacy_mgcp/osmux.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef _OPENBSC_OSMUX_H_
|
||||
#define _OPENBSC_OSMUX_H_
|
||||
|
||||
#include <osmocom/netif/osmux.h>
|
||||
|
||||
#define OSMUX_PORT 1984
|
||||
|
||||
enum {
|
||||
OSMUX_ROLE_BSC = 0,
|
||||
OSMUX_ROLE_BSC_NAT,
|
||||
};
|
||||
|
||||
int osmux_init(int role, struct mgcp_config *cfg);
|
||||
int osmux_enable_endpoint(struct mgcp_endpoint *endp, struct in_addr *addr, uint16_t port);
|
||||
void osmux_disable_endpoint(struct mgcp_endpoint *endp);
|
||||
void osmux_allocate_cid(struct mgcp_endpoint *endp);
|
||||
void osmux_release_cid(struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_xfrm_to_rtp(struct mgcp_endpoint *endp, int type, char *buf, int rc);
|
||||
int osmux_xfrm_to_osmux(int type, char *buf, int rc, struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_send_dummy(struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_get_cid(void);
|
||||
void osmux_put_cid(uint8_t osmux_cid);
|
||||
int osmux_used_cid(void);
|
||||
|
||||
enum osmux_state {
|
||||
OSMUX_STATE_DISABLED = 0,
|
||||
OSMUX_STATE_NEGOTIATING,
|
||||
OSMUX_STATE_ACTIVATING,
|
||||
OSMUX_STATE_ENABLED,
|
||||
};
|
||||
|
||||
enum osmux_usage {
|
||||
OSMUX_USAGE_OFF = 0,
|
||||
OSMUX_USAGE_ON = 1,
|
||||
OSMUX_USAGE_ONLY = 2,
|
||||
};
|
||||
|
||||
#endif
|
8
include/osmocom/legacy_mgcp/vty.h
Normal file
8
include/osmocom/legacy_mgcp/vty.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/vty/command.h>
|
||||
|
||||
enum mgcp_vty_node {
|
||||
MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
|
||||
TRUNK_NODE,
|
||||
};
|
10
include/osmocom/mgcp/Makefile.am
Normal file
10
include/osmocom/mgcp/Makefile.am
Normal file
@@ -0,0 +1,10 @@
|
||||
noinst_HEADERS = \
|
||||
vty.h \
|
||||
mgcp_msg.h \
|
||||
mgcp_conn.h \
|
||||
mgcp_stat.h \
|
||||
mgcp_endp.h \
|
||||
mgcp_sdp.h \
|
||||
mgcp_codec.h \
|
||||
debug.h \
|
||||
$(NULL)
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2010 by On-Waves
|
||||
/* (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
|
||||
@@ -18,11 +18,18 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef OSMO_BSC_GRACE_H
|
||||
#define OSMO_BSC_GRACE_H
|
||||
#pragma once
|
||||
|
||||
#include "gsm_data.h"
|
||||
#include <stdio.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
|
||||
int bsc_grace_allow_new_connection(struct gsm_network *network);
|
||||
#define DEBUG
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#endif
|
||||
/* Debug Areas of the code */
|
||||
enum {
|
||||
DRTP,
|
||||
Debug_LastEntry,
|
||||
};
|
||||
|
||||
extern const struct log_info log_info;
|
238
include/osmocom/mgcp/mgcp.h
Normal file
238
include/osmocom/mgcp/mgcp.h
Normal file
@@ -0,0 +1,238 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
|
||||
/*
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/write_queue.h>
|
||||
#include <osmocom/core/timer.h>
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#include <osmocom/mgcp/mgcp_common.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define RTP_PORT_DEFAULT_RANGE_START 16002
|
||||
#define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64
|
||||
|
||||
/*
|
||||
* Handling of MGCP Endpoints and the MGCP Config
|
||||
*/
|
||||
struct mgcp_endpoint;
|
||||
struct mgcp_config;
|
||||
struct mgcp_trunk_config;
|
||||
struct mgcp_rtp_end;
|
||||
|
||||
#define MGCP_ENDP_CRCX 1
|
||||
#define MGCP_ENDP_DLCX 2
|
||||
#define MGCP_ENDP_MDCX 3
|
||||
|
||||
/*
|
||||
* what to do with the msg?
|
||||
* - continue as usual?
|
||||
* - reject and send a failure code?
|
||||
* - defer? do not send anything
|
||||
*/
|
||||
#define MGCP_POLICY_CONT 4
|
||||
#define MGCP_POLICY_REJECT 5
|
||||
#define MGCP_POLICY_DEFER 6
|
||||
|
||||
typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
|
||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
|
||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
|
||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
|
||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
|
||||
|
||||
/**
|
||||
* Return:
|
||||
* < 0 in case no audio was processed
|
||||
* >= 0 in case audio was processed. The remaining payload
|
||||
* length will be returned.
|
||||
*/
|
||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
struct mgcp_rtp_end *src_end);
|
||||
|
||||
struct mgcp_conn_rtp;
|
||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
|
||||
int *payload_type,
|
||||
const char**subtype_name,
|
||||
const char**fmtp_extra,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
|
||||
/**
|
||||
* This holds information on how to allocate ports
|
||||
*/
|
||||
struct mgcp_port_range {
|
||||
/* addr or NULL to fall-back to default */
|
||||
char *bind_addr;
|
||||
|
||||
/* dynamically allocated */
|
||||
int range_start;
|
||||
int range_end;
|
||||
int last_port;
|
||||
|
||||
/* set to true to enable automatic probing
|
||||
* of the local bind IP-Address, bind_addr
|
||||
* (or its fall back) is used when automatic
|
||||
* probing fails */
|
||||
bool bind_addr_probe;
|
||||
};
|
||||
|
||||
/* There are up to three modes in which the keep-alive dummy packet can be
|
||||
* sent. The behaviour is controlled via the keepalive_interval member of the
|
||||
* trunk config. If that member is set to 0 (MGCP_KEEPALIVE_NEVER) no dummy-
|
||||
* packet is sent at all and the timer that sends regular dummy packets
|
||||
* is no longer scheduled. If the keepalive_interval is set to -1, only
|
||||
* one dummy packet is sent when an CRCX or an MDCX is performed. No timer
|
||||
* is scheduled. For all vales greater 0, the timer is scheduled and the
|
||||
* value is used as interval. See also mgcp_keepalive_timer_cb(),
|
||||
* handle_modify_con(), and handle_create_con() */
|
||||
#define MGCP_KEEPALIVE_ONCE (-1)
|
||||
#define MGCP_KEEPALIVE_NEVER 0
|
||||
|
||||
struct mgcp_trunk_config {
|
||||
struct llist_head entry;
|
||||
|
||||
struct mgcp_config *cfg;
|
||||
|
||||
int trunk_nr;
|
||||
int trunk_type;
|
||||
|
||||
char *audio_fmtp_extra;
|
||||
char *audio_name;
|
||||
int audio_payload;
|
||||
int audio_send_ptime;
|
||||
int audio_send_name;
|
||||
int audio_loop;
|
||||
|
||||
int no_audio_transcoding;
|
||||
|
||||
int omit_rtcp;
|
||||
int keepalive_interval;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* 0: don't, 1: once */
|
||||
int force_aligned_timing;
|
||||
|
||||
/* spec handling */
|
||||
int force_realloc;
|
||||
|
||||
/* timer */
|
||||
struct osmo_timer_list keepalive_timer;
|
||||
|
||||
/* When set, incoming RTP packets are not filtered
|
||||
* when ports and ip-address do not match (debug) */
|
||||
int rtp_accept_all;
|
||||
|
||||
unsigned int number_endpoints;
|
||||
int vty_number_endpoints;
|
||||
struct mgcp_endpoint *endpoints;
|
||||
};
|
||||
|
||||
enum mgcp_role {
|
||||
MGCP_BSC = 0,
|
||||
MGCP_BSC_NAT,
|
||||
};
|
||||
|
||||
struct mgcp_config {
|
||||
int source_port;
|
||||
char *local_ip;
|
||||
char *source_addr;
|
||||
char *call_agent_addr;
|
||||
|
||||
/* RTP processing */
|
||||
mgcp_processing rtp_processing_cb;
|
||||
mgcp_processing_setup setup_rtp_processing_cb;
|
||||
|
||||
mgcp_get_format get_net_downlink_format_cb;
|
||||
|
||||
struct osmo_wqueue gw_fd;
|
||||
|
||||
struct mgcp_port_range net_ports;
|
||||
int endp_dscp;
|
||||
|
||||
int force_ptime;
|
||||
|
||||
mgcp_change change_cb;
|
||||
mgcp_policy policy_cb;
|
||||
mgcp_reset reset_cb;
|
||||
mgcp_realloc realloc_cb;
|
||||
mgcp_rqnt rqnt_cb;
|
||||
void *data;
|
||||
|
||||
uint32_t last_call_id;
|
||||
|
||||
/* trunk handling */
|
||||
struct mgcp_trunk_config trunk;
|
||||
struct llist_head trunks;
|
||||
|
||||
enum mgcp_role role;
|
||||
|
||||
/* osmux translator: 0 means disabled, 1 means enabled */
|
||||
int osmux;
|
||||
/* addr to bind the server to */
|
||||
char *osmux_addr;
|
||||
/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
|
||||
* the osmux socket is already initialized.
|
||||
*/
|
||||
int osmux_init;
|
||||
/* osmux batch factor: from 1 to 4 maximum */
|
||||
int osmux_batch;
|
||||
/* osmux batch size (in bytes) */
|
||||
int osmux_batch_size;
|
||||
/* osmux port */
|
||||
uint16_t osmux_port;
|
||||
/* Pad circuit with dummy messages until we see the first voice
|
||||
* message.
|
||||
*/
|
||||
uint16_t osmux_dummy;
|
||||
/* domain name of the media gateway */
|
||||
char domain[255+1];
|
||||
};
|
||||
|
||||
/* config management */
|
||||
struct mgcp_config *mgcp_config_alloc(void);
|
||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
|
||||
enum mgcp_role role);
|
||||
int mgcp_vty_init(void);
|
||||
int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
|
||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
|
||||
|
||||
/*
|
||||
* format helper functions
|
||||
*/
|
||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
|
||||
|
||||
|
||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
|
||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
|
||||
|
||||
|
||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
|
||||
int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
|
6
include/osmocom/mgcp/mgcp_codec.h
Normal file
6
include/osmocom/mgcp/mgcp_codec.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
void mgcp_codec_summary(struct mgcp_conn_rtp *conn);
|
||||
void mgcp_codec_reset_all(struct mgcp_conn_rtp *conn);
|
||||
int mgcp_codec_add(struct mgcp_conn_rtp *conn, int payload_type, const char *audio_name);
|
||||
int mgcp_codec_decide(struct mgcp_conn_rtp *conn);
|
89
include/osmocom/mgcp/mgcp_common.h
Normal file
89
include/osmocom/mgcp/mgcp_common.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/* 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,
|
||||
};
|
||||
|
||||
/* Ensure that the msg->l2h is NUL terminated. */
|
||||
static inline int mgcp_msg_terminate_nul(struct msgb *msg)
|
||||
{
|
||||
unsigned char *tail = msg->l2h + msgb_l2len(msg); /* char after l2 data */
|
||||
if (tail[-1] == '\0')
|
||||
/* nothing to do */;
|
||||
else if (msgb_tailroom(msg) > 0)
|
||||
tail[0] = '\0';
|
||||
else if (tail[-1] == '\r' || tail[-1] == '\n')
|
||||
tail[-1] = '\0';
|
||||
else {
|
||||
LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: "
|
||||
"Length: %d, Buffer size: %d\n",
|
||||
msgb_l2len(msg), msg->data_len);
|
||||
return -ENOTSUP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Maximum length of the comment field */
|
||||
#define MGCP_COMMENT_MAXLEN 256
|
||||
|
||||
/* String length of Connection Identifiers
|
||||
* (see also RFC3435 2.1.3.2 Names of Connections) */
|
||||
#define MGCP_CONN_ID_LENGTH 32+1
|
||||
|
||||
/* String length of Endpoint Identifiers.
|
||||
/ (see also RFC3435 section 3.2.1.3) */
|
||||
#define MGCP_ENDPOINT_MAXLEN (255*2+1+1)
|
||||
|
||||
/* A prefix to denote the virtual trunk (RTP on both ends) */
|
||||
#define MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK "rtpbridge/"
|
||||
|
||||
/* Maximal number of payload types / codecs that can be negotiated via SDP at
|
||||
* at once. */
|
||||
#define MGCP_MAX_CODECS 10
|
||||
|
||||
#endif
|
39
include/osmocom/mgcp/mgcp_conn.h
Normal file
39
include/osmocom/mgcp/mgcp_conn.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/* Message connection list handling */
|
||||
|
||||
/*
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/mgcp/mgcp_internal.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
|
||||
enum mgcp_conn_type type, char *name);
|
||||
struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, const char *id);
|
||||
struct mgcp_conn_rtp *mgcp_conn_get_rtp(struct mgcp_endpoint *endp,
|
||||
const char *id);
|
||||
void mgcp_conn_free(struct mgcp_endpoint *endp, const char *id);
|
||||
void mgcp_conn_free_oldest(struct mgcp_endpoint *endp);
|
||||
void mgcp_conn_free_all(struct mgcp_endpoint *endp);
|
||||
char *mgcp_conn_dump(struct mgcp_conn *conn);
|
||||
struct mgcp_conn *mgcp_find_dst_conn(struct mgcp_conn *conn);
|
99
include/osmocom/mgcp/mgcp_endp.h
Normal file
99
include/osmocom/mgcp/mgcp_endp.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/* Endpoint types */
|
||||
|
||||
/*
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
struct sockaddr_in;
|
||||
struct mgcp_conn;
|
||||
struct mgcp_endpoint;
|
||||
|
||||
/* Callback type for RTP dispatcher functions
|
||||
(e.g mgcp_dispatch_rtp_bridge_cb, see below) */
|
||||
typedef int (*mgcp_dispatch_rtp_cb) (int proto, struct sockaddr_in *addr,
|
||||
char *buf, unsigned int buf_size,
|
||||
struct mgcp_conn *conn);
|
||||
|
||||
/* Callback type for endpoint specific cleanup actions. This function
|
||||
* is automatically executed when a connection is freed (see mgcp_conn_free()
|
||||
* in mgcp_conn.c). Depending on the type of the endpoint there may be endpoint
|
||||
* specific things to take care of once a connection has been removed. */
|
||||
typedef void (*mgcp_cleanup_cp) (struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn *conn);
|
||||
|
||||
/*! MGCP endpoint properties */
|
||||
struct mgcp_endpoint_type {
|
||||
/*!< maximum number of connections */
|
||||
int max_conns;
|
||||
|
||||
/*!< callback that defines how to dispatch incoming RTP data */
|
||||
mgcp_dispatch_rtp_cb dispatch_rtp_cb;
|
||||
|
||||
/*!< callback that implements endpoint specific cleanup actions */
|
||||
mgcp_cleanup_cp cleanup_cb;
|
||||
};
|
||||
|
||||
/*! MGCP endpoint typeset */
|
||||
struct mgcp_endpoint_typeset {
|
||||
struct mgcp_endpoint_type rtp;
|
||||
};
|
||||
|
||||
/*! static MGCP endpoint typeset (pre-initalized, read-only) */
|
||||
extern const struct mgcp_endpoint_typeset ep_typeset;
|
||||
|
||||
/*! MGCP endpoint model */
|
||||
struct mgcp_endpoint {
|
||||
|
||||
/*!< Call identifier string (as supplied by the call agant) */
|
||||
char *callid;
|
||||
|
||||
/*!< Local connection options (see mgcp_internal.h) */
|
||||
struct mgcp_lco local_options;
|
||||
|
||||
/*!< List with connections active on this endpoint */
|
||||
struct llist_head conns;
|
||||
|
||||
/*!< Backpointer to the MGW configuration */
|
||||
struct mgcp_config *cfg;
|
||||
|
||||
/*!< Backpointer to the Trunk specific configuration */
|
||||
struct mgcp_trunk_config *tcfg;
|
||||
|
||||
/*!< Endpoint properties (see above) */
|
||||
const struct mgcp_endpoint_type *type;
|
||||
|
||||
/*!< Last MGCP transmission (in case re-transmission is required) */
|
||||
char *last_trans;
|
||||
|
||||
/*!< Last MGCP response (in case re-transmission is required) */
|
||||
char *last_response;
|
||||
|
||||
/*!< Memorize if this endpoint was choosen by the MGW (wildcarded, true)
|
||||
* or if the user has choosen the particular endpoint explicitly. */
|
||||
bool wildcarded_req;
|
||||
};
|
||||
|
||||
/*! Extract endpoint number for a given endpoint */
|
||||
#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
|
||||
|
||||
void mgcp_endp_release(struct mgcp_endpoint *endp);
|
||||
|
341
include/osmocom/mgcp/mgcp_internal.h
Normal file
341
include/osmocom/mgcp/mgcp_internal.h
Normal file
@@ -0,0 +1,341 @@
|
||||
/* MGCP Private Data */
|
||||
|
||||
/*
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <osmocom/core/select.h>
|
||||
#include <osmocom/mgcp/mgcp.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/counter.h>
|
||||
#include <osmocom/core/rate_ctr.h>
|
||||
|
||||
#define CI_UNUSED 0
|
||||
|
||||
/* FIXME: This this is only needed to compile the currently
|
||||
* broken OSMUX support. Remove when fixed */
|
||||
#define CONN_ID_BTS "0"
|
||||
#define CONN_ID_NET "1"
|
||||
|
||||
enum mgcp_trunk_type {
|
||||
MGCP_TRUNK_VIRTUAL,
|
||||
MGCP_TRUNK_E1,
|
||||
};
|
||||
|
||||
struct mgcp_rtp_stream_state {
|
||||
uint32_t ssrc;
|
||||
uint16_t last_seq;
|
||||
uint32_t last_timestamp;
|
||||
struct rate_ctr *err_ts_ctr;
|
||||
int32_t last_tsdelta;
|
||||
uint32_t last_arrival_time;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_state {
|
||||
/* has this state structure been initialized? */
|
||||
int initialized;
|
||||
|
||||
struct {
|
||||
/* are we patching the SSRC value? */
|
||||
int patch_ssrc;
|
||||
/* original SSRC (to which we shall patch any different SSRC) */
|
||||
uint32_t orig_ssrc;
|
||||
/* offset to apply on the sequence number */
|
||||
int seq_offset;
|
||||
/* offset to apply on the timestamp number */
|
||||
int32_t timestamp_offset;
|
||||
} patch;
|
||||
|
||||
/* duration of a packet (FIXME: in which unit?) */
|
||||
uint32_t packet_duration;
|
||||
|
||||
struct mgcp_rtp_stream_state in_stream;
|
||||
struct mgcp_rtp_stream_state out_stream;
|
||||
|
||||
/* jitter and packet loss calculation */
|
||||
struct {
|
||||
int initialized;
|
||||
uint16_t base_seq;
|
||||
uint16_t max_seq;
|
||||
uint32_t ssrc;
|
||||
uint32_t jitter;
|
||||
int32_t transit;
|
||||
int cycles;
|
||||
} stats;
|
||||
|
||||
bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
|
||||
};
|
||||
|
||||
struct mgcp_rtp_codec {
|
||||
uint32_t rate;
|
||||
int channels;
|
||||
uint32_t frame_duration_num;
|
||||
uint32_t frame_duration_den;
|
||||
|
||||
int payload_type;
|
||||
char *audio_name;
|
||||
char *subtype_name;
|
||||
};
|
||||
|
||||
/* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */
|
||||
struct mgcp_rtp_end {
|
||||
/* statistics */
|
||||
struct {
|
||||
unsigned int packets_rx;
|
||||
unsigned int octets_rx;
|
||||
unsigned int packets_tx;
|
||||
unsigned int octets_tx;
|
||||
unsigned int dropped_packets;
|
||||
} stats;
|
||||
|
||||
/* local IP address of the RTP socket */
|
||||
struct in_addr addr;
|
||||
|
||||
/* in network byte order */
|
||||
int rtp_port, rtcp_port;
|
||||
|
||||
/* currently selected audio codec */
|
||||
struct mgcp_rtp_codec *codec;
|
||||
|
||||
/* array with assigned audio codecs to choose from (SDP) */
|
||||
struct mgcp_rtp_codec codecs[MGCP_MAX_CODECS];
|
||||
|
||||
/* number of assigned audio codecs (SDP) */
|
||||
unsigned int codecs_assigned;
|
||||
|
||||
/* per endpoint data */
|
||||
int frames_per_packet;
|
||||
uint32_t packet_duration_ms;
|
||||
int maximum_packet_time; /* -1: not set */
|
||||
char *fmtp_extra;
|
||||
/* are we transmitting packets (1) or dropping (0) outbound packets */
|
||||
int output_enabled;
|
||||
/* FIXME: This parameter can be set + printed, but is nowhere used! */
|
||||
int force_output_ptime;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
|
||||
/* should we perform align_rtp_timestamp_offset() (1) or not (0) */
|
||||
int force_aligned_timing;
|
||||
/* FIXME: not used anymore, used to be [external] transcoding related */
|
||||
void *rtp_process_data;
|
||||
|
||||
/* Each end has a separate socket for RTP and RTCP */
|
||||
struct osmo_fd rtp;
|
||||
struct osmo_fd rtcp;
|
||||
|
||||
/* local UDP port number of the RTP socket; RTCP is +1 */
|
||||
int local_port;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_tap {
|
||||
/* is this tap active (1) or not (0) */
|
||||
int enabled;
|
||||
/* IP/port to which we're forwarding the tapped data */
|
||||
struct sockaddr_in forward;
|
||||
};
|
||||
|
||||
struct mgcp_lco {
|
||||
char *string;
|
||||
char *codec;
|
||||
int pkt_period_min; /* time in ms */
|
||||
int pkt_period_max; /* time in ms */
|
||||
};
|
||||
|
||||
/* Specific rtp connection type (see struct mgcp_conn_rtp) */
|
||||
enum mgcp_conn_rtp_type {
|
||||
MGCP_RTP_DEFAULT = 0,
|
||||
MGCP_OSMUX_BSC,
|
||||
MGCP_OSMUX_BSC_NAT,
|
||||
};
|
||||
|
||||
#include <osmocom/mgcp/osmux.h>
|
||||
struct mgcp_conn;
|
||||
|
||||
/* MGCP connection (RTP) */
|
||||
struct mgcp_conn_rtp {
|
||||
|
||||
/* Backpointer to conn struct */
|
||||
struct mgcp_conn *conn;
|
||||
|
||||
/* Specific connection type */
|
||||
enum mgcp_conn_rtp_type type;
|
||||
|
||||
/* Port status */
|
||||
struct mgcp_rtp_end end;
|
||||
|
||||
/* Sequence bits */
|
||||
struct mgcp_rtp_state state;
|
||||
|
||||
/* taps for the rtp connection; one per direction */
|
||||
struct mgcp_rtp_tap tap_in;
|
||||
struct mgcp_rtp_tap tap_out;
|
||||
|
||||
/* Osmux states (optional) */
|
||||
struct {
|
||||
/* Osmux state: disabled, activating, active */
|
||||
enum osmux_state state;
|
||||
/* Allocated Osmux circuit ID for this endpoint */
|
||||
int allocated_cid;
|
||||
/* Used Osmux circuit ID for this endpoint */
|
||||
uint8_t cid;
|
||||
/* handle to batch messages */
|
||||
struct osmux_in_handle *in;
|
||||
/* handle to unbatch messages */
|
||||
struct osmux_out_handle out;
|
||||
/* statistics */
|
||||
struct {
|
||||
uint32_t chunks;
|
||||
uint32_t octets;
|
||||
} stats;
|
||||
} osmux;
|
||||
|
||||
struct rate_ctr_group *rate_ctr_group;
|
||||
};
|
||||
|
||||
/*! Connection type, specifies which member of the union "u" in mgcp_conn
|
||||
* contains a useful connection description (currently only RTP) */
|
||||
enum mgcp_conn_type {
|
||||
MGCP_CONN_TYPE_RTP,
|
||||
};
|
||||
|
||||
/*! MGCP connection (untyped) */
|
||||
struct mgcp_conn {
|
||||
/*!< list head */
|
||||
struct llist_head entry;
|
||||
|
||||
/*!< Backpointer to the endpoint where the conn belongs to */
|
||||
struct mgcp_endpoint *endp;
|
||||
|
||||
/*!< type of the connection (union) */
|
||||
enum mgcp_conn_type type;
|
||||
|
||||
/*!< mode of the connection */
|
||||
enum mgcp_connection_mode mode;
|
||||
|
||||
/*!< copy of the mode to restore the original setting (VTY) */
|
||||
enum mgcp_connection_mode mode_orig;
|
||||
|
||||
/*!< connection id to identify the connection */
|
||||
char id[MGCP_CONN_ID_LENGTH];
|
||||
|
||||
/*!< human readable name (vty, logging) */
|
||||
char name[256];
|
||||
|
||||
/*!< union with connection description */
|
||||
union {
|
||||
struct mgcp_conn_rtp rtp;
|
||||
} u;
|
||||
|
||||
/*!< pointer to optional private data */
|
||||
void *priv;
|
||||
};
|
||||
|
||||
#include <osmocom/mgcp/mgcp_conn.h>
|
||||
|
||||
struct mgcp_endpoint_type;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Internal structure while parsing a request
|
||||
*/
|
||||
struct mgcp_parse_data {
|
||||
struct mgcp_config *cfg;
|
||||
struct mgcp_endpoint *endp;
|
||||
char *trans;
|
||||
char *save;
|
||||
};
|
||||
|
||||
int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct sockaddr_in *addr,
|
||||
char *buf, int rc, struct mgcp_conn_rtp *conn_src,
|
||||
struct mgcp_conn_rtp *conn_dst);
|
||||
int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
|
||||
int mgcp_dispatch_rtp_bridge_cb(int proto, struct sockaddr_in *addr, char *buf,
|
||||
unsigned int buf_size, struct mgcp_conn *conn);
|
||||
void mgcp_cleanup_rtp_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
|
||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
void mgcp_free_rtp_port(struct mgcp_rtp_end *end);
|
||||
|
||||
/* For transcoding we need to manage an in and an output that are connected */
|
||||
static inline int endp_back_channel(int endpoint)
|
||||
{
|
||||
return endpoint + 60;
|
||||
}
|
||||
|
||||
struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
|
||||
struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
|
||||
|
||||
char *get_lco_identifier(const char *options);
|
||||
int check_local_cx_options(void *ctx, const char *options);
|
||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
|
||||
/* payload processing default functions */
|
||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
|
||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
struct mgcp_rtp_end *src_end);
|
||||
|
||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
|
||||
int *payload_type,
|
||||
const char**audio_name,
|
||||
const char**fmtp_extra,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
|
||||
/* internal RTP Annex A counting */
|
||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
|
||||
const uint16_t seq, const int32_t transit,
|
||||
const uint32_t ssrc);
|
||||
|
||||
int mgcp_set_ip_tos(int fd, int tos);
|
||||
|
||||
enum {
|
||||
MGCP_DEST_NET = 0,
|
||||
MGCP_DEST_BTS,
|
||||
};
|
||||
|
||||
|
||||
#define MGCP_DUMMY_LOAD 0x23
|
||||
|
||||
|
||||
/**
|
||||
* SDP related information
|
||||
*/
|
||||
/* Assume audio frame length of 20ms */
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
|
||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE 8000
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
|
||||
|
||||
#define PTYPE_UNDEFINED (-1)
|
||||
|
||||
void mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn);
|
56
include/osmocom/mgcp/mgcp_msg.h
Normal file
56
include/osmocom/mgcp/mgcp_msg.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
/* Message parser/generator utilities */
|
||||
|
||||
/*
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct mgcp_conn;
|
||||
struct mgcp_parse_data;
|
||||
struct mgcp_endpoint;
|
||||
|
||||
void mgcp_disp_msg(unsigned char *message, unsigned int len, char *preamble);
|
||||
|
||||
int mgcp_parse_conn_mode(const char *msg, struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn *conn);
|
||||
|
||||
int mgcp_parse_header(struct mgcp_parse_data *pdata, char *data);
|
||||
|
||||
int mgcp_parse_osmux_cid(const char *line);
|
||||
|
||||
int mgcp_check_param(const struct mgcp_endpoint *endp, const char *line);
|
||||
|
||||
int mgcp_verify_call_id(struct mgcp_endpoint *endp, const char *callid);
|
||||
|
||||
int mgcp_verify_ci(struct mgcp_endpoint *endp, const char *conn_id);
|
||||
|
||||
char *mgcp_strline(char *str, char **saveptr);
|
||||
|
||||
#define for_each_line(line, save)\
|
||||
for (line = mgcp_strline(NULL, &save); line;\
|
||||
line = mgcp_strline(NULL, &save))
|
||||
|
||||
#define for_each_non_empty_line(line, save)\
|
||||
for (line = strtok_r(NULL, "\r\n", &save); line;\
|
||||
line = strtok_r(NULL, "\r\n", &save))
|
@@ -1,6 +1,8 @@
|
||||
/*
|
||||
* (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
/*
|
||||
* 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
|
||||
@@ -18,17 +20,12 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef OPENBSCDEFINES_H
|
||||
#define OPENBSCDEFINES_H
|
||||
#pragma once
|
||||
|
||||
#ifdef BUILDING_ON_WINDOWS
|
||||
#ifdef BUILDING_OPENBSC
|
||||
#define BSC_API __declspec(dllexport)
|
||||
#else
|
||||
#define BSC_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define BSC_API __attribute__((visibility("default")))
|
||||
#endif
|
||||
int mgcp_parse_sdp_data(const struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn_rtp *conn,
|
||||
struct mgcp_parse_data *p);
|
||||
|
||||
#endif
|
||||
int mgcp_write_response_sdp(const struct mgcp_endpoint *endp,
|
||||
const struct mgcp_conn_rtp *conn, struct msgb *sdp,
|
||||
const char *addr);
|
@@ -1,7 +1,10 @@
|
||||
/* Generic BTS - VTY code tries to allocate this BTS before type is known */
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
/* The statistics generator */
|
||||
|
||||
/* (C) 2010 by Daniel Willmann <daniel@totalueberwachung.de>
|
||||
*
|
||||
/*
|
||||
* (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
|
||||
@@ -19,22 +22,16 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <openbsc/gsm_data.h>
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
#include <openbsc/abis_nm.h>
|
||||
#include <osmocom/mgcp/mgcp_internal.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
static struct gsm_bts_model model_unknown = {
|
||||
.type = GSM_BTS_TYPE_UNKNOWN,
|
||||
.name = "unknown",
|
||||
.oml_rcvmsg = &abis_nm_rcvmsg,
|
||||
.nm_att_tlvdef = {
|
||||
.def = {
|
||||
},
|
||||
},
|
||||
};
|
||||
void mgcp_format_stats(char *str, size_t str_len, struct mgcp_conn *conn);
|
||||
|
||||
int bts_model_unknown_init(void)
|
||||
{
|
||||
return gsm_bts_model_register(&model_unknown);
|
||||
}
|
||||
/* Exposed for test purposes only, do not use actively */
|
||||
void calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
|
||||
uint32_t *expected, int *loss);
|
||||
|
||||
/* Exposed for test purposes only, do not use actively */
|
||||
uint32_t calc_jitter(struct mgcp_rtp_state *);
|
38
include/osmocom/mgcp/osmux.h
Normal file
38
include/osmocom/mgcp/osmux.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <osmocom/netif/osmux.h>
|
||||
struct mgcp_conn_rtp;
|
||||
|
||||
#define OSMUX_PORT 1984
|
||||
|
||||
enum {
|
||||
OSMUX_ROLE_BSC = 0,
|
||||
OSMUX_ROLE_BSC_NAT,
|
||||
};
|
||||
|
||||
int osmux_init(int role, struct mgcp_config *cfg);
|
||||
int osmux_enable_conn(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn,
|
||||
struct in_addr *addr, uint16_t port);
|
||||
void osmux_disable_conn(struct mgcp_conn_rtp *conn);
|
||||
void osmux_allocate_cid(struct mgcp_conn_rtp *conn);
|
||||
void osmux_release_cid(struct mgcp_conn_rtp *conn);
|
||||
int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn);
|
||||
int osmux_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
|
||||
int osmux_get_cid(void);
|
||||
void osmux_put_cid(uint8_t osmux_cid);
|
||||
int osmux_used_cid(void);
|
||||
|
||||
enum osmux_state {
|
||||
OSMUX_STATE_DISABLED = 0,
|
||||
OSMUX_STATE_NEGOTIATING,
|
||||
OSMUX_STATE_ACTIVATING,
|
||||
OSMUX_STATE_ENABLED,
|
||||
};
|
||||
|
||||
enum osmux_usage {
|
||||
OSMUX_USAGE_OFF = 0,
|
||||
OSMUX_USAGE_ON = 1,
|
||||
OSMUX_USAGE_ONLY = 2,
|
||||
};
|
||||
|
8
include/osmocom/mgcp/vty.h
Normal file
8
include/osmocom/mgcp/vty.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/vty/command.h>
|
||||
|
||||
enum mgcp_vty_node {
|
||||
MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
|
||||
TRUNK_NODE,
|
||||
};
|
13
include/osmocom/mgcp_client/Makefile.am
Normal file
13
include/osmocom/mgcp_client/Makefile.am
Normal file
@@ -0,0 +1,13 @@
|
||||
BUILT_SOURCES = \
|
||||
mgcp_common.h \
|
||||
$(NULL)
|
||||
|
||||
noinst_HEADERS = \
|
||||
mgcp_client_internal.h \
|
||||
$(NULL)
|
||||
|
||||
mgcp_common.h: $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h
|
||||
echo -e "/*\n\n DO NOT EDIT THIS FILE!\n THIS IS OVERWRITTEN DURING BUILD\n This is an automatic copy of <osmocom/mgcp/mgcp_common.h>\n\n */" > mgcp_common.h
|
||||
cat $(top_srcdir)/include/osmocom/mgcp/mgcp_common.h >> mgcp_common.h
|
||||
|
||||
CLEANFILES = mgcp_common.h
|
162
include/osmocom/mgcp_client/mgcp_client.h
Normal file
162
include/osmocom/mgcp_client/mgcp_client.h
Normal file
@@ -0,0 +1,162 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <osmocom/mgcp_client/mgcp_common.h>
|
||||
|
||||
#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
|
||||
#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 0
|
||||
#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
|
||||
#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
|
||||
|
||||
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;
|
||||
uint16_t first_endpoint;
|
||||
uint16_t last_endpoint;
|
||||
uint16_t bts_base;
|
||||
};
|
||||
|
||||
typedef unsigned int mgcp_trans_id_t;
|
||||
|
||||
/*! Enumeration of the codec types that mgcp_client is able to handle. */
|
||||
enum mgcp_codecs {
|
||||
CODEC_PCMU_8000_1 = 0,
|
||||
CODEC_GSM_8000_1 = 3,
|
||||
CODEC_PCMA_8000_1 = 8,
|
||||
CODEC_G729_8000_1 = 18,
|
||||
CODEC_GSMEFR_8000_1 = 110,
|
||||
CODEC_GSMHR_8000_1 = 111,
|
||||
CODEC_AMR_8000_1 = 112,
|
||||
CODEC_AMRWB_16000_1 = 113,
|
||||
};
|
||||
/* Note: when new codec types are added, the corresponding value strings
|
||||
* in mgcp_client.c (codec_table) must be updated as well. Enumerations
|
||||
* in enum mgcp_codecs must correspond to a valid payload type. However,
|
||||
* this is an internal assumption that is made to avoid lookup tables.
|
||||
* The API-User should not rely on this coincidence! */
|
||||
|
||||
/*! Structure to build a payload type map to allow the defiition custom payload
|
||||
* types. */
|
||||
struct ptmap {
|
||||
/*!< codec for which a payload type number should be defined */
|
||||
enum mgcp_codecs codec;
|
||||
|
||||
/*!< payload type number (96-127) */
|
||||
unsigned int pt;
|
||||
};
|
||||
|
||||
struct mgcp_response_head {
|
||||
int response_code;
|
||||
mgcp_trans_id_t trans_id;
|
||||
char comment[MGCP_COMMENT_MAXLEN];
|
||||
char conn_id[MGCP_CONN_ID_LENGTH];
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
};
|
||||
|
||||
struct mgcp_response {
|
||||
char *body;
|
||||
struct mgcp_response_head head;
|
||||
uint16_t audio_port;
|
||||
char audio_ip[INET_ADDRSTRLEN];
|
||||
unsigned int ptime;
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
unsigned int codecs_len;
|
||||
struct ptmap ptmap[MGCP_MAX_CODECS];
|
||||
unsigned int ptmap_len;
|
||||
};
|
||||
|
||||
enum mgcp_verb {
|
||||
MGCP_VERB_CRCX,
|
||||
MGCP_VERB_MDCX,
|
||||
MGCP_VERB_DLCX,
|
||||
MGCP_VERB_AUEP,
|
||||
MGCP_VERB_RSIP,
|
||||
};
|
||||
|
||||
#define MGCP_MSG_PRESENCE_ENDPOINT 0x0001
|
||||
#define MGCP_MSG_PRESENCE_CALL_ID 0x0002
|
||||
#define MGCP_MSG_PRESENCE_CONN_ID 0x0004
|
||||
#define MGCP_MSG_PRESENCE_AUDIO_IP 0x0008
|
||||
#define MGCP_MSG_PRESENCE_AUDIO_PORT 0x0010
|
||||
#define MGCP_MSG_PRESENCE_CONN_MODE 0x0020
|
||||
|
||||
struct mgcp_msg {
|
||||
enum mgcp_verb verb;
|
||||
/* See MGCP_MSG_PRESENCE_* constants */
|
||||
uint32_t presence;
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
unsigned int call_id;
|
||||
char *conn_id;
|
||||
uint16_t audio_port;
|
||||
char *audio_ip;
|
||||
enum mgcp_connection_mode conn_mode;
|
||||
unsigned int ptime;
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
unsigned int codecs_len;
|
||||
struct ptmap ptmap[MGCP_MAX_CODECS];
|
||||
unsigned int ptmap_len;
|
||||
};
|
||||
|
||||
void mgcp_client_conf_init(struct mgcp_client_conf *conf);
|
||||
void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
|
||||
int mgcp_client_config_write(struct vty *vty, const char *indent);
|
||||
struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
|
||||
|
||||
struct mgcp_client *mgcp_client_init(void *ctx,
|
||||
struct mgcp_client_conf *conf);
|
||||
int mgcp_client_connect(struct mgcp_client *mgcp);
|
||||
|
||||
const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
|
||||
uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
|
||||
uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
|
||||
|
||||
int mgcp_client_next_endpoint(struct mgcp_client *client);
|
||||
void mgcp_client_release_endpoint(uint16_t id, struct mgcp_client *client);
|
||||
|
||||
/* Invoked when an MGCP response is received or sending failed. When the
|
||||
* response is passed as NULL, this indicates failure during transmission. */
|
||||
typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
|
||||
int mgcp_response_parse_params(struct mgcp_response *r);
|
||||
|
||||
int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
|
||||
mgcp_response_cb_t response_cb, void *priv);
|
||||
int mgcp_client_cancel(struct mgcp_client *mgcp, mgcp_trans_id_t trans_id);
|
||||
|
||||
enum mgcp_connection_mode;
|
||||
|
||||
struct msgb *mgcp_msg_crcx(struct mgcp_client *mgcp,
|
||||
uint16_t rtp_endpoint, unsigned int call_id,
|
||||
enum mgcp_connection_mode mode)
|
||||
OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
|
||||
|
||||
struct msgb *mgcp_msg_mdcx(struct mgcp_client *mgcp,
|
||||
uint16_t rtp_endpoint, const char *rtp_conn_addr,
|
||||
uint16_t rtp_port, enum mgcp_connection_mode mode)
|
||||
OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
|
||||
|
||||
struct msgb *mgcp_msg_dlcx(struct mgcp_client *mgcp, uint16_t rtp_endpoint,
|
||||
unsigned int call_id)
|
||||
OSMO_DEPRECATED("Use mgcp_msg_gen() instead");
|
||||
|
||||
struct msgb *mgcp_msg_gen(struct mgcp_client *mgcp, struct mgcp_msg *mgcp_msg);
|
||||
mgcp_trans_id_t mgcp_msg_trans_id(struct msgb *msg);
|
||||
|
||||
extern const struct value_string mgcp_client_connection_mode_strs[];
|
||||
static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
|
||||
{
|
||||
return get_value_string(mgcp_client_connection_mode_strs, mode);
|
||||
}
|
||||
|
||||
enum mgcp_codecs map_str_to_codec(const char *str);
|
||||
unsigned int map_codec_to_pt(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);
|
44
include/osmocom/mgcp_client/mgcp_client_fsm.h
Normal file
44
include/osmocom/mgcp_client/mgcp_client_fsm.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/mgcp_client/mgcp_common.h>
|
||||
#include <osmocom/mgcp_client/mgcp_client.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
|
||||
/*! This struct organizes the connection infromation one connection side
|
||||
* (either remote or local). It is used to pass parameters (local) to the FSM
|
||||
* and get responses (remote) from the FSM as pointer attached to the FSM
|
||||
* event.
|
||||
*
|
||||
* When modifiying a connection, the endpoint and call_id members may be left
|
||||
* unpopulated. The call_id field is ignored in this case. If an endpoint
|
||||
* identifier is supplied it is checked against the internal state to make
|
||||
* sure it is correct. */
|
||||
struct mgcp_conn_peer {
|
||||
/*!< RTP connection IP-Address (optional, string e.g. "127.0.0.1") */
|
||||
char addr[INET_ADDRSTRLEN];
|
||||
|
||||
/*!< RTP connection IP-Port (optional) */
|
||||
uint16_t port;
|
||||
|
||||
/*!< RTP endpoint */
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
|
||||
/*!< CALL ID (unique per connection) */
|
||||
unsigned int call_id;
|
||||
|
||||
/*!< RTP packetization interval (optional) */
|
||||
unsigned int ptime;
|
||||
|
||||
/*!< RTP codec list (optional) */
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
|
||||
/*!< Number of codecs in RTP codec list (optional) */
|
||||
unsigned int codecs_len;
|
||||
};
|
||||
|
||||
struct osmo_fsm_inst *mgcp_conn_create(struct mgcp_client *mgcp, struct osmo_fsm_inst *parent_fi, uint32_t parent_term_evt,
|
||||
uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
|
||||
int mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
|
||||
void mgcp_conn_delete(struct osmo_fsm_inst *fi);
|
||||
|
||||
const char *mgcp_conn_get_ci(struct osmo_fsm_inst *fi);
|
35
include/osmocom/mgcp_client/mgcp_client_internal.h
Normal file
35
include/osmocom/mgcp_client/mgcp_client_internal.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/write_queue.h>
|
||||
|
||||
#define MSGB_CB_MGCP_TRANS_ID 0
|
||||
|
||||
struct mgcp_client {
|
||||
struct mgcp_client_conf actual;
|
||||
uint32_t remote_addr;
|
||||
struct osmo_wqueue wq;
|
||||
mgcp_trans_id_t next_trans_id;
|
||||
struct llist_head responses_pending;
|
||||
struct llist_head inuse_endpoints;
|
||||
};
|
||||
|
||||
struct mgcp_inuse_endpoint {
|
||||
struct llist_head entry;
|
||||
uint16_t id;
|
||||
};
|
||||
|
||||
struct mgcp_response_pending {
|
||||
struct llist_head entry;
|
||||
|
||||
mgcp_trans_id_t trans_id;
|
||||
mgcp_response_cb_t response_cb;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
int mgcp_client_rx(struct mgcp_client *mgcp, struct msgb *msg);
|
||||
|
||||
struct mgcp_response_pending * mgcp_client_pending_add(
|
||||
struct mgcp_client *mgcp,
|
||||
mgcp_trans_id_t trans_id,
|
||||
mgcp_response_cb_t response_cb,
|
||||
void *priv);
|
10
libosmo-legacy-mgcp.pc.in
Normal file
10
libosmo-legacy-mgcp.pc.in
Normal file
@@ -0,0 +1,10 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: Osmocom legacy Media Gateway Control Protocol library
|
||||
Description: C Utility Library
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -losmo-legacy-mgcp
|
||||
Cflags: -I${includedir}/
|
10
libosmo-mgcp-client.pc.in
Normal file
10
libosmo-mgcp-client.pc.in
Normal file
@@ -0,0 +1,10 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: Osmocom Media Gateway Control Protocol Client library
|
||||
Description: C Utility Library
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -losmo-mgcp-client
|
||||
Cflags: -I${includedir}/
|
@@ -1,144 +0,0 @@
|
||||
diff -Nru --exclude-from /sunbeam/home/laforge/scripts/dontdiff linux-2.6.27.4-clean/drivers/isdn/mISDN/layer2.c linux-2.6.27.4/drivers/isdn/mISDN/layer2.c
|
||||
--- linux-2.6.27.4-clean/drivers/isdn/mISDN/layer2.c 2008-10-26 00:05:07.000000000 +0200
|
||||
+++ linux-2.6.27.4/drivers/isdn/mISDN/layer2.c 2008-12-23 16:16:29.000000000 +0100
|
||||
@@ -94,8 +94,10 @@
|
||||
struct layer2 *l2 = fi->userdata;
|
||||
va_list va;
|
||||
|
||||
+#if 0
|
||||
if (!(*debug & DEBUG_L2_FSM))
|
||||
return;
|
||||
+#endif
|
||||
va_start(va, fmt);
|
||||
printk(KERN_DEBUG "l2 (tei %d): ", l2->tei);
|
||||
vprintk(fmt, va);
|
||||
@@ -882,6 +884,8 @@
|
||||
l2->va = 0;
|
||||
l2->vr = 0;
|
||||
l2->sow = 0;
|
||||
+ l2->sapi = skb->data[0] >> 2;
|
||||
+ set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||
clear_exception(l2);
|
||||
send_uframe(l2, NULL, UA | get_PollFlag(l2, skb), RSP);
|
||||
mISDN_FsmChangeState(fi, ST_L2_7);
|
||||
@@ -898,6 +902,7 @@
|
||||
struct layer2 *l2 = fi->userdata;
|
||||
struct sk_buff *skb = arg;
|
||||
|
||||
+ printk(KERN_DEBUG "l2_send_UA()\n");
|
||||
send_uframe(l2, skb, UA | get_PollFlag(l2, skb), RSP);
|
||||
}
|
||||
|
||||
@@ -931,6 +936,8 @@
|
||||
l2->va = 0;
|
||||
l2->vr = 0;
|
||||
l2->sow = 0;
|
||||
+ l2->sapi = skb->data[0] >> 2;
|
||||
+ set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||
mISDN_FsmChangeState(fi, ST_L2_7);
|
||||
stop_t200(l2, 3);
|
||||
mISDN_FsmRestartTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3);
|
||||
@@ -982,6 +989,8 @@
|
||||
} else if (l2->vs != l2->va) {
|
||||
skb_queue_purge(&l2->i_queue);
|
||||
pr = DL_ESTABLISH_IND;
|
||||
+ //l2->sapi = skb->data[0] >> 2;
|
||||
+ //set_channel_address(&l2->ch, l2->sapi, l2->tei);
|
||||
}
|
||||
stop_t200(l2, 5);
|
||||
l2->vr = 0;
|
||||
@@ -1841,11 +1850,14 @@
|
||||
u_int l;
|
||||
int c = 0;
|
||||
|
||||
+ printk(KERN_DEBUG "ph_data_indication 0x%x 0x%x 0x%x\n", datap[0], datap[1], datap[2]);
|
||||
+
|
||||
l = l2addrsize(l2);
|
||||
if (skb->len <= l) {
|
||||
mISDN_FsmEvent(&l2->l2m, EV_L2_FRAME_ERROR, (void *) 'N');
|
||||
return ret;
|
||||
}
|
||||
+#if 0
|
||||
if (test_bit(FLG_LAPD, &l2->flag)) { /* Maybe not needed */
|
||||
psapi = *datap++;
|
||||
ptei = *datap++;
|
||||
@@ -1875,6 +1887,7 @@
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
+#endif
|
||||
datap += l;
|
||||
if (!(*datap & 1)) { /* I-Frame */
|
||||
c = iframe_error(l2, skb);
|
||||
@@ -1890,6 +1903,7 @@
|
||||
ret = mISDN_FsmEvent(&l2->l2m, EV_L2_UI, skb);
|
||||
} else if (IsSABME(datap, l2)) {
|
||||
c = unnum_error(l2, skb, CMD);
|
||||
+ printk(KERN_DEBUG "IsSABME() returned true, unnum_error=%d\n", c);
|
||||
if (!c)
|
||||
ret = mISDN_FsmEvent(&l2->l2m, EV_L2_SABME, skb);
|
||||
} else if (IsUA(datap)) {
|
||||
@@ -2087,7 +2101,7 @@
|
||||
test_and_set_bit(FLG_LAPD, &l2->flag);
|
||||
test_and_set_bit(FLG_LAPD_NET, &l2->flag);
|
||||
test_and_set_bit(FLG_MOD128, &l2->flag);
|
||||
- l2->sapi = 0;
|
||||
+ l2->sapi = 62;
|
||||
l2->maxlen = MAX_DFRAME_LEN;
|
||||
if (test_bit(OPTION_L2_PMX, &options))
|
||||
l2->window = 7;
|
||||
diff -Nru --exclude-from /sunbeam/home/laforge/scripts/dontdiff linux-2.6.27.4-clean/drivers/isdn/mISDN/tei.c linux-2.6.27.4/drivers/isdn/mISDN/tei.c
|
||||
--- linux-2.6.27.4-clean/drivers/isdn/mISDN/tei.c 2008-10-26 00:05:07.000000000 +0200
|
||||
+++ linux-2.6.27.4/drivers/isdn/mISDN/tei.c 2008-12-23 16:32:59.000000000 +0100
|
||||
@@ -830,18 +830,29 @@
|
||||
int tei, ri;
|
||||
struct layer2 *l2;
|
||||
|
||||
+ printk(KERN_DEBUG "new tei request: tei=%d\n", dp[3] >> 1);
|
||||
+
|
||||
ri = dp[0] << 8;
|
||||
ri += dp[1];
|
||||
- if (!mgr->up)
|
||||
- goto denied;
|
||||
- tei = get_free_tei(mgr);
|
||||
- if (tei < 0) {
|
||||
- printk(KERN_WARNING "%s:No free tei\n", __func__);
|
||||
+ if (!mgr->up) {
|
||||
+ printk(KERN_DEBUG "mgr->up == NULL\n");
|
||||
goto denied;
|
||||
}
|
||||
+ if (dp[3] != 0xff) {
|
||||
+ /* This is a TEI request according to 3GPP TS 08.56 6.1.11.2 */
|
||||
+ tei = dp[3] >> 1;
|
||||
+ } else {
|
||||
+ tei = get_free_tei(mgr);
|
||||
+ if (tei < 0) {
|
||||
+ printk(KERN_WARNING "%s:No free tei\n", __func__);
|
||||
+ goto denied;
|
||||
+ }
|
||||
+ }
|
||||
l2 = create_new_tei(mgr, tei);
|
||||
- if (!l2)
|
||||
+ if (!l2) {
|
||||
+ printk(KERN_DEBUG "create_new_tei == NULL\n");
|
||||
goto denied;
|
||||
+ }
|
||||
else
|
||||
mISDN_FsmEvent(&l2->tm->tei_m, EV_ASSIGN_REQ, dp);
|
||||
return;
|
||||
@@ -1159,12 +1170,14 @@
|
||||
return -ENOTCONN;
|
||||
if (skb->len != 3)
|
||||
return -ENOTCONN;
|
||||
+#if 0
|
||||
if (skb->data[0] != 0)
|
||||
/* only SAPI 0 command */
|
||||
return -ENOTCONN;
|
||||
+#endif
|
||||
if (!(skb->data[1] & 1)) /* invalid EA1 */
|
||||
return -EINVAL;
|
||||
- tei = skb->data[1] >> 0;
|
||||
+ tei = skb->data[1] >> 1;
|
||||
if (tei > 63) /* not a fixed tei */
|
||||
return -ENOTCONN;
|
||||
if ((skb->data[2] & ~0x10) != SABME)
|
@@ -1,486 +0,0 @@
|
||||
This experimental patch splits one E1 card into three virtual cards,
|
||||
|
||||
TS 1,2,3,4,5 is card 0
|
||||
TS 6,7,8,9,10 is card 1
|
||||
TS 11,12,13,14 is card 2
|
||||
|
||||
This allows you to run one L2 TEI handler on each of the virtual cards,
|
||||
which is required if you want to run multiple BTS on a single E1 link.
|
||||
|
||||
Thanks to Andreas Eversberg for this patch.
|
||||
|
||||
diff --git a/drivers/isdn/hardware/mISDN/hfc_multi.h b/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||
index 0c77386..02dd4a1 100644
|
||||
--- a/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||
+++ b/drivers/isdn/hardware/mISDN/hfc_multi.h
|
||||
@@ -209,14 +209,17 @@ struct hfc_multi {
|
||||
u_long ledstate; /* save last state of leds */
|
||||
int opticalsupport; /* has the e1 board */
|
||||
/* an optical Interface */
|
||||
- int dslot; /* channel # of d-channel (E1) default 16 */
|
||||
+
|
||||
+ u_int bmask[32]; /* bitmask of bchannels for port */
|
||||
+ u_char dnum[32]; /* array of used dchannel numbers for port */
|
||||
+ u_char created[32]; /* what port is created */
|
||||
+ u_int activity[32]; /* if there is any action on this */
|
||||
+ /* port (will be cleared after */
|
||||
+ /* showing led-states) */
|
||||
|
||||
u_long wdcount; /* every 500 ms we need to */
|
||||
/* send the watchdog a signal */
|
||||
u_char wdbyte; /* watchdog toggle byte */
|
||||
- u_int activity[8]; /* if there is any action on this */
|
||||
- /* port (will be cleared after */
|
||||
- /* showing led-states) */
|
||||
int e1_state; /* keep track of last state */
|
||||
int e1_getclock; /* if sync is retrieved from interface */
|
||||
int syncronized; /* keep track of existing sync interface */
|
||||
@@ -233,7 +236,6 @@ struct hfc_multi {
|
||||
* the bch->channel is equvalent to the hfc-channel
|
||||
*/
|
||||
struct hfc_chan chan[32];
|
||||
- u_char created[8]; /* what port is created */
|
||||
signed char slot_owner[256]; /* owner channel of slot */
|
||||
};
|
||||
|
||||
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||
index e1dab30..4fe2d27 100644
|
||||
--- a/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||
+++ b/drivers/isdn/hardware/mISDN/hfcmulti.c
|
||||
@@ -1619,8 +1619,8 @@ hfcmulti_leds(struct hfc_multi *hc)
|
||||
* left red: frame sync, but no L1
|
||||
* right green: L2 active
|
||||
*/
|
||||
- if (hc->chan[hc->dslot].sync != 2) { /* no frame sync */
|
||||
- if (hc->chan[hc->dslot].dch->dev.D.protocol
|
||||
+ if (hc->chan[hc->dnum[0]].sync != 2) { /* no frame sync */
|
||||
+ if (hc->chan[hc->dnum[0]].dch->dev.D.protocol
|
||||
!= ISDN_P_NT_E1) {
|
||||
led[0] = 1;
|
||||
led[1] = 1;
|
||||
@@ -2428,55 +2428,56 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||
}
|
||||
}
|
||||
if (hc->ctype == HFC_TYPE_E1 && hc->created[0]) {
|
||||
- dch = hc->chan[hc->dslot].dch;
|
||||
- if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dslot].cfg)) {
|
||||
+#warning todo: put interface parameters to hc
|
||||
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||
+ if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[0]].cfg)) {
|
||||
/* LOS */
|
||||
temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_SIG_LOS;
|
||||
- if (!temp && hc->chan[hc->dslot].los)
|
||||
+ if (!temp && hc->chan[hc->dnum[0]].los)
|
||||
signal_state_up(dch, L1_SIGNAL_LOS_ON,
|
||||
"LOS detected");
|
||||
- if (temp && !hc->chan[hc->dslot].los)
|
||||
+ if (temp && !hc->chan[hc->dnum[0]].los)
|
||||
signal_state_up(dch, L1_SIGNAL_LOS_OFF,
|
||||
"LOS gone");
|
||||
- hc->chan[hc->dslot].los = temp;
|
||||
+ hc->chan[hc->dnum[0]].los = temp;
|
||||
}
|
||||
- if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dslot].cfg)) {
|
||||
+ if (test_bit(HFC_CFG_REPORT_AIS, &hc->chan[hc->dnum[0]].cfg)) {
|
||||
/* AIS */
|
||||
temp = HFC_inb_nodebug(hc, R_SYNC_STA) & V_AIS;
|
||||
- if (!temp && hc->chan[hc->dslot].ais)
|
||||
+ if (!temp && hc->chan[hc->dnum[0]].ais)
|
||||
signal_state_up(dch, L1_SIGNAL_AIS_ON,
|
||||
"AIS detected");
|
||||
- if (temp && !hc->chan[hc->dslot].ais)
|
||||
+ if (temp && !hc->chan[hc->dnum[0]].ais)
|
||||
signal_state_up(dch, L1_SIGNAL_AIS_OFF,
|
||||
"AIS gone");
|
||||
- hc->chan[hc->dslot].ais = temp;
|
||||
+ hc->chan[hc->dnum[0]].ais = temp;
|
||||
}
|
||||
- if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dslot].cfg)) {
|
||||
+ if (test_bit(HFC_CFG_REPORT_SLIP, &hc->chan[hc->dnum[0]].cfg)) {
|
||||
/* SLIP */
|
||||
temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_RX;
|
||||
- if (!temp && hc->chan[hc->dslot].slip_rx)
|
||||
+ if (!temp && hc->chan[hc->dnum[0]].slip_rx)
|
||||
signal_state_up(dch, L1_SIGNAL_SLIP_RX,
|
||||
" bit SLIP detected RX");
|
||||
- hc->chan[hc->dslot].slip_rx = temp;
|
||||
+ hc->chan[hc->dnum[0]].slip_rx = temp;
|
||||
temp = HFC_inb_nodebug(hc, R_SLIP) & V_FOSLIP_TX;
|
||||
- if (!temp && hc->chan[hc->dslot].slip_tx)
|
||||
+ if (!temp && hc->chan[hc->dnum[0]].slip_tx)
|
||||
signal_state_up(dch, L1_SIGNAL_SLIP_TX,
|
||||
" bit SLIP detected TX");
|
||||
- hc->chan[hc->dslot].slip_tx = temp;
|
||||
+ hc->chan[hc->dnum[0]].slip_tx = temp;
|
||||
}
|
||||
- if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dslot].cfg)) {
|
||||
+ if (test_bit(HFC_CFG_REPORT_RDI, &hc->chan[hc->dnum[0]].cfg)) {
|
||||
/* RDI */
|
||||
temp = HFC_inb_nodebug(hc, R_RX_SL0_0) & V_A;
|
||||
- if (!temp && hc->chan[hc->dslot].rdi)
|
||||
+ if (!temp && hc->chan[hc->dnum[0]].rdi)
|
||||
signal_state_up(dch, L1_SIGNAL_RDI_ON,
|
||||
"RDI detected");
|
||||
- if (temp && !hc->chan[hc->dslot].rdi)
|
||||
+ if (temp && !hc->chan[hc->dnum[0]].rdi)
|
||||
signal_state_up(dch, L1_SIGNAL_RDI_OFF,
|
||||
"RDI gone");
|
||||
- hc->chan[hc->dslot].rdi = temp;
|
||||
+ hc->chan[hc->dnum[0]].rdi = temp;
|
||||
}
|
||||
temp = HFC_inb_nodebug(hc, R_JATT_DIR);
|
||||
- switch (hc->chan[hc->dslot].sync) {
|
||||
+ switch (hc->chan[hc->dnum[0]].sync) {
|
||||
case 0:
|
||||
if ((temp & 0x60) == 0x60) {
|
||||
if (debug & DEBUG_HFCMULTI_SYNC)
|
||||
@@ -2485,10 +2486,10 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||
"in clock sync\n",
|
||||
__func__, hc->id);
|
||||
HFC_outb(hc, R_RX_OFF,
|
||||
- hc->chan[hc->dslot].jitter | V_RX_INIT);
|
||||
+ hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
|
||||
HFC_outb(hc, R_TX_OFF,
|
||||
- hc->chan[hc->dslot].jitter | V_RX_INIT);
|
||||
- hc->chan[hc->dslot].sync = 1;
|
||||
+ hc->chan[hc->dnum[0]].jitter | V_RX_INIT);
|
||||
+ hc->chan[hc->dnum[0]].sync = 1;
|
||||
goto check_framesync;
|
||||
}
|
||||
break;
|
||||
@@ -2499,7 +2500,7 @@ handle_timer_irq(struct hfc_multi *hc)
|
||||
"%s: (id=%d) E1 "
|
||||
"lost clock sync\n",
|
||||
__func__, hc->id);
|
||||
- hc->chan[hc->dslot].sync = 0;
|
||||
+ hc->chan[hc->dnum[0]].sync = 0;
|
||||
break;
|
||||
}
|
||||
check_framesync:
|
||||
@@ -2510,7 +2511,7 @@ check_framesync:
|
||||
"%s: (id=%d) E1 "
|
||||
"now in frame sync\n",
|
||||
__func__, hc->id);
|
||||
- hc->chan[hc->dslot].sync = 2;
|
||||
+ hc->chan[hc->dnum[0]].sync = 2;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
@@ -2520,7 +2521,7 @@ check_framesync:
|
||||
"%s: (id=%d) E1 lost "
|
||||
"clock & frame sync\n",
|
||||
__func__, hc->id);
|
||||
- hc->chan[hc->dslot].sync = 0;
|
||||
+ hc->chan[hc->dnum[0]].sync = 0;
|
||||
break;
|
||||
}
|
||||
temp = HFC_inb_nodebug(hc, R_SYNC_STA);
|
||||
@@ -2530,7 +2531,7 @@ check_framesync:
|
||||
"%s: (id=%d) E1 "
|
||||
"lost frame sync\n",
|
||||
__func__, hc->id);
|
||||
- hc->chan[hc->dslot].sync = 1;
|
||||
+ hc->chan[hc->dnum[0]].sync = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2746,7 +2747,8 @@ hfcmulti_interrupt(int intno, void *dev_id)
|
||||
if (r_irq_misc & V_STA_IRQ) {
|
||||
if (hc->ctype == HFC_TYPE_E1) {
|
||||
/* state machine */
|
||||
- dch = hc->chan[hc->dslot].dch;
|
||||
+#warning todo
|
||||
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||
e1_syncsta = HFC_inb_nodebug(hc, R_SYNC_STA);
|
||||
if (test_bit(HFC_CHIP_PLXSD, &hc->chip)
|
||||
&& hc->e1_getclock) {
|
||||
@@ -2768,7 +2770,15 @@ hfcmulti_interrupt(int intno, void *dev_id)
|
||||
}
|
||||
dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA)
|
||||
& 0x7;
|
||||
+#warning todo hack!!! broadcast state change!!!
|
||||
+ dch = hc->chan[hc->dnum[0]].dch;
|
||||
schedule_event(dch, FLG_PHCHANGE);
|
||||
+ dch = hc->chan[hc->dnum[1]].dch;
|
||||
+ dch->state = HFC_inb_nodebug(hc, R_E1_RD_STA)
|
||||
+ & 0x7;
|
||||
+ schedule_event(dch, FLG_PHCHANGE);
|
||||
+
|
||||
+
|
||||
if (debug & DEBUG_HFCMULTI_STATE)
|
||||
printk(KERN_DEBUG
|
||||
"%s: E1 (id=%d) newstate %x\n",
|
||||
@@ -3851,31 +3861,35 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||
if (debug & DEBUG_HFCMULTI_INIT)
|
||||
printk(KERN_DEBUG "%s: entered\n", __func__);
|
||||
|
||||
+ i = dch->slot;
|
||||
+ pt = hc->chan[i].port;
|
||||
if (hc->ctype == HFC_TYPE_E1) {
|
||||
- hc->chan[hc->dslot].slot_tx = -1;
|
||||
- hc->chan[hc->dslot].slot_rx = -1;
|
||||
- hc->chan[hc->dslot].conf = -1;
|
||||
- if (hc->dslot) {
|
||||
- mode_hfcmulti(hc, hc->dslot, dch->dev.D.protocol,
|
||||
+ /* E1 */
|
||||
+#warning todo: don''t do it if dnum == 0
|
||||
+ hc->chan[hc->dnum[pt]].slot_tx = -1;
|
||||
+ hc->chan[hc->dnum[pt]].slot_rx = -1;
|
||||
+ hc->chan[hc->dnum[pt]].conf = -1;
|
||||
+ if (hc->dnum[pt]) {
|
||||
+ mode_hfcmulti(hc, dch->slot, dch->dev.D.protocol,
|
||||
-1, 0, -1, 0);
|
||||
dch->timer.function = (void *) hfcmulti_dbusy_timer;
|
||||
dch->timer.data = (long) dch;
|
||||
init_timer(&dch->timer);
|
||||
}
|
||||
for (i = 1; i <= 31; i++) {
|
||||
- if (i == hc->dslot)
|
||||
+ if (!((1 << i) & hc->bmask[pt])) /* skip unused channel */
|
||||
continue;
|
||||
hc->chan[i].slot_tx = -1;
|
||||
hc->chan[i].slot_rx = -1;
|
||||
hc->chan[i].conf = -1;
|
||||
mode_hfcmulti(hc, i, ISDN_P_NONE, -1, 0, -1, 0);
|
||||
}
|
||||
- /* E1 */
|
||||
- if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dslot].cfg)) {
|
||||
+#warning todo (global)
|
||||
+ if (test_bit(HFC_CFG_REPORT_LOS, &hc->chan[hc->dnum[pt]].cfg)) {
|
||||
HFC_outb(hc, R_LOS0, 255); /* 2 ms */
|
||||
HFC_outb(hc, R_LOS1, 255); /* 512 ms */
|
||||
}
|
||||
- if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dslot].cfg)) {
|
||||
+ if (test_bit(HFC_CFG_OPTICAL, &hc->chan[hc->dnum[pt]].cfg)) {
|
||||
HFC_outb(hc, R_RX0, 0);
|
||||
hc->hw.r_tx0 = 0 | V_OUT_EN;
|
||||
} else {
|
||||
@@ -3888,12 +3902,12 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||
HFC_outb(hc, R_TX_FR0, 0x00);
|
||||
HFC_outb(hc, R_TX_FR1, 0xf8);
|
||||
|
||||
- if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dslot].cfg))
|
||||
+ if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[pt]].cfg))
|
||||
HFC_outb(hc, R_TX_FR2, V_TX_MF | V_TX_E | V_NEG_E);
|
||||
|
||||
HFC_outb(hc, R_RX_FR0, V_AUTO_RESYNC | V_AUTO_RECO | 0);
|
||||
|
||||
- if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dslot].cfg))
|
||||
+ if (test_bit(HFC_CFG_CRC4, &hc->chan[hc->dnum[pt]].cfg))
|
||||
HFC_outb(hc, R_RX_FR1, V_RX_MF | V_RX_MF_SYNC);
|
||||
|
||||
if (dch->dev.D.protocol == ISDN_P_NT_E1) {
|
||||
@@ -3957,7 +3971,7 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||
plxsd_checksync(hc, 0);
|
||||
}
|
||||
} else {
|
||||
- i = dch->slot;
|
||||
+ /* ST */
|
||||
hc->chan[i].slot_tx = -1;
|
||||
hc->chan[i].slot_rx = -1;
|
||||
hc->chan[i].conf = -1;
|
||||
@@ -3973,8 +3987,6 @@ hfcmulti_initmode(struct dchannel *dch)
|
||||
hc->chan[i - 1].slot_rx = -1;
|
||||
hc->chan[i - 1].conf = -1;
|
||||
mode_hfcmulti(hc, i - 1, ISDN_P_NONE, -1, 0, -1, 0);
|
||||
- /* ST */
|
||||
- pt = hc->chan[i].port;
|
||||
/* select interface */
|
||||
HFC_outb(hc, R_ST_SEL, pt);
|
||||
/* undocumented: delay after R_ST_SEL */
|
||||
@@ -4557,6 +4569,8 @@ release_port(struct hfc_multi *hc, struct dchannel *dch)
|
||||
}
|
||||
/* free channels */
|
||||
for (i = 0; i <= 31; i++) {
|
||||
+ if (!((1 << i) & hc->bmask[pt])) /* skip unused channel */
|
||||
+ continue;
|
||||
if (hc->chan[i].bch) {
|
||||
if (debug & DEBUG_HFCMULTI_INIT)
|
||||
printk(KERN_DEBUG
|
||||
@@ -4680,12 +4694,13 @@ release_card(struct hfc_multi *hc)
|
||||
}
|
||||
|
||||
static int
|
||||
-init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
+init_e1_port(struct hfc_multi *hc, struct hm_map *m, int pt)
|
||||
{
|
||||
struct dchannel *dch;
|
||||
struct bchannel *bch;
|
||||
int ch, ret = 0;
|
||||
char name[MISDN_MAX_IDLEN];
|
||||
+ int bcount = 0;
|
||||
|
||||
dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);
|
||||
if (!dch)
|
||||
@@ -4698,13 +4713,12 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
(1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
|
||||
dch->dev.D.send = handle_dmsg;
|
||||
dch->dev.D.ctrl = hfcm_dctrl;
|
||||
- dch->dev.nrbchan = (hc->dslot) ? 30 : 31;
|
||||
- dch->slot = hc->dslot;
|
||||
- hc->chan[hc->dslot].dch = dch;
|
||||
- hc->chan[hc->dslot].port = 0;
|
||||
- hc->chan[hc->dslot].nt_timer = -1;
|
||||
+ dch->slot = hc->dnum[pt];
|
||||
+ hc->chan[hc->dnum[pt]].dch = dch;
|
||||
+ hc->chan[hc->dnum[pt]].port = pt;
|
||||
+ hc->chan[hc->dnum[pt]].nt_timer = -1;
|
||||
for (ch = 1; ch <= 31; ch++) {
|
||||
- if (ch == hc->dslot) /* skip dchannel */
|
||||
+ if (!((1 << ch) & hc->bmask[pt])) /* skip unused channel */
|
||||
continue;
|
||||
bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);
|
||||
if (!bch) {
|
||||
@@ -4733,7 +4747,10 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
hc->chan[ch].bch = bch;
|
||||
hc->chan[ch].port = 0;
|
||||
set_channelmap(bch->nr, dch->dev.channelmap);
|
||||
+ bcount++;
|
||||
}
|
||||
+ dch->dev.nrbchan = bcount;
|
||||
+#warning todo: must be set globally, and must be a seperate function
|
||||
/* set optical line type */
|
||||
if (port[Port_cnt] & 0x001) {
|
||||
if (!m->opticalsupport) {
|
||||
@@ -4749,7 +4766,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
__func__,
|
||||
HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_OPTICAL,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
}
|
||||
}
|
||||
/* set LOS report */
|
||||
@@ -4759,7 +4776,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
"LOS report: card(%d) port(%d)\n",
|
||||
__func__, HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_REPORT_LOS,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
}
|
||||
/* set AIS report */
|
||||
if (port[Port_cnt] & 0x008) {
|
||||
@@ -4768,7 +4785,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
"AIS report: card(%d) port(%d)\n",
|
||||
__func__, HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_REPORT_AIS,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
}
|
||||
/* set SLIP report */
|
||||
if (port[Port_cnt] & 0x010) {
|
||||
@@ -4778,7 +4795,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
"card(%d) port(%d)\n",
|
||||
__func__, HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_REPORT_SLIP,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
}
|
||||
/* set RDI report */
|
||||
if (port[Port_cnt] & 0x020) {
|
||||
@@ -4788,7 +4805,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
"card(%d) port(%d)\n",
|
||||
__func__, HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_REPORT_RDI,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
}
|
||||
/* set CRC-4 Mode */
|
||||
if (!(port[Port_cnt] & 0x100)) {
|
||||
@@ -4797,7 +4814,7 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
" card(%d) port(%d)\n",
|
||||
__func__, HFC_cnt + 1, 1);
|
||||
test_and_set_bit(HFC_CFG_CRC4,
|
||||
- &hc->chan[hc->dslot].cfg);
|
||||
+ &hc->chan[hc->dnum[pt]].cfg);
|
||||
} else {
|
||||
if (debug & DEBUG_HFCMULTI_INIT)
|
||||
printk(KERN_DEBUG "%s: PORT turn off CRC4"
|
||||
@@ -4829,20 +4846,23 @@ init_e1_port(struct hfc_multi *hc, struct hm_map *m)
|
||||
}
|
||||
/* set elastic jitter buffer */
|
||||
if (port[Port_cnt] & 0x3000) {
|
||||
- hc->chan[hc->dslot].jitter = (port[Port_cnt]>>12) & 0x3;
|
||||
+ hc->chan[hc->dnum[pt]].jitter = (port[Port_cnt]>>12) & 0x3;
|
||||
if (debug & DEBUG_HFCMULTI_INIT)
|
||||
printk(KERN_DEBUG
|
||||
"%s: PORT set elastic "
|
||||
"buffer to %d: card(%d) port(%d)\n",
|
||||
- __func__, hc->chan[hc->dslot].jitter,
|
||||
+ __func__, hc->chan[hc->dnum[pt]].jitter,
|
||||
HFC_cnt + 1, 1);
|
||||
} else
|
||||
- hc->chan[hc->dslot].jitter = 2; /* default */
|
||||
- snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
|
||||
+ hc->chan[hc->dnum[pt]].jitter = 2; /* default */
|
||||
+ if (hc->ports > 1)
|
||||
+ snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d-%d", HFC_cnt + 1, pt+1);
|
||||
+ else
|
||||
+ snprintf(name, MISDN_MAX_IDLEN - 1, "hfc-e1.%d", HFC_cnt + 1);
|
||||
ret = mISDN_register_device(&dch->dev, &hc->pci_dev->dev, name);
|
||||
if (ret)
|
||||
goto free_chan;
|
||||
- hc->created[0] = 1;
|
||||
+ hc->created[pt] = 1;
|
||||
return ret;
|
||||
free_chan:
|
||||
release_port(hc, dch);
|
||||
@@ -5009,18 +5029,30 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||
hc->id = HFC_cnt;
|
||||
hc->pcm = pcm[HFC_cnt];
|
||||
hc->io_mode = iomode[HFC_cnt];
|
||||
+#warning todo: rework module parameters for customizing e1 fragments.... yea, let''s call it: fragments
|
||||
if (dslot[HFC_cnt] < 0 && hc->ctype == HFC_TYPE_E1) {
|
||||
- hc->dslot = 0;
|
||||
+ hc->dnum[0] = 0;
|
||||
printk(KERN_INFO "HFC-E1 card has disabled D-channel, but "
|
||||
"31 B-channels\n");
|
||||
}
|
||||
if (dslot[HFC_cnt] > 0 && dslot[HFC_cnt] < 32
|
||||
&& hc->ctype == HFC_TYPE_E1) {
|
||||
- hc->dslot = dslot[HFC_cnt];
|
||||
+ hc->dnum[0] = dslot[HFC_cnt];
|
||||
printk(KERN_INFO "HFC-E1 card has alternating D-channel on "
|
||||
"time slot %d\n", dslot[HFC_cnt]);
|
||||
} else
|
||||
- hc->dslot = 16;
|
||||
+ hc->dnum[0] = 16;
|
||||
+
|
||||
+#warning todo HACK!!! just a small map of two "fragments"
|
||||
+ if (hc->ctype == HFC_TYPE_E1) {
|
||||
+ hc->dnum[0] = 1;
|
||||
+ hc->bmask[0] = 0x0000003c;
|
||||
+ hc->dnum[1] = 6;
|
||||
+ hc->bmask[1] = 0x00000780;
|
||||
+ hc->dnum[2] = 11;
|
||||
+ hc->bmask[2] = 0x00007800;
|
||||
+ hc->ports = 3;
|
||||
+ }
|
||||
|
||||
/* set chip specific features */
|
||||
hc->masterclk = -1;
|
||||
@@ -5103,7 +5135,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||
goto free_card;
|
||||
}
|
||||
if (hc->ctype == HFC_TYPE_E1)
|
||||
- ret_err = init_e1_port(hc, m);
|
||||
+ ret_err = init_e1_port(hc, m, pt);
|
||||
else
|
||||
ret_err = init_multi_port(hc, pt);
|
||||
if (debug & DEBUG_HFCMULTI_INIT)
|
||||
@@ -5115,10 +5147,14 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
|
||||
if (ret_err) {
|
||||
while (pt) { /* release already registered ports */
|
||||
pt--;
|
||||
- release_port(hc, hc->chan[(pt << 2) + 2].dch);
|
||||
+ if (hc->ctype == HFC_TYPE_E1)
|
||||
+ release_port(hc, hc->chan[hc->dnum[pt]].dch);
|
||||
+ else
|
||||
+ release_port(hc, hc->chan[(pt << 2) + 2].dch);
|
||||
}
|
||||
goto free_card;
|
||||
}
|
||||
+#warning todo: count it right, add additional "fragment" counter...
|
||||
Port_cnt++;
|
||||
}
|
||||
|
3
m4/README
Normal file
3
m4/README
Normal file
@@ -0,0 +1,3 @@
|
||||
We want to avoid creating too many external build-time dependencies
|
||||
like this one to autoconf-archive. This directory provides a local
|
||||
copy of required m4 rules.
|
74
m4/ax_check_compile_flag.m4
Normal file
74
m4/ax_check_compile_flag.m4
Normal file
@@ -0,0 +1,74 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check whether the given FLAG works with the current language's compiler
|
||||
# or gives an error. (Warnings, however, are ignored)
|
||||
#
|
||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
||||
# success/failure.
|
||||
#
|
||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||
# force the compiler to issue an error when a bad flag is given.
|
||||
#
|
||||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||
#
|
||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
||||
# gives unlimited permission to copy, distribute and modify the configure
|
||||
# scripts that are the output of Autoconf when processing the Macro. You
|
||||
# need not follow the terms of the GNU General Public License when using
|
||||
# or distributing such scripts, even though portions of the text of the
|
||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
||||
# all other use of the material that constitutes the Autoconf Macro.
|
||||
#
|
||||
# This special exception to the GPL applies to versions of the Autoconf
|
||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
||||
# modified version of the Autoconf Macro, you may extend this special
|
||||
# exception to the GPL to apply to your modified version as well.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||
[AS_VAR_SET(CACHEVAR,[no])])
|
||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||
AS_VAR_IF(CACHEVAR,yes,
|
||||
[m4_default([$2], :)],
|
||||
[m4_default([$3], :)])
|
||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||
])dnl AX_CHECK_COMPILE_FLAGS
|
55
openbsc/.gitignore
vendored
55
openbsc/.gitignore
vendored
@@ -1,55 +0,0 @@
|
||||
*.o
|
||||
*.a
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
bscconfig.h
|
||||
bscconfig.h.in
|
||||
openbsc.pc
|
||||
src/osmo-nitb/osmo-nitb
|
||||
bsc_mgcp
|
||||
src/osmo-bsc/osmo-bsc
|
||||
*.*~
|
||||
*.sw?
|
||||
|
||||
#configure
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
stamp-h1
|
||||
|
||||
# git-version-gen magic
|
||||
.tarball-version
|
||||
.version
|
||||
|
||||
|
||||
# apps and app data
|
||||
hlr.sqlite3
|
||||
src/utils/bs11_config
|
||||
src/ipaccess/ipaccess-config
|
||||
src/ipaccess/ipaccess-find
|
||||
src/ipaccess/ipaccess-firmware
|
||||
src/ipaccess/ipaccess-proxy
|
||||
src/utils/isdnsync
|
||||
src/nat/bsc_nat
|
||||
src/gprs/osmo-sgsn
|
||||
src/gprs/osmo-gbproxy
|
||||
src/osmo-bsc_nat/osmo-bsc_nat
|
||||
|
||||
#tests
|
||||
tests/bsc-nat/bsc_nat_test
|
||||
tests/channel/channel_test
|
||||
tests/db/db_test
|
||||
tests/debug/debug_test
|
||||
tests/gsm0408/gsm0408_test
|
||||
tests/mgcp/mgcp_test
|
||||
tests/sccp/sccp_test
|
||||
tests/sms/sms_test
|
||||
tests/timer/timer_test
|
||||
|
||||
src/openbsc.cfg*
|
@@ -1,14 +0,0 @@
|
||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
||||
|
||||
INCLUDES = $(all_includes) -I$(top_srcdir)/include
|
||||
SUBDIRS = doc include src tests
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = openbsc.pc
|
||||
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
EXTRA_DIST = git-version-gen
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
@@ -1,32 +0,0 @@
|
||||
About OpenBSC
|
||||
=============
|
||||
|
||||
OpenBSC is a minimalistic implementation of the GSM Network, with
|
||||
particular emphasis on the functionality typically provided by the BSC,
|
||||
MSC, HLR, VLR and SMSC.
|
||||
|
||||
Its currently supported interfaces towards the BTS are:
|
||||
|
||||
* Classic A-bis over E1 using a mISDN based E1 interface. In other
|
||||
words, you can connect existing GSM Base Transceiver Station (BTS)
|
||||
through E1 to OpenBSC. So far, we have only tested the Siemens BS-11
|
||||
Test reports with other BTS are much appreciated!
|
||||
|
||||
* A-bis over IP as used by the ip.access nanoBTS product family
|
||||
|
||||
You can find the project documentation at http://openbsc.gnumonks.org/
|
||||
|
||||
This project is still in its early days, and there are lots of areas where it
|
||||
doesn't behave as per GSM spec.
|
||||
|
||||
Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
|
||||
libosmocore
|
||||
===========
|
||||
|
||||
Please note that as of March 2010, OpenBSC has a dependency to a library
|
||||
called "libosmocore". You can obtain that library from
|
||||
|
||||
git://git.osmocom.org/libosmocore.git
|
||||
|
@@ -1,116 +0,0 @@
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
AC_INIT([openbsc],
|
||||
m4_esyscmd([./git-version-gen .tarball-version]),
|
||||
[openbsc-devel@lists.openbsc.org])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
|
||||
dnl kernel style compile messages
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
dnl checks for programs
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_RANLIB
|
||||
|
||||
dnl checks for libraries
|
||||
AC_SEARCH_LIBS(crypt, crypt,
|
||||
[LIBCRYPT="-lcrypt"; AC_DEFINE([VTY_CRYPT_PW], [], [Use crypt functionality of vty.])])
|
||||
AC_SEARCH_LIBS(gtp_new, gtp,
|
||||
[LIBCRYPT="-lgtp"; AC_SUBST([GPRS_LIBGTP], [1])])
|
||||
|
||||
AM_CONDITIONAL(HAVE_LIBGTP, test "x$GPRS_LIBGTP" != "x")
|
||||
|
||||
|
||||
AC_ARG_ENABLE([nat], [AS_HELP_STRING([--enable-nat], [Build the BSC NAT. Requires SCCP])],
|
||||
[
|
||||
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.2)
|
||||
osmo_ac_build_nat="yes"
|
||||
],
|
||||
[
|
||||
osmo_ac_build_nat="no"
|
||||
])
|
||||
AM_CONDITIONAL(BUILD_NAT, test "x$osmo_ac_build_nat" = "xyes")
|
||||
|
||||
AC_ARG_ENABLE([osmo-bsc], [AS_HELP_STRING([--enable-osmo-bsc], [Build the Osmo BSC])],
|
||||
[
|
||||
PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.0.6)
|
||||
osmo_ac_build_bsc="yes"
|
||||
],
|
||||
[
|
||||
osmo_ac_build_bsc="no"
|
||||
])
|
||||
AM_CONDITIONAL(BUILD_BSC, test "x$osmo_ac_build_bsc" = "xyes")
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.2)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.3.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.0.2)
|
||||
|
||||
dnl checks for header files
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built))
|
||||
AC_CHECK_HEADERS(dbi/dbd.h,,AC_MSG_ERROR(DBI library is not installed))
|
||||
|
||||
|
||||
dnl Checks for typedefs, structures and compiler characteristics
|
||||
|
||||
# The following test is taken from WebKit's webkit.m4
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fvisibility=hidden "
|
||||
AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
SYMBOL_VISIBILITY="-fvisibility=hidden"],
|
||||
AC_MSG_RESULT([no]))
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
AC_SUBST(SYMBOL_VISIBILITY)
|
||||
|
||||
# Coverage build taken from WebKit's configure.in
|
||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||
AC_ARG_ENABLE(coverage,
|
||||
AC_HELP_STRING([--enable-coverage],
|
||||
[enable code coverage support [default=no]]),
|
||||
[],[enable_coverage="no"])
|
||||
AC_MSG_RESULT([$enable_coverage])
|
||||
if test "$enable_coverage" = "yes"; then
|
||||
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
AC_SUBST([COVERAGE_CFLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS])
|
||||
fi
|
||||
|
||||
|
||||
dnl Generate the output
|
||||
AM_CONFIG_HEADER(bscconfig.h)
|
||||
|
||||
AC_OUTPUT(
|
||||
openbsc.pc
|
||||
include/openbsc/Makefile
|
||||
include/Makefile
|
||||
src/Makefile
|
||||
src/libtrau/Makefile
|
||||
src/libbsc/Makefile
|
||||
src/libctrl/Makefile
|
||||
src/libmsc/Makefile
|
||||
src/libmgcp/Makefile
|
||||
src/libcommon/Makefile
|
||||
src/osmo-nitb/Makefile
|
||||
src/osmo-bsc/Makefile
|
||||
src/osmo-bsc_nat/Makefile
|
||||
src/osmo-bsc_mgcp/Makefile
|
||||
src/ipaccess/Makefile
|
||||
src/utils/Makefile
|
||||
src/libgb/Makefile
|
||||
src/gprs/Makefile
|
||||
tests/Makefile
|
||||
tests/debug/Makefile
|
||||
tests/gsm0408/Makefile
|
||||
tests/db/Makefile
|
||||
tests/channel/Makefile
|
||||
tests/bsc-nat/Makefile
|
||||
tests/mgcp/Makefile
|
||||
doc/Makefile
|
||||
doc/examples/Makefile
|
||||
Makefile)
|
@@ -1,170 +0,0 @@
|
||||
-- Split trace based on SCCP Source
|
||||
-- There are still bugs to find... bugs bugs bugs... hmm
|
||||
do
|
||||
local function init_listener()
|
||||
print("CREATED LISTENER")
|
||||
local tap = Listener.new("ip", "sccp && (ip.src == 172.16.1.81 || ip.dst == 172.16.1.81)")
|
||||
local sccp_type_field = Field.new("sccp.message_type")
|
||||
local sccp_src_field = Field.new("sccp.slr")
|
||||
local sccp_dst_field = Field.new("sccp.dlr")
|
||||
local msg_type_field = Field.new("gsm_a.dtap_msg_mm_type")
|
||||
local lu_rej_field = Field.new("gsm_a.dtap.rej_cause")
|
||||
local ip_src_field = Field.new("ip.src")
|
||||
local ip_dst_field = Field.new("ip.dst")
|
||||
|
||||
--
|
||||
local bssmap_msgtype_field = Field.new("gsm_a.bssmap_msgtype")
|
||||
-- assignment failure 0x03
|
||||
--
|
||||
|
||||
--
|
||||
local dtap_cause_field = Field.new("gsm_a_dtap.cause")
|
||||
local dtap_cc_field = Field.new("gsm_a.dtap_msg_cc_type")
|
||||
|
||||
local connections = {}
|
||||
|
||||
function check_failure(con)
|
||||
check_lu_reject(con)
|
||||
check_disconnect(con)
|
||||
check_failures(con)
|
||||
end
|
||||
|
||||
-- cipher mode reject
|
||||
function check_failures(con)
|
||||
local msgtype = bssmap_msgtype_field()
|
||||
if not msgtype then
|
||||
return
|
||||
end
|
||||
|
||||
msgtype = tonumber(msgtype)
|
||||
if msgtype == 89 then
|
||||
print("Cipher mode reject")
|
||||
con[4] = true
|
||||
elseif msgtype == 0x03 then
|
||||
print("Assignment failure")
|
||||
con[4] = true
|
||||
elseif msgtype == 0x22 then
|
||||
print("Clear Request... RF failure?")
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- check if a DISCONNECT is normal
|
||||
function check_disconnect(con)
|
||||
local msg_type = dtap_cc_field()
|
||||
if not msg_type then
|
||||
return
|
||||
end
|
||||
|
||||
if tonumber(msg_type) ~= 0x25 then
|
||||
return
|
||||
end
|
||||
|
||||
local cause = dtap_cause_field()
|
||||
if not cause then
|
||||
return
|
||||
end
|
||||
|
||||
cause = tonumber(cause)
|
||||
if cause ~= 0x10 then
|
||||
print("DISCONNECT != Normal")
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- check if we have a LU Reject
|
||||
function check_lu_reject(con)
|
||||
local msg_type = msg_type_field()
|
||||
if not msg_type then
|
||||
return
|
||||
end
|
||||
|
||||
msg_type = tonumber(tostring(msg_type))
|
||||
if msg_type == 0x04 then
|
||||
print("LU REJECT with " .. tostring(lu_rej_field()))
|
||||
con[4] = true
|
||||
end
|
||||
end
|
||||
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local ip_src = tostring(ip_src_field())
|
||||
local ip_dst = tostring(ip_dst_field())
|
||||
local sccp_type = tonumber(tostring(sccp_type_field()))
|
||||
local sccp_src = sccp_src_field()
|
||||
local sccp_dst = sccp_dst_field()
|
||||
|
||||
local con
|
||||
|
||||
if sccp_type == 0x01 then
|
||||
elseif sccp_type == 0x2 then
|
||||
local src = string.format("%s-%s", ip_src, tostring(sccp_src))
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local datestring = os.date("%Y%m%d%H%M%S")
|
||||
local pcap_name = string.format("alink_trace_%s-%s_%s.pcap", src, dst, datestring)
|
||||
local dumper = Dumper.new_for_current(pcap_name)
|
||||
|
||||
local con = { ip_src, tostring(sccp_src), tostring(sccp_dst), false, dumper, pcap_name }
|
||||
|
||||
dumper:dump_current()
|
||||
connections[src] = con
|
||||
connections[dst] = con
|
||||
elseif sccp_type == 0x4 then
|
||||
-- close a connection... remove it from the list
|
||||
local src = string.format("%s-%s", ip_src, tostring(sccp_src))
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
|
||||
local con = connections[src]
|
||||
if not con then
|
||||
return
|
||||
end
|
||||
|
||||
con[5]:dump_current()
|
||||
con[5]:flush()
|
||||
|
||||
-- this causes a crash on unpacted wireshark
|
||||
con[5]:close()
|
||||
|
||||
-- the connection had a failure
|
||||
if con[4] == true then
|
||||
local datestring = os.date("%Y%m%d%H%M%S")
|
||||
local new_name = string.format("alink_failure_%s_%s-%s.pcap", datestring, con[2], con[3])
|
||||
os.rename(con[6], new_name)
|
||||
else
|
||||
os.remove(con[6])
|
||||
end
|
||||
|
||||
|
||||
-- clear the old connection
|
||||
connections[src] = nil
|
||||
connections[dst] = nil
|
||||
|
||||
elseif sccp_type == 0x5 then
|
||||
-- not handled yet... we should verify stuff here...
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local con = connections[dst]
|
||||
if not con then
|
||||
return
|
||||
end
|
||||
con[5]:dump_current()
|
||||
elseif sccp_type == 0x6 then
|
||||
local dst = string.format("%s-%s", ip_dst, tostring(sccp_dst))
|
||||
local con = connections[dst]
|
||||
if not con then
|
||||
print("DON'T KNOW THIS CONNECTION for " .. ip_dst)
|
||||
return
|
||||
end
|
||||
con[5]:dump_current()
|
||||
check_failure(con)
|
||||
end
|
||||
|
||||
end
|
||||
function tap.draw()
|
||||
print("DRAW")
|
||||
end
|
||||
function tap.reset()
|
||||
print("RESET")
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
@@ -1 +0,0 @@
|
||||
Some crazy scripts call testing... and MSC link failure simulation
|
@@ -1,8 +0,0 @@
|
||||
ABORT BUSY
|
||||
ABORT 'NO CARRIER'
|
||||
ABORT 'OK'
|
||||
|
||||
'' AT
|
||||
SAY "Dialing a number\n"
|
||||
'OK' ATD05660066;
|
||||
|
@@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Evil dial script..
|
||||
|
||||
while true;
|
||||
do
|
||||
chat -v -f all_dial < /dev/ttyACM0 > /dev/ttyACM0
|
||||
sleep 5s
|
||||
chat -v -f hangup < /dev/ttyACM0 > /dev/ttyACM0
|
||||
sleep 2s
|
||||
done
|
||||
|
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
sleep 3
|
||||
echo "enable"
|
||||
sleep 1
|
||||
echo "drop bts connection 0 oml"
|
||||
sleep 1
|
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
while true;
|
||||
do
|
||||
echo "Going to drop the OML connection"
|
||||
./drop-oml.sh | telnet 127.0.0.1 4242
|
||||
sleep 58m
|
||||
done
|
@@ -1,4 +0,0 @@
|
||||
TIMEOUT 10
|
||||
'' ^Z
|
||||
SAY "Waiting for hangup confirm\n"
|
||||
'' ATH;
|
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
while true;
|
||||
do
|
||||
echo "Kill the osmo-bsc"
|
||||
/usr/bin/kill -s SIGUSR2 `pidof osmo-bsc`
|
||||
sleep 58s
|
||||
done
|
@@ -1,100 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys,os
|
||||
from optparse import OptionParser
|
||||
import socket
|
||||
import struct
|
||||
|
||||
verbose = False
|
||||
|
||||
def prefix_ipa_ctrl_header(data):
|
||||
return struct.pack(">HBB", len(data)+1, 0xee, 0) + data
|
||||
|
||||
def remove_ipa_ctrl_header(data):
|
||||
if (len(data) < 4):
|
||||
raise BaseException("Answer too short!")
|
||||
(plen, ipa_proto, osmo_proto) = struct.unpack(">HBB", data[:4])
|
||||
if (plen + 3 > len(data)):
|
||||
print "Warning: Wrong payload length (expected %i, got %i)" % (plen, len(data) - 3)
|
||||
if (ipa_proto != 0xee or osmo_proto != 0):
|
||||
raise BaseException("Wrong protocol in answer!")
|
||||
|
||||
return data[4:plen+3], data[plen+3:]
|
||||
|
||||
def connect(host, port):
|
||||
if verbose:
|
||||
print "Connecting to host %s:%i" % (host, port)
|
||||
|
||||
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sck.setblocking(1)
|
||||
sck.connect((host, port))
|
||||
return sck
|
||||
|
||||
def send(sck, data):
|
||||
if verbose:
|
||||
print "Sending \"%s\"" %(data)
|
||||
data = prefix_ipa_ctrl_header(data)
|
||||
sck.send(data)
|
||||
|
||||
def do_set(var, value, id, sck):
|
||||
setmsg = "SET %s %s %s" %(options.id, var, value)
|
||||
send(sck, setmsg)
|
||||
|
||||
def do_get(var, id, sck):
|
||||
getmsg = "GET %s %s" %(options.id, var)
|
||||
send(sck, getmsg)
|
||||
|
||||
parser = OptionParser("Usage: %prog [options] var [value]")
|
||||
parser.add_option("-d", "--host", dest="host",
|
||||
help="connect to HOST", metavar="HOST")
|
||||
parser.add_option("-p", "--port", dest="port", type="int",
|
||||
help="use PORT", metavar="PORT", default=4249)
|
||||
parser.add_option("-g", "--get", action="store_true",
|
||||
dest="cmd_get", help="perform GET operation")
|
||||
parser.add_option("-s", "--set", action="store_true",
|
||||
dest="cmd_set", help="perform SET operation")
|
||||
parser.add_option("-i", "--id", dest="id", default="1",
|
||||
help="set id manually", metavar="ID")
|
||||
parser.add_option("-v", "--verbose", action="store_true",
|
||||
dest="verbose", help="be verbose", default=False)
|
||||
parser.add_option("-m", "--monitor", action="store_true",
|
||||
dest="monitor", help="monitor the connection for traps", default=False)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
verbose = options.verbose
|
||||
|
||||
if options.cmd_set and options.cmd_get:
|
||||
parser.error("Get and set options are mutually exclusive!")
|
||||
|
||||
if not (options.cmd_get or options.cmd_set or options.monitor):
|
||||
parser.error("One of -m, -g, or -s must be set")
|
||||
|
||||
if not (options.host):
|
||||
parser.error("Destination host and port required!")
|
||||
|
||||
sock = connect(options.host, options.port)
|
||||
|
||||
if options.cmd_set:
|
||||
if len(args) < 2:
|
||||
parser.error("Set requires var and value arguments")
|
||||
do_set(args[0], ' '.join(args[1:]), options.id, sock)
|
||||
|
||||
if options.cmd_get:
|
||||
if len(args) != 1:
|
||||
parser.error("Get requires the var argument")
|
||||
do_get(args[0], options.id, sock)
|
||||
|
||||
data = sock.recv(1024)
|
||||
while (len(data)>0):
|
||||
(answer, data) = remove_ipa_ctrl_header(data)
|
||||
print "Got message:", answer
|
||||
|
||||
if options.monitor:
|
||||
while (True):
|
||||
data = sock.recv(1024)
|
||||
while (len(data)>0):
|
||||
(answer, data) = remove_ipa_ctrl_header(data)
|
||||
print "Got message:", answer
|
||||
|
||||
sock.close()
|
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
|
||||
f = open("unbalanced")
|
||||
lines = []
|
||||
for line in f:
|
||||
lines.append(line)
|
||||
|
||||
filenames = {}
|
||||
|
||||
output = []
|
||||
for line in lines:
|
||||
if "[0x" in line:
|
||||
start = line.find("[")
|
||||
end = line.find("]")
|
||||
addr = line[start+1:end]
|
||||
try:
|
||||
file = filenames[addr]
|
||||
except KeyError:
|
||||
r = os.popen("addr2line -fs -e ./bsc_hack %s" % addr)
|
||||
all = r.read().replace("\n", ",")
|
||||
file = all
|
||||
filenames[addr] = file
|
||||
|
||||
line = line.replace(addr, file)
|
||||
output.append(line)
|
||||
|
||||
g = open("unbalanced.2", "w")
|
||||
g.write("".join(output))
|
||||
|
||||
|
||||
|
@@ -1,37 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# Convert ETSI documents to an enum
|
||||
#
|
||||
|
||||
import re, sys
|
||||
|
||||
def convert(string):
|
||||
string = string.strip().replace(" ", "").rjust(8, "0")
|
||||
var = 0
|
||||
offset = 7
|
||||
for char in string:
|
||||
assert offset >= 0
|
||||
var = var | (int(char) << offset)
|
||||
offset = offset - 1
|
||||
|
||||
return var
|
||||
|
||||
def string(name):
|
||||
name = name.replace(" ", "_")
|
||||
name = name.replace('"', "")
|
||||
name = name.replace('/', '_')
|
||||
name = name.replace('(', '_')
|
||||
name = name.replace(')', '_')
|
||||
return "%s_%s" % (sys.argv[2], name.upper())
|
||||
|
||||
file = open(sys.argv[1])
|
||||
|
||||
|
||||
for line in file:
|
||||
m = re.match(r"[ \t]*(?P<value>[01 ]+)[ ]+(?P<name>[a-zA-Z /0-9()]+)", line[:-1])
|
||||
|
||||
if m:
|
||||
print "\t%s\t\t= %d," % (string(m.groupdict()["name"]), convert(m.groupdict()["value"]))
|
||||
else:
|
||||
print line[:-1]
|
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""
|
||||
demonstrate a unblock bug on the GB Proxy..
|
||||
"""
|
||||
|
||||
bts_ns_reset = "\x02\x00\x81\x01\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
|
||||
ns_reset_ack = "\x03\x01\x82\x1f\xe7\x04\x82\x1f\xe7"
|
||||
|
||||
bts_ns_unblock = "\x06"
|
||||
ns_unblock_ack = "\x07"
|
||||
|
||||
bts_bvc_reset_0 = "\x00\x00\x00\x00\x22\x04\x82\x00\x00\x07\x81\x03\x3b\x81\x02"
|
||||
ns_bvc_reset_0_ack = "\x00\x00\x00\x00\x23\x04\x82\x00\x00"
|
||||
|
||||
bts_bvc_reset_8167 = "\x00\x00\x00\x00\x22\x04\x82\x1f\xe7\x07\x81\x08\x08\x88\x72\xf4\x80\x10\x1c\x00\x9c\x40"
|
||||
|
||||
|
||||
import socket
|
||||
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
socket.bind(("0.0.0.0", 0))
|
||||
socket.setblocking(1)
|
||||
|
||||
|
||||
import sys
|
||||
port = int(sys.argv[1])
|
||||
print "Sending data to port: %d" % port
|
||||
|
||||
def send_and_receive(packet):
|
||||
socket.sendto(packet, ("127.0.0.1", port))
|
||||
|
||||
try:
|
||||
data, addr = socket.recvfrom(4096)
|
||||
except socket.error, e:
|
||||
print "ERROR", e
|
||||
import sys
|
||||
sys.exit(0)
|
||||
return data
|
||||
|
||||
#send stuff once
|
||||
|
||||
to_send = [
|
||||
(bts_ns_reset, ns_reset_ack, "reset ack"),
|
||||
(bts_ns_unblock, ns_unblock_ack, "unblock ack"),
|
||||
(bts_bvc_reset_0, ns_bvc_reset_0_ack, "BVCI=0 reset ack"),
|
||||
]
|
||||
|
||||
|
||||
for (out, inp, type) in to_send:
|
||||
res = send_and_receive(out)
|
||||
if res != inp:
|
||||
print "Failed to get the %s" % type
|
||||
sys.exit(-1)
|
||||
|
||||
import time
|
||||
time.sleep(3)
|
||||
res = send_and_receive(bts_bvc_reset_8167)
|
||||
print "Sent all messages... check wireshark for the last response"
|
@@ -1,78 +0,0 @@
|
||||
-- Simple LUA script to print the size of BSSGP messages over their type...
|
||||
|
||||
do
|
||||
local ip_bucket = {}
|
||||
|
||||
local pdu_types = {}
|
||||
pdu_types[ 6] = "PAGING"
|
||||
pdu_types[11] = "SUSPEND"
|
||||
pdu_types[12] = "SUSPEND-ACK"
|
||||
pdu_types[32] = "BVC-BLOCK"
|
||||
pdu_types[33] = "BVC-BLOCK-ACK"
|
||||
pdu_types[34] = "BVC-RESET"
|
||||
pdu_types[35] = "BVC-RESET-ACK"
|
||||
pdu_types[36] = "UNBLOCK"
|
||||
pdu_types[37] = "UNBLOCK-ACK"
|
||||
pdu_types[38] = "FLOW-CONTROL-BVC"
|
||||
pdu_types[39] = "FLOW-CONTROL-BVC-ACK"
|
||||
pdu_types[40] = "FLOW-CONTROL-MS"
|
||||
pdu_types[41] = "FLOW-CONTROL-MS-ACK"
|
||||
pdu_types[44] = "LLC-DISCARDED"
|
||||
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- bssgp filters
|
||||
local bssgp_pdu_get = Field.new("bssgp.pdu_type")
|
||||
local udp_length_get = Field.new("udp.length")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local pdu = bssgp_pdu_get()
|
||||
local len = udp_length_get()
|
||||
|
||||
-- only handle bssgp, but we also want the IP frame
|
||||
if not pdu then
|
||||
return
|
||||
end
|
||||
|
||||
pdu = tostring(pdu)
|
||||
if tonumber(pdu) == 0 or tonumber(pdu) == 1 then
|
||||
return
|
||||
end
|
||||
|
||||
local ip_src = tostring(ip.ip_src)
|
||||
local bssgp_histo = ip_bucket[ip_src]
|
||||
if not bssgp_histo then
|
||||
bssgp_histo = {}
|
||||
ip_bucket[ip_src] = bssgp_histo
|
||||
end
|
||||
|
||||
local key = pdu
|
||||
local bucket = bssgp_histo[key]
|
||||
if not bucket then
|
||||
bucket = {}
|
||||
bssgp_histo[key] = bucket
|
||||
end
|
||||
|
||||
table.insert(bucket, tostring(len))
|
||||
print("IP: " .. ip_src .. " PDU: " .. pdu_types[tonumber(pdu)] .. " Length: " .. tostring(len))
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
-- well... this will not be called...
|
||||
-- for ip,bssgp_histo in pairs(dumpers) do
|
||||
-- print("IP " .. ip)
|
||||
-- end
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
-- well... this will not be called...
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
@@ -1,80 +0,0 @@
|
||||
-- I count the buffer space needed for LLC PDUs in the worse case and print it
|
||||
|
||||
do
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- bssgp filters
|
||||
local bssgp_pdu_get = Field.new("bssgp.pdu_type")
|
||||
local bssgp_delay_get = Field.new("bssgp.delay_val")
|
||||
local llcgprs_get = Field.new("llcgprs")
|
||||
local pdus = nil
|
||||
|
||||
print("START...")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000 && bssgp.pdu_type == 0")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local pdu = bssgp_pdu_get()
|
||||
local len = llcgprs_get().len
|
||||
local delay = bssgp_delay_get()
|
||||
|
||||
-- only handle bssgp, but we also want the IP frame
|
||||
if not pdu then
|
||||
return
|
||||
end
|
||||
|
||||
if tonumber(tostring(delay)) == 65535 then
|
||||
pdus = { next = pdus,
|
||||
len = len,
|
||||
expires = -1 }
|
||||
else
|
||||
local off = tonumber(tostring(delay)) / 100.0
|
||||
pdus = { next = pdus,
|
||||
len = len,
|
||||
expires = pinfo.rel_ts + off }
|
||||
end
|
||||
local now_time = tonumber(tostring(pinfo.rel_ts))
|
||||
local now_size = 0
|
||||
local l = pdus
|
||||
local prev = nil
|
||||
local count = 0
|
||||
while l do
|
||||
if now_time < l.expires or l.expires == -1 then
|
||||
now_size = now_size + l.len
|
||||
prev = l
|
||||
l = l.next
|
||||
count = count + 1
|
||||
else
|
||||
-- delete things
|
||||
if prev == nil then
|
||||
pdus = nil
|
||||
l = nil
|
||||
else
|
||||
prev.next = l.next
|
||||
l = l.next
|
||||
end
|
||||
end
|
||||
end
|
||||
-- print("TOTAL: " .. now_time .. " PDU_SIZE: " .. now_size)
|
||||
print(now_time .. " " .. now_size / 1024.0 .. " " .. count)
|
||||
-- print("NOW: " .. tostring(pinfo.rel_ts) .. " Delay: " .. tostring(delay) .. " Length: " .. tostring(len))
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
-- well... this will not be called...
|
||||
-- for ip,bssgp_histo in pairs(dumpers) do
|
||||
-- print("IP " .. ip)
|
||||
-- end
|
||||
print("END")
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
-- well... this will not be called...
|
||||
end
|
||||
end
|
||||
|
||||
init_listener()
|
||||
end
|
@@ -1,46 +0,0 @@
|
||||
-- Create a file named by_ip/''ip_addess''.cap with all ip traffic of each ip host. (works for tshark only)
|
||||
-- Dump files are created for both source and destination hosts
|
||||
do
|
||||
local dir = "by_tlli"
|
||||
local dumpers = {}
|
||||
local function init_listener()
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
local field_tlli = Field.new("bssgp.tlli")
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
|
||||
-- we will be called once for every IP Header.
|
||||
-- If there's more than one IP header in a given packet we'll dump the packet once per every header
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local tlli = field_tlli()
|
||||
if not tlli then
|
||||
return
|
||||
end
|
||||
|
||||
local tlli_str = tostring(tlli)
|
||||
tlli_dmp = dumpers[tlli_str]
|
||||
if not tlli_dmp then
|
||||
local tlli_hex = string.format("0x%x", tonumber(tlli_str))
|
||||
print("Creating dump for TLLI " .. tlli_hex)
|
||||
tlli_dmp = Dumper.new_for_current(dir .. "/" .. tlli_hex .. ".pcap")
|
||||
dumpers[tlli_str] = tlli_dmp
|
||||
end
|
||||
tlli_dmp:dump_current()
|
||||
tlli_dmp:flush()
|
||||
end
|
||||
function tap.draw()
|
||||
for tlli,dumper in pairs(dumpers) do
|
||||
dumper:flush()
|
||||
end
|
||||
end
|
||||
function tap.reset()
|
||||
for tlli,dumper in pairs(dumpers) do
|
||||
dumper:close()
|
||||
end
|
||||
dumpers = {}
|
||||
end
|
||||
end
|
||||
init_listener()
|
||||
end
|
@@ -1,59 +0,0 @@
|
||||
-- This script verifies that the N(U) is increasing...
|
||||
--
|
||||
do
|
||||
local nu_state_src = {}
|
||||
|
||||
local function init_listener()
|
||||
-- handle the port as NS over IP
|
||||
local udp_port_table = DissectorTable.get("udp.port")
|
||||
local gprs_ns_dis = Dissector.get("gprs_ns")
|
||||
udp_port_table:add(23000,gprs_ns_dis)
|
||||
|
||||
-- we want to look here...
|
||||
local llc_sapi_get = Field.new("llcgprs.sapib")
|
||||
local llc_nu_get = Field.new("llcgprs.nu")
|
||||
local bssgp_tlli_get = Field.new("bssgp.tlli")
|
||||
|
||||
local tap = Listener.new("ip", "udp.port == 23000")
|
||||
function tap.packet(pinfo,tvb,ip)
|
||||
local llc_sapi = llc_sapi_get()
|
||||
local llc_nu = llc_nu_get()
|
||||
local bssgp_tlli = bssgp_tlli_get()
|
||||
|
||||
if not llc_sapi or not llc_nu or not bssgp_tlli then
|
||||
return
|
||||
end
|
||||
|
||||
local ip_src = tostring(ip.ip_src)
|
||||
local bssgp_tlli = tostring(bssgp_tlli)
|
||||
local llc_nu = tostring(llc_nu)
|
||||
local llc_sapi = tostring(llc_sapi)
|
||||
|
||||
local src_key = ip_src .. "-" .. bssgp_tlli .. "-" .. llc_sapi
|
||||
local last_nu = nu_state_src[src_key]
|
||||
if not last_nu then
|
||||
-- print("Establishing mapping for " .. src_key)
|
||||
nu_state_src[src_key] = llc_nu
|
||||
return
|
||||
end
|
||||
|
||||
local function tohex(number)
|
||||
return string.format("0x%x", tonumber(number))
|
||||
end
|
||||
|
||||
nu_state_src[src_key] = llc_nu
|
||||
if tonumber(last_nu) + 1 ~= tonumber(llc_nu) then
|
||||
print("JUMP in N(U) on TLLI " .. tohex(bssgp_tlli) .. " and SAPI: " .. llc_sapi .. " src: " .. ip_src)
|
||||
print("\t last: " .. last_nu .. " now: " .. llc_nu)
|
||||
end
|
||||
end
|
||||
|
||||
function tap.draw()
|
||||
end
|
||||
|
||||
function tap.reset()
|
||||
end
|
||||
end
|
||||
init_listener()
|
||||
end
|
||||
|
@@ -1,30 +0,0 @@
|
||||
/* make test_regexp */
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
regex_t reg;
|
||||
regmatch_t matches[2];
|
||||
|
||||
if (argc != 4) {
|
||||
printf("Invoke with: test_regexp REGEXP REPLACE NR\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (regcomp(®, argv[1], REG_EXTENDED) != 0) {
|
||||
fprintf(stderr, "Regexp '%s' is not valid.\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (regexec(®, argv[3], 2, matches, 0) == 0 && matches[1].rm_eo != -1)
|
||||
printf("New Number: %s%s\n", argv[2], &argv[3][matches[1].rm_so]);
|
||||
else
|
||||
printf("No match.\n");
|
||||
|
||||
regfree(®);
|
||||
|
||||
return 0;
|
||||
}
|
@@ -1,66 +0,0 @@
|
||||
"I create output for some simple SQL statements for the HLR db"
|
||||
|
||||
|
||||
Eval [
|
||||
|
||||
"Create tables if they don't exist"
|
||||
Transcript show: 'CREATE TABLE SMS (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
created TIMESTAMP NOT NULL,
|
||||
sent TIMESTAMP,
|
||||
sender_id INTEGER NOT NULL,
|
||||
receiver_id INTEGER NOT NULL,
|
||||
deliver_attempts INTEGER NOT NULL DEFAULT 0,
|
||||
valid_until TIMESTAMP,
|
||||
reply_path_req INTEGER NOT NULL,
|
||||
status_rep_req INTEGER NOT NULL,
|
||||
protocol_id INTEGER NOT NULL,
|
||||
data_coding_scheme INTEGER NOT NULL,
|
||||
ud_hdr_ind INTEGER NOT NULL,
|
||||
dest_addr TEXT,
|
||||
user_data BLOB,
|
||||
header BLOB,
|
||||
text TEXT);'; nl;
|
||||
show: 'CREATE TABLE Subscriber (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
created TIMESTAMP NOT NULL,
|
||||
updated TIMESTAMP NOT NULL,
|
||||
imsi NUMERIC UNIQUE NOT NULL,
|
||||
name TEXT,
|
||||
extension TEXT UNIQUE,
|
||||
authorized INTEGER NOT NULL DEFAULT 0,
|
||||
tmsi TEXT UNIQUE,
|
||||
lac INTEGER NOT NULL DEFAULT 0);'; nl.
|
||||
|
||||
"Create some dummy subscribers"
|
||||
num_sub := 1000.
|
||||
num_sms := 30.
|
||||
lac := 1.
|
||||
|
||||
Transcript show: 'BEGIN;'; nl.
|
||||
|
||||
1 to: num_sub do: [:each |
|
||||
Transcript show: 'INSERT INTO Subscriber
|
||||
(imsi, created, updated, authorized, lac, extension)
|
||||
VALUES
|
||||
(%1, datetime(''now''), datetime(''now''), 1, %2, %3);' %
|
||||
{(274090000000000 + each). lac. each}; nl.
|
||||
].
|
||||
|
||||
1 to: num_sms do: [:sms |
|
||||
1 to: num_sub do: [:sub |
|
||||
Transcript show: 'INSERT INTO SMS
|
||||
(created, sender_id, receiver_id, valid_until,
|
||||
reply_path_req, status_rep_req, protocol_id,
|
||||
data_coding_scheme, ud_hdr_ind, dest_addr,
|
||||
text) VALUES
|
||||
(datetime(''now''), 1, %1, ''2222-2-2'',
|
||||
0, 0, 0,
|
||||
0, 0, ''123456'',
|
||||
''abc'');' % {sub}; nl.
|
||||
]
|
||||
].
|
||||
|
||||
Transcript show: 'COMMIT;'; nl.
|
||||
|
||||
]
|
@@ -1,10 +0,0 @@
|
||||
"Query for one SMS"
|
||||
|
||||
Eval [
|
||||
1 to: 100 do: [:each |
|
||||
Transcript show: 'SELECT SMS.* FROM SMS
|
||||
JOIN Subscriber ON SMS.receiver_id = Subscriber.id
|
||||
WHERE SMS.id >= 1 AND SMS.sent IS NULL AND Subscriber.lac > 0
|
||||
ORDER BY SMS.id LIMIT 1;'; nl.
|
||||
].
|
||||
]
|
@@ -1,5 +0,0 @@
|
||||
probe process("/usr/lib/libsqlite3.so.0.8.6").function("sqlite3_get_table")
|
||||
{
|
||||
a = user_string($zSql);
|
||||
printf("sqlite3_get_table called '%s'\n", a);
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
openbsc (0.9.13.115.eb113-1) natty; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Wed, 11 May 2011 18:41:24 +0000
|
||||
|
||||
openbsc (0.9.4-1) unstable; urgency=low
|
||||
|
||||
* Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Tue, 24 Aug 2010 13:34:24 +0200
|
@@ -1 +0,0 @@
|
||||
7
|
@@ -1,44 +0,0 @@
|
||||
Source: openbsc
|
||||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Harald Welte <laforge@gnumonks.org>
|
||||
Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp, libosmocore-dev, libosmo-sccp-dev, libdbi0-dev
|
||||
Standards-Version: 3.8.4
|
||||
Homepage: http://openbsc.osmocom.org/
|
||||
Vcs-Git: git://bs11-abis.gnumonks.org/openbsc.git
|
||||
Vcs-Browser: http://openbsc.osmocom.org/trac/browser
|
||||
|
||||
Package: osmocom-bsc
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libosmo-sccp
|
||||
Description: GSM Base Station Controller; BSC-only version of OpenBSC. Needs a real MSC!
|
||||
|
||||
Package: osmocom-nitb
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libdbd-sqlite3, libdbi0
|
||||
Description: GSM Network-in-a-Box, implements BSC, MSC, SMSC, HLR, VLR
|
||||
|
||||
Package: osmocom-ipaccess-utils
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||
Description: Command line utilities for ip.access nanoBTS
|
||||
|
||||
Package: osmocom-bs11-utils
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||
Description: Command line utilities for Siemens BS-11 BTS
|
||||
|
||||
Package: osmocom-sgsn
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore, libgtp
|
||||
Description: Osmocom Serving GPRS Support Node
|
||||
|
||||
Package: osmocom-gbproxy
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||
Description: Osmocom GPRS Gb Interface Proxy
|
||||
|
||||
Package: osmocom-bsc-nat
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libosmocore
|
||||
Description: Osmocom Base Station Controller Network Address Translation
|
@@ -1,50 +0,0 @@
|
||||
This work was packaged for Debian by:
|
||||
|
||||
Harald Welte <laforge@gnumonks.org> on Tue, 24 Aug 2010 10:55:04 +0200
|
||||
|
||||
It was downloaded from:
|
||||
|
||||
git://bs11-abis.gnumonks.org/openbsc.git
|
||||
|
||||
Upstream Author(s):
|
||||
|
||||
Harald Welte <laforge@gnumonks.org>
|
||||
Dieter Spaar <spaar@mirider.augusta.de>
|
||||
Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
Sylvain Munaut <tnt@246tNt.com>
|
||||
Daniel Willmann <daniel@totalueberwachung.de>
|
||||
Jan Luebbe <jluebbe@debian.org>
|
||||
Mike Haben <michael.haben@btinternet.com>
|
||||
Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||
|
||||
Copyright:
|
||||
|
||||
Copyright (C) 2008-2010 Harald Welte <laforge@gnumonks.org>
|
||||
Copyright (C) 2008-2009 Dieter Spaar <spaar@mirider.augusta.de>
|
||||
Copyright (C) 2008-2010 Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
|
||||
Copyright (C) 2009-2010 On-Waves
|
||||
Copyright (C) 2008 Daniel Willmann <daniel@totalueberwachung.de>
|
||||
Copyright (C) 2008 Jan Luebbe <jluebbe@debian.org>
|
||||
Copyright (C) 2009 by Mike Haben <michael.haben@btinternet.com>
|
||||
Copyright (C) 2009 Andreas Eversberg <Andreas.Eversberg@versatel.de>
|
||||
|
||||
License:
|
||||
|
||||
GNU General Public License, Version 2 or later
|
||||
|
||||
The Debian packaging is:
|
||||
|
||||
Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
|
||||
|
||||
# Please chose a license for your packaging work. If the program you package
|
||||
# uses a mainstream license, using the same license is the safest choice.
|
||||
# Please avoid to pick license terms that are more restrictive than the
|
||||
# packaged work, as it may make Debian's contributions unacceptable upstream.
|
||||
# If you just want it to be GPL version 3, leave the following lines in.
|
||||
|
||||
and is licensed under the GPL version 3,
|
||||
see "/usr/share/common-licenses/GPL-3".
|
||||
|
||||
# Please also look if there are files or directories which have a
|
||||
# different copyright/license attached and list them here.
|
@@ -1 +0,0 @@
|
||||
README
|
@@ -1,2 +0,0 @@
|
||||
/usr/bin/bs11_config
|
||||
/usr/bin/isdnsync
|
@@ -1 +0,0 @@
|
||||
/usr/bin/osmo-bsc_nat
|
@@ -1 +0,0 @@
|
||||
doc/examples/osmo-bsc_mgcp
|
@@ -1,2 +0,0 @@
|
||||
/usr/bin/bsc_mgcp
|
||||
/usr/bin/osmo-bsc
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user