mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-10-23 08:12:01 +00:00
Compare commits
2831 Commits
openbsc/0.
...
cccamp19
Author | SHA1 | Date | |
---|---|---|---|
|
306dc09d37 | ||
|
eb282efa67 | ||
|
02d5c8798b | ||
|
efe3f98ec7 | ||
|
3ebf7e2f05 | ||
|
33826246c5 | ||
|
9ef0c11abd | ||
|
109ff5244e | ||
|
4cf5e71a4b | ||
|
8c6f3141e2 | ||
|
12220eea9c | ||
|
536dff1bb8 | ||
|
ee784f9844 | ||
|
740af6ed44 | ||
|
782d607962 | ||
|
50e52e45f9 | ||
|
a2d10216ea | ||
|
f54eb96338 | ||
|
a2b1c5e6f6 | ||
|
c5c1430a1c | ||
|
f7de9aea7b | ||
|
199c5e965e | ||
|
06a49fc04b | ||
|
6349bd422a | ||
|
796a4a1325 | ||
|
2cf6652ba2 | ||
|
9b508f6b53 | ||
|
6e26c70f46 | ||
|
9a34592c09 | ||
|
7eb6f2cb56 | ||
|
83fd8a5692 | ||
|
17058484d1 | ||
|
166077ea48 | ||
|
0c6c3c1da6 | ||
|
fe9a1fe03b | ||
|
1e4a34d45e | ||
|
189f29e939 | ||
|
d2ce444008 | ||
|
ef9420adf5 | ||
|
cb96e05a91 | ||
|
f6387dc766 | ||
|
1b1d7ed98f | ||
|
df7d97e4b4 | ||
|
85978dadab | ||
|
9aaaab6b3b | ||
|
c1ad553d86 | ||
|
c1bf4694e7 | ||
|
1442c5a99e | ||
|
dac2ca7e21 | ||
|
375252279c | ||
|
295570c631 | ||
|
a93c6e9263 | ||
|
30907dc9d8 | ||
|
14f8a08f44 | ||
|
c63f15a9a7 | ||
|
ca538fc5eb | ||
|
6be2c49538 | ||
|
91088c305f | ||
|
900cd6518a | ||
|
fa810e8ccd | ||
|
497611ae84 | ||
|
2b89617aad | ||
|
b542b0457b | ||
|
120568651a | ||
|
f1d301a9a6 | ||
|
c9a6280c94 | ||
|
b5583cde41 | ||
|
6c1cd63a57 | ||
|
0d7ba56f5c | ||
|
3ac604e3ad | ||
|
9fb8ddf00e | ||
|
182ca3bad4 | ||
|
f027f17dcb | ||
|
ac772d8b0c | ||
|
9d9f44ac71 | ||
|
84274e4e9b | ||
|
c5479fe086 | ||
|
538d2c53d9 | ||
|
8de58e79b8 | ||
|
5e8d7995d1 | ||
|
3239f6212e | ||
|
209eb9f103 | ||
|
ef6304e4a1 | ||
|
21cdbfc196 | ||
|
fc8067348b | ||
|
9f11dc5616 | ||
|
ca0818c760 | ||
|
c12bfb7ffc | ||
|
228e591589 | ||
|
58128258b0 | ||
|
e7ae69a7be | ||
|
7e37ce6008 | ||
|
dbe09dd515 | ||
|
217d31d62f | ||
|
47642f245d | ||
|
cb760bdebe | ||
|
e3f8bca424 | ||
|
9fc8a02196 | ||
|
e36b775eae | ||
|
622dd61764 | ||
|
e81c1176aa | ||
|
ed0c1aa9d5 | ||
|
ac69ea9cdf | ||
|
0a40379214 | ||
|
72bc8da537 | ||
|
c3132fd508 | ||
|
96c3107daf | ||
|
ad21a0e166 | ||
|
32d15cc8ba | ||
|
1fd50e5306 | ||
|
6802374574 | ||
|
82c1d1eb20 | ||
|
5a5169e15c | ||
|
7c0b70a94e | ||
|
ca6a8495e1 | ||
|
c0a2196f91 | ||
|
da026abc27 | ||
|
27780313ac | ||
|
e5ed946bdb | ||
|
c319b79baa | ||
|
2818db8b33 | ||
|
0415de74b8 | ||
|
4075b8805d | ||
|
8ab3fbbaf2 | ||
|
cc39218dce | ||
|
8dbc9ed408 | ||
|
ba25eab0fa | ||
|
aa823bf24b | ||
|
a714abfc91 | ||
|
9270e91c09 | ||
|
b7974e2fa4 | ||
|
1e174875bf | ||
|
c26b665c0c | ||
|
0479b2a15f | ||
|
ff6606cacb | ||
|
407b1f186d | ||
|
de2a4d7c22 | ||
|
48aff62341 | ||
|
852ba86949 | ||
|
662fa421c6 | ||
|
d14163e74f | ||
|
11b4810142 | ||
|
9ecceb651b | ||
|
426a9d9103 | ||
|
17bf603222 | ||
|
bcd52e5724 | ||
|
956242dcec | ||
|
e686675f7d | ||
|
4ca0b0d1fa | ||
|
efd645e5a8 | ||
|
f0504e86b3 | ||
|
e28b673fba | ||
|
a77eade744 | ||
|
6531726a02 | ||
|
31b4729f27 | ||
|
a729db62a9 | ||
|
5336f57f05 | ||
|
eb72ff058f | ||
|
8a91d2c04e | ||
|
55e0dcf254 | ||
|
23e7bf1c00 | ||
|
10d487e13f | ||
|
40f5033cf9 | ||
|
b1bb1fa187 | ||
|
1d121483f6 | ||
|
124441af1f | ||
|
b861db97ea | ||
|
08e07046f9 | ||
|
a5e0cf09a6 | ||
|
f2388eab71 | ||
|
120865833c | ||
|
e6d8e91b3a | ||
|
475f868b7f | ||
|
0063ca2fb0 | ||
|
610fda6108 | ||
|
352eed09ae | ||
|
0a89e92a5e | ||
|
dde80f3f61 | ||
|
9a7ccc3746 | ||
|
910189d0a1 | ||
|
8482e8374c | ||
|
fee4fa9492 | ||
|
4dba769577 | ||
|
da895b1151 | ||
|
a74c0ea2db | ||
|
6a26c16eb0 | ||
|
af8e00ffe8 | ||
|
6931f9a7a4 | ||
|
544448abea | ||
|
e547bdd1ce | ||
|
d1562a7766 | ||
|
304b3eb328 | ||
|
9cd5233609 | ||
|
35a382968c | ||
|
7066af825a | ||
|
acc10353fe | ||
|
bca0ef6cd9 | ||
|
cede2a4b7c | ||
|
337209a6ea | ||
|
56e0443e1c | ||
|
b1a1b4000e | ||
|
8838c62fe9 | ||
|
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 |
63
.gitignore
vendored
Normal file
63
.gitignore
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
debian/*.log
|
||||
*.o
|
||||
*.lo
|
||||
*.a
|
||||
*.la
|
||||
.deps
|
||||
Makefile
|
||||
Makefile.in
|
||||
bscconfig.h
|
||||
bscconfig.h.in
|
||||
src/osmo-mgw/osmo-mgw
|
||||
*.*~
|
||||
*.sw?
|
||||
.libs
|
||||
*.pyc
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.pc
|
||||
|
||||
#configure
|
||||
aclocal.m4
|
||||
autom4te.cache/
|
||||
config.log
|
||||
config.status
|
||||
config.guess
|
||||
config.sub
|
||||
configure
|
||||
compile
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
stamp-h1
|
||||
libtool
|
||||
ltmain.sh
|
||||
m4/*.m4
|
||||
|
||||
# git-version-gen magic
|
||||
.tarball-version
|
||||
.version
|
||||
|
||||
|
||||
#tests
|
||||
tests/testsuite.dir
|
||||
tests/*/*_test
|
||||
|
||||
tests/atconfig
|
||||
tests/atlocal
|
||||
tests/package.m4
|
||||
tests/testsuite
|
||||
tests/testsuite.log
|
||||
|
||||
writtenconfig/
|
||||
|
||||
# manuals
|
||||
doc/manuals/*.html
|
||||
doc/manuals/*.svg
|
||||
doc/manuals/*.pdf
|
||||
doc/manuals/*__*.png
|
||||
doc/manuals/*.check
|
||||
doc/manuals/generated/
|
||||
doc/manuals/osmomsc-usermanual.xml
|
||||
doc/manuals/common
|
||||
doc/manuals/build
|
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>
|
35
Makefile.am
Normal file
35
Makefile.am
Normal file
@@ -0,0 +1,35 @@
|
||||
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
|
||||
|
||||
## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac
|
||||
## remove line below when OE toolchain is updated to version which include those
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
AM_CPPFLAGS = \
|
||||
$(all_includes) \
|
||||
-I$(top_srcdir)/include \
|
||||
$(NULL)
|
||||
|
||||
SUBDIRS = \
|
||||
doc \
|
||||
include \
|
||||
src \
|
||||
tests \
|
||||
contrib \
|
||||
$(NULL)
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = \
|
||||
libosmo-mgcp-client.pc \
|
||||
$(NULL)
|
||||
|
||||
BUILT_SOURCES = $(top_srcdir)/.version
|
||||
EXTRA_DIST = git-version-gen osmoappdesc.py .version
|
||||
|
||||
AM_DISTCHECK_CONFIGURE_FLAGS = \
|
||||
--with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)
|
||||
|
||||
@RELMAKE@
|
||||
|
||||
$(top_srcdir)/.version:
|
||||
echo $(VERSION) > $@-t && mv $@-t $@
|
||||
dist-hook:
|
||||
echo $(VERSION) > $(distdir)/.tarball-version
|
24
README
24
README
@@ -0,0 +1,24 @@
|
||||
About OsmoMGW
|
||||
=============
|
||||
|
||||
OsmoMGW originated from the OpenBSC project, which started as a minimalistic
|
||||
all-in-one implementation of the GSM Network. In 2017, OpenBSC had reached
|
||||
maturity and diversity (including M3UA SIGTRAN and 3G support in the form of
|
||||
IuCS and IuPS interfaces) that naturally lead to a separation of the all-in-one
|
||||
approach to fully independent separate programs as in typical GSM networks.
|
||||
|
||||
OsmoMGW was one of the parts split off from the old openbsc.git. It originated
|
||||
as a solution to merely navigate RTP streams through a NAT, but has since
|
||||
matured to a Media Gateway implementation that is capable of streaming RTP for
|
||||
2G (AoIP) and 3G (IuCS) GSM networks as well as (still not implemented at time
|
||||
of writing) transcoding between TRAU, various RTP payloads and IuUP.
|
||||
|
||||
The OsmoMGW program exposes an MGCP interface towards clients like OsmoMSC and
|
||||
OsmoBSC, and receives and sends RTP streams as configured via MGCP.
|
||||
|
||||
The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
|
||||
in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
|
||||
|
||||
Find OsmoMGW issue tracker and wiki online at
|
||||
https://osmocom.org/projects/osmo-mgw
|
||||
https://osmocom.org/projects/osmo-mgw/wiki
|
||||
|
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
|
204
configure.ac
Normal file
204
configure.ac
Normal file
@@ -0,0 +1,204 @@
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
AC_INIT([osmo-mgw],
|
||||
m4_esyscmd([./git-version-gen .tarball-version]),
|
||||
[openbsc@lists.osmocom.org])
|
||||
|
||||
dnl *This* is the root dir, even if an install-sh exists in ../ or ../../
|
||||
AC_CONFIG_AUX_DIR([.])
|
||||
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
AC_CONFIG_TESTDIR(tests)
|
||||
|
||||
dnl kernel style compile messages
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
dnl include release helper
|
||||
RELMAKE='-include osmo-release.mk'
|
||||
AC_SUBST([RELMAKE])
|
||||
|
||||
dnl checks for programs
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
LT_INIT
|
||||
|
||||
dnl check for pkg-config (explained in detail in libosmocore/configure.ac)
|
||||
AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)
|
||||
if test "x$PKG_CONFIG_INSTALLED" = "xno"; then
|
||||
AC_MSG_WARN([You need to install pkg-config])
|
||||
fi
|
||||
PKG_PROG_PKG_CONFIG([0.20])
|
||||
|
||||
dnl check for AX_CHECK_COMPILE_FLAG
|
||||
m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [
|
||||
AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])
|
||||
])
|
||||
|
||||
dnl checks for libraries
|
||||
AC_SEARCH_LIBS([dlopen], [dl dld], [LIBRARY_DL="$LIBS";LIBS=""])
|
||||
AC_SUBST(LIBRARY_DL)
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.0.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.0.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.0.0)
|
||||
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.6.0)
|
||||
|
||||
AC_ARG_ENABLE(sanitize,
|
||||
[AS_HELP_STRING(
|
||||
[--enable-sanitize],
|
||||
[Compile with address sanitizer enabled],
|
||||
)],
|
||||
[sanitize=$enableval], [sanitize="no"])
|
||||
if test x"$sanitize" = x"yes"
|
||||
then
|
||||
CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"
|
||||
CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(werror,
|
||||
[AS_HELP_STRING(
|
||||
[--enable-werror],
|
||||
[Turn all compiler warnings into errors, with exceptions:
|
||||
a) deprecation (allow upstream to mark deprecation without breaking builds);
|
||||
b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)
|
||||
]
|
||||
)],
|
||||
[werror=$enableval], [werror="no"])
|
||||
if test x"$werror" = x"yes"
|
||||
then
|
||||
WERROR_FLAGS="-Werror"
|
||||
WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"
|
||||
WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"
|
||||
CFLAGS="$CFLAGS $WERROR_FLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"
|
||||
fi
|
||||
|
||||
dnl Checks for typedefs, structures and compiler characteristics
|
||||
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wnull-dereference], [CFLAGS="$CFLAGS -Wnull-dereference"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])
|
||||
|
||||
# Coverage build taken from WebKit's configure.in
|
||||
AC_MSG_CHECKING([whether to enable code coverage support])
|
||||
AC_ARG_ENABLE(coverage,
|
||||
AC_HELP_STRING([--enable-coverage],
|
||||
[enable code coverage support [default=no]]),
|
||||
[],[enable_coverage="no"])
|
||||
AC_MSG_RESULT([$enable_coverage])
|
||||
if test "$enable_coverage" = "yes"; then
|
||||
COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"
|
||||
AC_SUBST([COVERAGE_CFLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([vty_tests],
|
||||
AC_HELP_STRING([--enable-vty-tests],
|
||||
[Include the VTY/CTRL tests in make check (deprecated)
|
||||
[default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
AC_ARG_ENABLE([external_tests],
|
||||
AC_HELP_STRING([--enable-external-tests],
|
||||
[Include the VTY/CTRL tests in make check [default=no]]),
|
||||
[enable_ext_tests="$enableval"],[enable_ext_tests="no"])
|
||||
if test "x$enable_ext_tests" = "xyes" ; then
|
||||
AM_PATH_PYTHON
|
||||
AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)
|
||||
if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then
|
||||
AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING([whether to enable VTY/CTRL tests])
|
||||
AC_MSG_RESULT([$enable_ext_tests])
|
||||
AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")
|
||||
|
||||
# Generate manuals
|
||||
AC_ARG_ENABLE(manuals,
|
||||
[AS_HELP_STRING(
|
||||
[--enable-manuals],
|
||||
[Generate manual PDFs [default=no]],
|
||||
)],
|
||||
[osmo_ac_build_manuals=$enableval], [osmo_ac_build_manuals="no"])
|
||||
AM_CONDITIONAL([BUILD_MANUALS], [test x"$osmo_ac_build_manuals" = x"yes"])
|
||||
AC_ARG_VAR(OSMO_GSM_MANUALS_DIR, [path to common osmo-gsm-manuals files, overriding pkg-config and "../osmo-gsm-manuals"
|
||||
fallback])
|
||||
if test x"$osmo_ac_build_manuals" = x"yes"
|
||||
then
|
||||
# Find OSMO_GSM_MANUALS_DIR (env, pkg-conf, fallback)
|
||||
if test -n "$OSMO_GSM_MANUALS_DIR"; then
|
||||
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from env)"
|
||||
else
|
||||
OSMO_GSM_MANUALS_DIR="$($PKG_CONFIG osmo-gsm-manuals --variable=osmogsmmanualsdir 2>/dev/null)"
|
||||
if test -n "$OSMO_GSM_MANUALS_DIR"; then
|
||||
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from pkg-conf)"
|
||||
else
|
||||
OSMO_GSM_MANUALS_DIR="../osmo-gsm-manuals"
|
||||
echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (fallback)"
|
||||
fi
|
||||
fi
|
||||
if ! test -d "$OSMO_GSM_MANUALS_DIR"; then
|
||||
AC_MSG_ERROR("OSMO_GSM_MANUALS_DIR does not exist! Install osmo-gsm-manuals or set OSMO_GSM_MANUALS_DIR.")
|
||||
fi
|
||||
|
||||
# Find and run check-depends
|
||||
CHECK_DEPENDS="$OSMO_GSM_MANUALS_DIR/check-depends.sh"
|
||||
if ! test -x "$CHECK_DEPENDS"; then
|
||||
CHECK_DEPENDS="osmo-gsm-manuals-check-depends"
|
||||
fi
|
||||
if ! $CHECK_DEPENDS; then
|
||||
AC_MSG_ERROR("missing dependencies for --enable-manuals")
|
||||
fi
|
||||
|
||||
# Put in Makefile with absolute path
|
||||
OSMO_GSM_MANUALS_DIR="$(realpath "$OSMO_GSM_MANUALS_DIR")"
|
||||
AC_SUBST([OSMO_GSM_MANUALS_DIR])
|
||||
fi
|
||||
|
||||
# https://www.freedesktop.org/software/systemd/man/daemon.html
|
||||
AC_ARG_WITH([systemdsystemunitdir],
|
||||
[AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files])],,
|
||||
[with_systemdsystemunitdir=auto])
|
||||
AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"], [
|
||||
def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)
|
||||
|
||||
AS_IF([test "x$def_systemdsystemunitdir" = "x"],
|
||||
[AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],
|
||||
[AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])
|
||||
with_systemdsystemunitdir=no],
|
||||
[with_systemdsystemunitdir="$def_systemdsystemunitdir"])])
|
||||
AS_IF([test "x$with_systemdsystemunitdir" != "xno"],
|
||||
[AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])
|
||||
AM_CONDITIONAL([HAVE_SYSTEMD], [test "x$with_systemdsystemunitdir" != "xno"])
|
||||
|
||||
AC_MSG_RESULT([CFLAGS="$CFLAGS"])
|
||||
AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])
|
||||
|
||||
dnl Generate the output
|
||||
AM_CONFIG_HEADER(bscconfig.h)
|
||||
|
||||
AC_OUTPUT(
|
||||
libosmo-mgcp-client.pc
|
||||
include/Makefile
|
||||
include/osmocom/Makefile
|
||||
include/osmocom/mgcp_client/Makefile
|
||||
include/osmocom/mgcp/Makefile
|
||||
src/Makefile
|
||||
src/libosmo-mgcp-client/Makefile
|
||||
src/libosmo-mgcp/Makefile
|
||||
src/osmo-mgw/Makefile
|
||||
tests/Makefile
|
||||
tests/atlocal
|
||||
tests/mgcp_client/Makefile
|
||||
tests/mgcp/Makefile
|
||||
tests/iuup/Makefile
|
||||
doc/Makefile
|
||||
doc/examples/Makefile
|
||||
doc/manuals/Makefile
|
||||
contrib/Makefile
|
||||
contrib/systemd/Makefile
|
||||
Makefile)
|
3
contrib/Makefile.am
Normal file
3
contrib/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
SUBDIRS = systemd
|
||||
|
||||
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)
|
67
contrib/jenkins.sh
Executable file
67
contrib/jenkins.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env bash
|
||||
# jenkins build helper script for openbsc. This is how we build on jenkins.osmocom.org
|
||||
#
|
||||
# environment variables:
|
||||
# * WITH_MANUALS: build manual PDFs if set to "1"
|
||||
# * PUBLISH: upload manuals after building if set to "1" (ignored without WITH_MANUALS = "1")
|
||||
#
|
||||
|
||||
if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then
|
||||
echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
|
||||
set -ex
|
||||
|
||||
base="$PWD"
|
||||
deps="$base/deps"
|
||||
inst="$deps/install"
|
||||
export deps inst
|
||||
|
||||
osmo-clean-workspace.sh
|
||||
|
||||
mkdir "$deps" || true
|
||||
osmo-build-dep.sh libosmocore "" ac_cv_path_DOXYGEN=false
|
||||
|
||||
verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
|
||||
|
||||
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
export LD_LIBRARY_PATH="$inst/lib"
|
||||
export PATH="$inst/bin:$PATH"
|
||||
|
||||
osmo-build-dep.sh libosmo-abis
|
||||
osmo-build-dep.sh libosmo-netif
|
||||
|
||||
# Additional configure options and depends
|
||||
CONFIG=""
|
||||
if [ "$WITH_MANUALS" = "1" ]; then
|
||||
osmo-build-dep.sh osmo-gsm-manuals
|
||||
CONFIG="--enable-manuals"
|
||||
fi
|
||||
|
||||
set +x
|
||||
echo
|
||||
echo
|
||||
echo
|
||||
echo " =============================== osmo-mgw ==============================="
|
||||
echo
|
||||
set -x
|
||||
|
||||
cd "$base"
|
||||
autoreconf --install --force
|
||||
./configure --enable-vty-tests --enable-external-tests --enable-werror $CONFIG
|
||||
$MAKE $PARALLEL_MAKE
|
||||
LD_LIBRARY_PATH="$inst/lib" $MAKE check \
|
||||
|| cat-testlogs.sh
|
||||
LD_LIBRARY_PATH="$inst/lib" \
|
||||
DISTCHECK_CONFIGURE_FLAGS="--enable-vty-tests --enable-external-tests $CONFIG" \
|
||||
$MAKE distcheck \
|
||||
|| cat-testlogs.sh
|
||||
|
||||
if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then
|
||||
make -C "$base/doc/manuals" publish
|
||||
fi
|
||||
|
||||
$MAKE maintainer-clean
|
||||
osmo-clean-workspace.sh
|
6
contrib/systemd/Makefile.am
Normal file
6
contrib/systemd/Makefile.am
Normal file
@@ -0,0 +1,6 @@
|
||||
EXTRA_DIST = osmo-mgw.service
|
||||
|
||||
if HAVE_SYSTEMD
|
||||
systemdsystemunit_DATA = \
|
||||
osmo-mgw.service
|
||||
endif
|
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
|
434
debian/changelog
vendored
Normal file
434
debian/changelog
vendored
Normal file
@@ -0,0 +1,434 @@
|
||||
osmo-mgw (1.6.0) unstable; urgency=medium
|
||||
|
||||
[ Oliver Smith ]
|
||||
* Cosmetic: fix spaces/tabs in mgcp_requests[]
|
||||
* Inactive connection cleanup (disabled by default)
|
||||
* debian: create -doc subpackage with pdf manuals
|
||||
* vty: allow 0 as conn-timeout to disable it
|
||||
* vty: update desc of conn-timeout
|
||||
* manuals: update VTY documentation
|
||||
* "make dist" fix for: no rule to make mgcp_common.h
|
||||
* contrib/jenkins.sh: run "make maintainer-clean"
|
||||
|
||||
[ Philipp Maier ]
|
||||
* Add option to GSM HR frames to RFC5593 representation
|
||||
* mgcp_sdp: cosmetic: correct typo in comment
|
||||
* mgco_client: cosmetic: remove excess whitespace
|
||||
* mgcp_sdp: mgcp_sdp.c does not include own header file
|
||||
* mgcp_sdp: untangle parsing of a= parameters
|
||||
* mgcp_network: use mgcp_rtp_codec in downlink format callback
|
||||
* AMR: Add function to convert between bw-effient and octet aligned mode
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* log: don't spam with "can not patch PT" messages
|
||||
* mgcp client: allow setting conn mode for CRCX and MDCX
|
||||
* make codec_table public as osmo_mgcpc_codec_names
|
||||
* move MGW endpoint FSM from osmo-bsc to here
|
||||
* fix: multiple initial CRCX
|
||||
* constify map_codec_to_pt() ptmap arg
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* mgcp-client: whitespace cleanup in mgcp_client.c
|
||||
* mgcp-client: Sanitize implementation of mgcp_client_rtpbridge_wildcard
|
||||
* libosmo-mgcp: Use trunk type during endpoint allocation
|
||||
* cosmetic: Fix typos in comment
|
||||
* cosmetic: tests: mgcp_client_test: clean trailing whitespace
|
||||
* mgcp_msg: Log faulty line on Osmux parsing error
|
||||
* cosmetic: handle_modify_con: Fix indentation level
|
||||
* Introduce log fmt helpers LOGPENDP and LOGPCONN
|
||||
* create_response_with_sdp: Fix inclusion of X-Osmux
|
||||
* osmux: Cleanup of CID alloc pool APIs
|
||||
* mgcp_osmux.c: osmux_enable_endpoint: Fix incorrect return check
|
||||
* osmux: Log osmux socket during osmux_init
|
||||
* mgcp-cli: Change osmo_mgcpc_ep_fsm name to avoid collision with old osmo-bsc
|
||||
* osmux: Document func and return different rc upon osmux init failure
|
||||
* osmux: Fix reception of legacy dummy payloads
|
||||
* osmux: Use LOGPCONN in several log calls
|
||||
* cosmetic: mgcp_udp_send: Document port param is in network byte order
|
||||
* cosmetic: osmux: Document network byte order in port variable
|
||||
* vty: Allow enabling Osmux
|
||||
* osmux: Allocate CID during CRCX
|
||||
* osmux: Introduce mgcp_conn_rtp_is_osmux() helper
|
||||
* osmux: Mark conn_rtp->type as osmux during CRCX
|
||||
* mgcp-cli: Allow submitting X-Osmux on CRCX request
|
||||
* mgcp-cli: Parse X-Osmux on CRCX response
|
||||
* osmux: Handle Osmux MGCP extension in MDCX messages
|
||||
* mgcp-cli: Allow submitting X-Osmux on MDCX request
|
||||
* mgcp-cli: Parse X-Osmux on MDCX response
|
||||
* osmux: Drop unneeded OSMUX_STATE_NEGOTIATING
|
||||
* mgcp-cli: endpoint_fsm: Add API to retrieve Osmux CID from MGW
|
||||
* osmux: Provide correct local port during mgcp resp
|
||||
* osmux: Use remote port to send osmux frames
|
||||
* osmux: Improve logging around osmux enabling events
|
||||
* osmux: Delay osmux enable of conn until remote addr is configured by MDCX
|
||||
* osmux: Redo read/write osmux glue code to have data routed correctly
|
||||
* mgw, mgcp-li: Handle X-Osmux param name as case insensitive
|
||||
* osmux: Use DUMMY ft msg as per Osmux spec
|
||||
* osmux: Fix loopback for Osmux connections
|
||||
* osmux: Fix CID release for non-enabled connections
|
||||
* osmux: Fix hardcoded rtp payload_type 98 in osmux conn
|
||||
* mgcp-cli: Validate osmux cid value during mgcp_msg_gen
|
||||
* mgw: Support uppercase LCO options
|
||||
* mgw: Support lowercase header parameters
|
||||
* mgcp-cli: Support lowercase header parameters
|
||||
* mgw: Support receiving uppercase connection mode
|
||||
* mgw: Support receiving lowercase LCO codec
|
||||
* mgw: Make check of duplicated LCO fields case insensitive
|
||||
* mgw: Allow receiving lowercase MGCP header keyword
|
||||
* mgw: Allow receiving lowercase X-Osmo-Ign Callid field
|
||||
* mgw: Allow receiving uppercase noanswer keyword
|
||||
* doc: X-Osmo-IGN: small formatting and typo fixes
|
||||
* doc: Add Osmux documentation to OsmoMGW User Manual
|
||||
* Catch unsigned integer MGCP parsing errors with strtoul
|
||||
* Fix return variable of strtoul()
|
||||
* Remove undefined param passed to {logging,osmo_stats}_vty_add_cmds
|
||||
* configure.ac: Require libosmo-netif 0.6.0
|
||||
|
||||
[ Alexander Couzens ]
|
||||
* mgcp_internal: LOGPENDP: ensure *endp is not NULL
|
||||
|
||||
[ Harald Welte ]
|
||||
* handle NULL return of rate_ctr_group_alloc()
|
||||
* update .gitignore
|
||||
* mgcp_sdp: Don't check if an unsigned int is below 0
|
||||
|
||||
[ Vadim Yanitskiy ]
|
||||
* configure.ac: drop useless check for -fvisibility=hidden
|
||||
|
||||
[ Daniel Willmann ]
|
||||
* manuals: Add script to regenerate vty/counter documentation
|
||||
* manuals: Update vty/counter documentation
|
||||
|
||||
[ Hoernchen ]
|
||||
* turn -Werror=null-dereference into a warning
|
||||
|
||||
-- Pau Espin Pedrol <pespin@sysmocom.de> Wed, 07 Aug 2019 16:52:58 +0200
|
||||
|
||||
osmo-mgw (1.5.0) unstable; urgency=medium
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* gitignore: Filter *.pc
|
||||
* configure: Find correct libgsm's gsm.h header
|
||||
* vty: Fix typo writing bts-jitter-buffer-delay-{min,max}
|
||||
* Remove libosmo-legacy-mgcp and osmo-bsc-mgcp
|
||||
* debian: Remove dangling symlink to osmo-bsc-mgcp.service
|
||||
* Install systemd services with autotools
|
||||
* Install sample cfg file to /etc/osmocom
|
||||
* mgcp: Fix osmux_cid_bitmap static array size calculation
|
||||
* mgcp_osmux: Use define to calculate rtp_ssrc_winlen
|
||||
* osmux: Avoid initing output without enabling osmux
|
||||
* mgcp: Log endpoint nr consistently as hex
|
||||
* osmux_send_dummy: Avoid logging incorrectly and sending if osmux not enabled
|
||||
* osmux: Don't process regular osmux frames if disabled by cfg
|
||||
* osmux: Move parse_cid of legacy dummy frames to own function
|
||||
* osmux: Make func handling dummy frames independent of endp type
|
||||
* osmux: allow enabling osmux only on correct activating state
|
||||
* osmux: Improve checks around activating and using enabled osmux
|
||||
* osmux.h: Document enum osmux_state
|
||||
* osmux: Avoid processing further frames if conn not found
|
||||
|
||||
[ Philipp Maier ]
|
||||
* mgcp_client_fsm: allow ptmap in mgcp_client_fsm as well
|
||||
* mgcp_network: translate payload type numbers in RTP packets
|
||||
* mgcp_client: use IETF source port as for MGCP
|
||||
* mgcp_client: increment local port number when port is in use
|
||||
* mgcp_test: release endpoints after use
|
||||
* network: do not patch PT of RTCP packets
|
||||
* network: check packets before further processing
|
||||
* Cosmetic: remove misplaced line break
|
||||
* mgcp_sdp: restructure mgcp_write_response_sdp() (rtpmap)
|
||||
* mgcp_sdp: restructure mgcp_write_response_sdp() (audio)
|
||||
* mgcp_client: check local port only once
|
||||
* mgcp_client_fsm: switch to MGCP_CONN_RECV_SEND in add_audio()
|
||||
* mgcp_protocol: increase buffer space for codec name in LCO
|
||||
* osmo-mgw: Add vty reference manual
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* fix handling of "Wrong domain name" error
|
||||
* interpret domain '*' as 'allow any domain'
|
||||
* cosmetic: log: fix "CallIDs does not match"
|
||||
* fix 3G hack: allow any IP for loopback and 0.0.0.0
|
||||
* cosmetic: drop code dup in mgcp_client_fsm.c CRCX
|
||||
* add X-Osmo-IGN MGCP header to ignore CallID
|
||||
* X-Osmo-IGN: rather parse items by token, not char
|
||||
* mgcp_test: fix log of conn_id presence
|
||||
* mgcp_test: fix get_conn_id_from_response() CI length
|
||||
* mgcp_client_test: cosmetically re-arrange reply_to() args
|
||||
* mgcp_client_test: use "\r\n\r\n" instead of "\n\n"
|
||||
* mgcp_client_test: also verify received conn_id
|
||||
* mgcp_client_test: test long conn_id
|
||||
* mgcp_client: error on too long conn id
|
||||
* mgcp_common: rename to MGCP_CONN_ID_MAXLEN
|
||||
* doc: fix mgcp_verify_ci() return val doc
|
||||
* mgcp_verify_ci(): return meaningful error codes
|
||||
* fix mgcp_verify_ci(): off-by-one in max len check
|
||||
* generate shorter 'I:' conn IDs
|
||||
* mgcp_conn_get(): compare conn Id ('I:') case insensitively
|
||||
* mgcp_conn_get(): match conn Id ('I:') despite leading zeros
|
||||
* cosmetic: mgcp_test: fix get_conn_id_from_response()
|
||||
* comment: indicate struct type for mgcp_endpoint.conns
|
||||
* log: avoid logging early media as error
|
||||
* fix osmo-mgw -s; fixes osmo-mgw.service using -s
|
||||
* Importing history from osmo-gsm-manuals.git
|
||||
* OsmoMGW: update VTY reference
|
||||
* OsmoMGW: document the 'X-Osmo-IGN' MGCP extension
|
||||
* mgw: update vty reference
|
||||
* drop/replace very weird logging in mgcp_client.c
|
||||
* check_rtp: on IP:port errors, log the IP and port
|
||||
* osmo-mgw: err-log: include expected domain name
|
||||
* mgcp_client_vty: fix missing talloc_free
|
||||
* mgcp_client: drop a bunch of dead code
|
||||
* mgcp_client: logging tweaks
|
||||
* mgcp_client: make domain part of endpoint configurable
|
||||
* mgcp_client: tweak some log levels INFO -> {DEBUG,ERROR}
|
||||
|
||||
[ Stefan Sperling ]
|
||||
* add VTY commands which show specific mgcp endpoints
|
||||
* add MGCP CRCX command statistics to osmo-mgw
|
||||
* show RTP TX/RX stats in 'mgcp show stats' output
|
||||
* use local variable for rate counters in handle_create_con()
|
||||
* add more mgcp crxc error counters
|
||||
* add MDCX command statistics to osmo-mgw
|
||||
* add aggregated rtp connection stats to osmo-mgw
|
||||
* add DLCX command statistics to osmo-mgw
|
||||
|
||||
[ Harald Welte ]
|
||||
* debian/rules: Don't overwrite .tarball-version
|
||||
* check_rtp_origin(): Don't memcmp sockadd_in and in_addr
|
||||
* check_rtp_origin(): Avoid using memcmp for comparing integer types
|
||||
* vty-ref: Update URI of docbook 5.0 schema
|
||||
|
||||
[ Daniel Willmann ]
|
||||
* mgw: Add new VTY reference
|
||||
* Add initial OsmoMGW manual
|
||||
|
||||
[ Oliver Smith ]
|
||||
* build manuals moved here from osmo-gsm-manuals.git
|
||||
* jenkins.sh: remove leftover MGCP env variable
|
||||
* Fix DISTCHECK_CONFIGURE_FLAGS override
|
||||
* contrib/jenkins.sh: build and publish manuals
|
||||
* contrib: fix makedistcheck with disabled systemd
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Sun, 20 Jan 2019 15:02:18 +0100
|
||||
|
||||
osmo-mgw (1.4.0) unstable; urgency=medium
|
||||
|
||||
[ Philipp Maier ]
|
||||
* network: independently initalize state->out_stream
|
||||
* stats: use libosmocore rate counter for in/out_stream.err_ts_counter
|
||||
* mgcp_sdp: correct apidoc of mgcp_parse_sdp_data
|
||||
* vty: clean up rtp port-range command
|
||||
* sdp: remove unused alt_codec field from struct mgcp_rtp_end
|
||||
* sdp: remove circular inclusion
|
||||
* protocol: Try whole port range on port allocation
|
||||
* client: do not start connections in loopback mode
|
||||
* mgcp_network: do not log destination invalid ip/port as error
|
||||
* cosmetic: fix log output
|
||||
* conn: call talloc_free before setting the pointer to NULL
|
||||
* protocol: do not change LCO, when no LCO are present
|
||||
* protocol: reject illegal lco options
|
||||
* cosmetic: fix typo
|
||||
* mgw: clean up codec negotiation (sdp)
|
||||
* client: add features to generate and parse codec information
|
||||
* mgcp_internal: remove unused struct member
|
||||
* stats: replace packet statistic counters with libosmocore rate counters
|
||||
* stat+vty: fix printing of rate counter values
|
||||
* protocol: prevent unnecessary null pointer deref
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* legacy-mgcp: Add jitter buffer on the uplink receiver
|
||||
* legacy-mgcp: switch to new osmux output APIs
|
||||
* mgcp: mgcp_osmux: use conn_bts when forwarding pkts from bsc_nat
|
||||
* mgcp: switch to new osmux output APIs
|
||||
* debian: Package installed example doc files
|
||||
* gitignore: Add m4 scripts from m4 subdir
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* api doc: fix parameter name for mgcp_conn_create()
|
||||
* mgcp-client: add mgcp_conn_get_ci()
|
||||
* mgcp_client_fsm: improve error logging
|
||||
* cosmetic: fix doxygen comment markers
|
||||
* cosmetic: mgcp_network.c: merge one LOGPC to its preceding LOGP
|
||||
* IuUP hack: make RTP patching less general
|
||||
|
||||
[ Harald Welte ]
|
||||
* cosmetic: fix typo in log message: 'abrupt' instead of 'aprupt'
|
||||
|
||||
[ Daniel Willmann ]
|
||||
* git-version-gen: Don't check for .git directory
|
||||
|
||||
-- Pau Espin Pedrol <pespin@sysmocom.de> Fri, 27 Jul 2018 19:05:22 +0200
|
||||
|
||||
osmo-mgw (1.3.0) unstable; urgency=medium
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* contrib: Add osmo-mgw systemd service
|
||||
* legacy: mgcp_protocol: Don't print osmux stats if it is off
|
||||
* mgcp_stat: Don't print osmux stats if it is off
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* fix segfault: DLCX for unknown endpoint: dont try to log NULL endpoint
|
||||
* MGCP endpoints: parse as decimal, not hex
|
||||
* add --enable-sanitize config option
|
||||
* legacy_mgcp: mgcp_test: sanitize: free msgb_ctx
|
||||
* mgcp_test: test_packet_error_detection: sanitize: free all conns
|
||||
* mgcp_test: test_no_cycle: sanitize: free endp
|
||||
* mgcp_test: sanitize: free msgb_ctx
|
||||
* mgcp_client: don't configure "bts base"
|
||||
* Revert "mgcp_client: don't configure "bts base"" until osmo-msc is ready
|
||||
* mgcp_client: add transaction cleanup
|
||||
* mgcp_client_test makefile: add update_exp target
|
||||
* cosmetic: mgcp_network: typo in log
|
||||
* osmo-mgw: Add talloc context introspection via VTY
|
||||
* mgcp_client: show failure by MGCP SDP section parsing test
|
||||
* mgcp_client: cosmetic: clean up SDP params parsing
|
||||
* mgcp_client: detect SDP section-start parsing errors
|
||||
* compiler warning: ignore deprecated in mgcp_client_test.c
|
||||
* configure: add --enable-werror
|
||||
* jenkins.sh: add --enable-werror to configure flags
|
||||
* cosmetic: mgcp, legacy_mgcp: drop unused vty.h definitions
|
||||
* use osmo_init_logging2() with proper talloc ctx
|
||||
|
||||
[ Philipp Maier ]
|
||||
* osmux: fix nullpointer dereference
|
||||
* cosmetic: guard dead osmux vty code with ifdef
|
||||
* cosmetic: remove prefix "net" from rtp related vty commands
|
||||
* doc: update sample config file
|
||||
* cosmetic: use correct VTY port number constant
|
||||
* vty: simplify endpoint allocation
|
||||
* vty: do not change number_endpoints at runtime
|
||||
* MGCP: Connection Identifiers are hex strings
|
||||
* libosmo-mgcp: Connection Identifiers are allocated by MGW, not CA
|
||||
* client: use osmo_strlcpy instead of strncpy
|
||||
* cosmetic: fix sourcecode formatting
|
||||
* cosmetic: clearly mark endpoint numbers as hex
|
||||
* client: use string as connection identifier
|
||||
* conn: remove assertions
|
||||
* mgcp_test: fix wrong strcmp() parameters
|
||||
* mgcp_test: fix nullpointer dereference
|
||||
* mgcp_test: add returncode check
|
||||
* mgcp_test: fix possible double free
|
||||
* mcgp_client: mgcp_msg_gen(): add checks to verify params
|
||||
* network: use originating RTP packet address for loopback
|
||||
* client: mgcp_response_parse_params: check rtp port
|
||||
* mgcp: allow endpoints beginning from zero
|
||||
* client/common: move constant MGCP_ENDPOINT_MAXLEN
|
||||
* mgcp: make domain name configurable
|
||||
* cosmetic: protocol: remove unnecessary nul termination
|
||||
* client: do not insist on \n\n when parsing MGCP messages
|
||||
* main: display mgcp ip/port
|
||||
* client: make callid in MDCX mandatory
|
||||
* client: add missing mandatory SDP fields
|
||||
* mgcp: permit wildcarded endpoint assignment (CRCX)
|
||||
* mgcp: add prefix to virtual trunk
|
||||
* client: eliminate destructive parameter parsing
|
||||
* client: eliminate destructive head parsing
|
||||
* cosmetic: client: add doxygen comments
|
||||
* protocol: fix problem with line break and OSMUX
|
||||
* protocol: fix missing carriage return
|
||||
* client: fix sdp parameter ordering
|
||||
* protocol: check the packetization in local cx options
|
||||
* cosmetic: remove spaces from pointer symbol
|
||||
* client: Do not accept endpoint ids with wildcards in responses
|
||||
* client: do not accept endpoint ids without @ character in responses
|
||||
* client: prohibit endpoint ids without @ character
|
||||
* protocol: on wildcarded CRCX return endpoint number as hex
|
||||
* msg: fix response code on exhausted endp resources
|
||||
* cosmetic: move mgcp_release_endp() to mgcp_ep.c
|
||||
* client: use heap to store mgcp_response
|
||||
* ep: move endpoint struct and define to mgcp_ep.h
|
||||
* cosmetic: rename mgcp_release_endp to mgcp_endp_release
|
||||
* cosmetic: rename mgcp_ep.c/h to mgcp_endp.c/h
|
||||
* protocol: reject DLCX/CRCX/MDCX on unsupported parameters
|
||||
* protocol: exit cleanly when local cx options check fails
|
||||
* cosmetic: Add missing \n on log line
|
||||
* protocol: check requested connection mode
|
||||
* protocol: fix tagging of wildcarded requests
|
||||
* protocol: prohibit wildcarded requests for MDCX and DLCX
|
||||
* mgcp: fix use-after-free and add callback for endpoint cleanup
|
||||
* client: add an optional FSM interface
|
||||
* mgcp_client_fsm: Add FSM event names
|
||||
* cosmetic: mgcp_client_fsm: rename enums
|
||||
* cosmetic: rename function .._conn_reset() to .._conn_init()
|
||||
* mgcp_conn: do not touch u.rtp in mgcp_conn_alloc()
|
||||
* cosmetic: rename .._codec_reset() to .._codec_init()
|
||||
* mgcp_conn: add function mgcp_rtp_conn_cleanup()
|
||||
* stats: use libosmocore rate counter for in/out_stream.err_ts_counter
|
||||
|
||||
[ Alexander Couzens ]
|
||||
* debian/control: correct library dependency of osmo-mgw against libosmo-mgcp1
|
||||
* debian: include systemd service osmo-mgw.service
|
||||
* Revert "stats: use libosmocore rate counter for in/out_stream.err_ts_counter"
|
||||
|
||||
[ Harald Welte ]
|
||||
* cosmetic: fix whitespaces; we use tabs for indentation
|
||||
* Fix possible buffer overflow in mgcp_conn_dump()
|
||||
* osmo-mgw: Update copyright statement
|
||||
* osmo-mgw: Config file is osmo-mgw.cfg, and not mgcp.cfg
|
||||
* osmo-mgw: Fix copyright notice
|
||||
* strct mgcp_rtp_state: Group + document struct members related to patching
|
||||
* mgcp_rtp_state: grup 'stats' members into sub-structure
|
||||
* mgcp_rtp_end: Group statistics members into 'stats' sub-struct
|
||||
* libosmo-mgcp: Cosmetic spelling fixes in comments
|
||||
* mgcp_msg: We must parse endpoint numbers as hex, not decimal!
|
||||
* mgcp_internal.h: document more struct members with comments
|
||||
* centralize handling of common errors like "endpoint not found"
|
||||
* Return proper MGCP Error codes, as per spec
|
||||
* osmo-mgw: Use libosmocore socket abstraction
|
||||
* osmo-bsc_mgcp: Add LIBOSMONETIF_{CFLAGS,LIBS}
|
||||
* libosmo-mgcp-client is GPLv2+, not AGPLv3+
|
||||
* Turn libosmo-mgcp into local, non-installed library
|
||||
|
||||
[ Stefan Sperling ]
|
||||
* enable osmo_fsm vty commands in libosmo-mgcp-client vty
|
||||
|
||||
-- Pau Espin Pedrol <pespin@sysmocom.de> Thu, 03 May 2018 17:40:35 +0200
|
||||
|
||||
osmo-mgw (1.2.0) unstable; urgency=medium
|
||||
|
||||
[ Neels Hofmeyr ]
|
||||
* jenkins: use osmo-clean-workspace.sh before and after build
|
||||
* vty: skip installing cmds now always installed by default
|
||||
* mgcp-client vty: use name 'mgw' instead of 'mgcpgw'
|
||||
* mgcp client: vty: tweak doc strings
|
||||
|
||||
[ Philipp Maier ]
|
||||
* sdp: refactoring sdp parser/generator
|
||||
* cosmetic: rename bts_codec to codec_str
|
||||
* cosmetic: fix coding style for mgcp_parse_sdp_data()
|
||||
* cosmetic: fix commenting style
|
||||
* cosmetic: correct whitespaces
|
||||
* client: fix stderror logging in unit-test
|
||||
* client: add unified function to generate MGCP messages
|
||||
* client: add ip address parsing to the client
|
||||
* protocol: allow wildcarded DLCX
|
||||
* mgcp: remove port/timeslot calculator functions from mgcp.h
|
||||
* network: add separate log category
|
||||
* cosmetic: make dummy packet handling more explicit
|
||||
* network: autdetect rtp bind ip-address
|
||||
* network: fix rtp packet length
|
||||
* network: remove unused return code
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* mgcp_client_vty.c: Fix VTY compatibility with 'mgcpgw bts-base'
|
||||
|
||||
-- Harald Welte <laforge@gnumonks.org> Fri, 10 Nov 2017 11:10:23 +0900
|
||||
|
||||
osmo-mgw (1.1.0) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Harald Welte <lafore@gnumonks.org> Sat, 28 Oct 2017 12:48:41 +0200
|
||||
|
||||
osmo-mgw (1.0.2) unstable; urgency=low
|
||||
|
||||
* First release after major rename.
|
||||
|
||||
-- Max Suraev <msuraev@sysmocom.de> Thu, 14 Sep 2017 18:41:05 +0200
|
||||
|
||||
|
||||
osmo-mgw (0.1.0) unstable; urgency=low
|
||||
|
||||
* Initial release.
|
||||
|
||||
-- Alexander Couzens <lynxis@fe80.eu> Tue, 08 Aug 2017 01:12:53 +0000
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@@ -0,0 +1 @@
|
||||
9
|
45
debian/control
vendored
Normal file
45
debian/control
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
Source: osmo-mgw
|
||||
Section: net
|
||||
Priority: extra
|
||||
Maintainer: Alexander Couzens <lynxis@fe80.eu>
|
||||
Build-Depends: debhelper (>=9),
|
||||
dh-autoreconf,
|
||||
pkg-config,
|
||||
autotools-dev,
|
||||
libosmocore-dev,
|
||||
libosmo-netif-dev,
|
||||
osmo-gsm-manuals-dev
|
||||
Standards-Version: 3.9.8
|
||||
Vcs-Git: git://git.osmocom.org/osmo-mgw.git
|
||||
Vcs-Browser: https://git.osmocom.org/osmo-mgw/
|
||||
Homepage: https://osmocom.org/projects/osmo-mgw
|
||||
|
||||
Package: osmo-mgw
|
||||
Architecture: any
|
||||
Multi-Arch: foreign
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: OsmoMGW: Osmocom's Media Gateway for 2G and 3G circuit-switched mobile networks
|
||||
|
||||
Package: libosmo-mgcp-client6
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
|
||||
|
||||
Package: libosmo-mgcp-client-dev
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Depends: libosmo-mgcp-client6 (= ${binary:Version}), ${misc:Depends}
|
||||
Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
|
||||
|
||||
Package: osmo-mgw-doc
|
||||
Architecture: all
|
||||
Section: doc
|
||||
Priority: optional
|
||||
Depends: ${misc:Depends}
|
||||
Description: ${misc:Package} PDF documentation
|
||||
Various manuals: user manual, VTY reference manual and/or
|
||||
protocol/interface manuals.
|
65
debian/copyright
vendored
Normal file
65
debian/copyright
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: osmo-mgw
|
||||
Source: git://git.osmocom.org/osmo-mgw
|
||||
|
||||
Files: *
|
||||
Copyright: 2009-2014 On-Waves
|
||||
2009-2015 Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
2013 Jacob Erlbeck <jerlbeck@sysmocom.de>
|
||||
2016-2017 sysmocom s.m.f.c. GmbH <info@sysmocom.de>
|
||||
License: AGPL-3.0+
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Files: src/libosmo-mgcp-client/* include/osmocom/mgcp_client/*
|
||||
Copyright: 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
|
||||
Based on OpenBSC interface to quagga VTY (libmsc/vty_interface_layer3.c)
|
||||
2009 by Harald Welte <laforge@gnumonks.org>
|
||||
2009-2011 by Holger Hans Peter Freyther
|
||||
License: GPL-2.0+
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Files: tests/vty_test_runner.py
|
||||
Copyright: 2013 Holger Hans Peter Freyther
|
||||
2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
|
||||
License: GPL-3.0+
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General Public License
|
||||
Version 3 can be found in `/usr/share/common-licenses/GPL-3'.
|
||||
|
||||
Files: osmoappdesc.py
|
||||
Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
|
||||
License: GPL-3.0+
|
4
debian/libosmo-mgcp-client-dev.install
vendored
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-client6.install
vendored
Normal file
1
debian/libosmo-mgcp-client6.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/lib/*/libosmo-mgcp-client.so.*
|
1
debian/osmo-mgw-doc.install
vendored
Normal file
1
debian/osmo-mgw-doc.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/share/doc/osmo-mgw-doc/*.pdf
|
4
debian/osmo-mgw.install
vendored
Normal file
4
debian/osmo-mgw.install
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
etc/osmocom/osmo-mgw.cfg
|
||||
lib/systemd/system/osmo-mgw.service
|
||||
usr/bin/osmo-mgw
|
||||
usr/share/doc/osmo-mgw/examples/osmo-mgw/osmo-mgw.cfg
|
39
debian/rules
vendored
Executable file
39
debian/rules
vendored
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/make -f
|
||||
# You must remove unused comment lines for the released package.
|
||||
# See debhelper(7) (uncomment to enable)
|
||||
# This is an autogenerated template for debian/rules.
|
||||
#
|
||||
# Output every command that modifies files on the build system.
|
||||
#export DH_VERBOSE = 1
|
||||
|
||||
DEBIAN := $(shell dpkg-parsechangelog | grep '^Version:' | cut -d' ' -f2)
|
||||
DEBVERS := $(shell echo '$(DEBIAN)' | cut -d- -f1)
|
||||
VERSION := $(shell echo '$(DEBVERS)' | sed -e 's/[+-].*//' -e 's/~//g')
|
||||
|
||||
CFLAGS += -g
|
||||
|
||||
# main packaging script based on dh7 syntax
|
||||
%:
|
||||
dh $@ --with autoreconf
|
||||
|
||||
# debmake generated override targets
|
||||
# Set options for ./configure
|
||||
#CONFIGURE_FLAGS = <options for ./configure>
|
||||
#overrride_dh_configure:
|
||||
# dh_configure -- $(CONFIGURE_FLAGS)
|
||||
#
|
||||
# Do not install libtool archive, python .pyc .pyo
|
||||
#override_dh_install:
|
||||
# dh_install --list-missing -X.la -X.pyc -X.pyo
|
||||
|
||||
override_dh_auto_test:
|
||||
dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)
|
||||
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals
|
||||
|
||||
# Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers)
|
||||
override_dh_compress:
|
||||
dh_compress -X.pdf
|
||||
|
||||
# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
3.0 (native)
|
4
doc/Makefile.am
Normal file
4
doc/Makefile.am
Normal file
@@ -0,0 +1,4 @@
|
||||
SUBDIRS = \
|
||||
examples \
|
||||
manuals \
|
||||
$(NULL)
|
@@ -1,3 +1,10 @@
|
||||
OSMOCONF_FILES = \
|
||||
osmo-mgw/osmo-mgw.cfg
|
||||
|
||||
osmoconfdir = $(sysconfdir)/osmocom
|
||||
osmoconf_DATA = $(OSMOCONF_FILES)
|
||||
|
||||
EXTRA_DIST = $(OSMOCONF_FILES)
|
||||
|
||||
CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'
|
||||
|
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
|
18
doc/manuals/Makefile.am
Normal file
18
doc/manuals/Makefile.am
Normal file
@@ -0,0 +1,18 @@
|
||||
EXTRA_DIST = osmomgw-usermanual.adoc \
|
||||
osmomgw-usermanual-docinfo.xml \
|
||||
osmomgw-vty-reference.xml \
|
||||
regen_doc.sh \
|
||||
chapters \
|
||||
vty
|
||||
|
||||
if BUILD_MANUALS
|
||||
ASCIIDOC = osmomgw-usermanual.adoc
|
||||
ASCIIDOC_DEPS = $(srcdir)/chapters/*.adoc
|
||||
include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc
|
||||
|
||||
VTY_REFERENCE = osmomgw-vty-reference.xml
|
||||
include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc
|
||||
|
||||
OSMO_REPOSITORY = osmo-mgw
|
||||
include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc
|
||||
endif
|
57
doc/manuals/chapters/configuration.adoc
Normal file
57
doc/manuals/chapters/configuration.adoc
Normal file
@@ -0,0 +1,57 @@
|
||||
== Configuring OsmoMGW
|
||||
|
||||
A basic configation of OsmoMGW mainly consists of specifying the IP address
|
||||
and port on which to listen to MGCP commands, but changing the port range at
|
||||
which the RTP streams terminate as well as limiting operation to a single call
|
||||
agent can be done as well as changing the number of endpoints.
|
||||
|
||||
=== Configuring MGCP
|
||||
|
||||
By default OsmoMGW listens for MGCP on port 2427 on any IP address. If a call
|
||||
agent address is configured then OsmoMGW will only answer MGCP commands from
|
||||
that IP port 2727, otherwise all sources are handled. A domain can be
|
||||
specified
|
||||
|
||||
.Example: MGCP configuration
|
||||
----
|
||||
OsmoMGW(config-mgcp)# bind ip 127.0.0.1
|
||||
OsmoMGW(config-mgcp)# bind port 2427
|
||||
OsmoMGW(config-mgcp)# call-agent ip 127.0.0.1
|
||||
OsmoMGW(config-mgcp)# domain mgw-bsc
|
||||
OsmoMGW(config-mgcp)# local ip 127.0.0.1
|
||||
----
|
||||
|
||||
=== Configuring the trunk
|
||||
|
||||
The first trunk (trunk 0) is considered a virtual trunk in OsmoMGW. All
|
||||
endpoints of type "rtpbridge" are routed here. The virtual trunk is configured
|
||||
in the config-mgcp context.
|
||||
|
||||
All other trunks are configured in the config-mgcp-trunk context, but the
|
||||
commands used are identical. Right now trunks are considered only for ds/e1
|
||||
type endpoints which are not yet implemented. Don't use trunks other than the
|
||||
"virtual" trunk 0.
|
||||
|
||||
.Example: MGCP trunk configuration
|
||||
----
|
||||
OsmoMGW(config-mgcp)# number endpoints 63 <1>
|
||||
OsmoMGW(config-mgcp)# rtp bind-ip 10.0.0.1 <2>
|
||||
OsmoMGW(config-mgcp)# rtp port-range 12000-14000 <3>
|
||||
----
|
||||
<1> Maximum number of endpoints that can be allocated at once
|
||||
<2> Use this IP when binding RTP endpoints
|
||||
<3> Use ports in this range when binding RTP endpoints
|
||||
|
||||
There are some options to tweak how RTP forwarding behaves in OsmoMGW:
|
||||
|
||||
.Example: MGCP trunk rtp options
|
||||
----
|
||||
OsmoMGW(config-mgcp)# rtp keep-alive 30 <1>
|
||||
OsmoMGW(config-mgcp)# rtp-patch ssrc <2>
|
||||
OsmoMGW(config-mgcp)# rtp-patch timestamp <3>
|
||||
----
|
||||
<1> Send dummy UDP packets periodically to RTP destination
|
||||
<2> Hide SSRC changes
|
||||
<3> Ensure RTP timestamp is aligned with frame duration
|
||||
|
||||
|
4
doc/manuals/chapters/counters.adoc
Normal file
4
doc/manuals/chapters/counters.adoc
Normal file
@@ -0,0 +1,4 @@
|
||||
[[counters]]
|
||||
== Counters
|
||||
|
||||
include::./counters_generated.adoc[]
|
83
doc/manuals/chapters/counters_generated.adoc
Normal file
83
doc/manuals/chapters/counters_generated.adoc
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
// autogenerated by show asciidoc counters
|
||||
These counters and their description based on OsmoMGW 1.5.0.64-189f (OsmoMGW).
|
||||
|
||||
=== Rate Counters
|
||||
|
||||
// generating tables for rate_ctr_group
|
||||
// rate_ctr_group table aggregated statistics for all rtp connections
|
||||
.all_rtp_conn - aggregated statistics for all rtp connections
|
||||
[options="header"]
|
||||
|===
|
||||
| Name | Reference | Description
|
||||
| all_rtp:err_tstmp_in | <<all_rtp_conn_all_rtp:err_tstmp_in>> | Total inbound rtp-stream timestamp errors.
|
||||
| all_rtp:err_tstmp_out | <<all_rtp_conn_all_rtp:err_tstmp_out>> | Total outbound rtp-stream timestamp errors.
|
||||
| all_rtp:packets_rx | <<all_rtp_conn_all_rtp:packets_rx>> | Total inbound rtp packets.
|
||||
| all_rtp:octets_rx | <<all_rtp_conn_all_rtp:octets_rx>> | Total inbound rtp octets.
|
||||
| all_rtp:packets_tx | <<all_rtp_conn_all_rtp:packets_tx>> | Total outbound rtp packets.
|
||||
| all_rtp:octets_tx | <<all_rtp_conn_all_rtp:octets_tx>> | Total outbound rtp octets.
|
||||
| all_rtp:dropped | <<all_rtp_conn_all_rtp:dropped>> | Total dropped rtp packets.
|
||||
| all_rtp:num_closed_conns | <<all_rtp_conn_all_rtp:num_closed_conns>> | Total number of rtp connections closed.
|
||||
|===
|
||||
// rate_ctr_group table dlcx statistics
|
||||
.dlcx - dlcx statistics
|
||||
[options="header"]
|
||||
|===
|
||||
| Name | Reference | Description
|
||||
| dlcx:success | <<dlcx_dlcx:success>> | DLCX command processed successfully.
|
||||
| dlcx:wildcard | <<dlcx_dlcx:wildcard>> | wildcard names in DLCX commands are unsupported.
|
||||
| dlcx:no_conn | <<dlcx_dlcx:no_conn>> | endpoint specified in DLCX command has no active connections.
|
||||
| dlcx:callid | <<dlcx_dlcx:callid>> | CallId specified in DLCX command mismatches endpoint's CallId .
|
||||
| dlcx:connid | <<dlcx_dlcx:connid>> | connection ID specified in DLCX command does not exist on endpoint.
|
||||
| dlcx:unhandled_param | <<dlcx_dlcx:unhandled_param>> | unhandled parameter in DLCX command.
|
||||
| dlcx:rejected | <<dlcx_dlcx:rejected>> | connection deletion rejected by policy.
|
||||
| dlcx:deferred | <<dlcx_dlcx:deferred>> | connection deletion deferred by policy.
|
||||
|===
|
||||
// rate_ctr_group table mdcx statistics
|
||||
.mdcx - mdcx statistics
|
||||
[options="header"]
|
||||
|===
|
||||
| Name | Reference | Description
|
||||
| mdcx:success | <<mdcx_mdcx:success>> | MDCX command processed successfully.
|
||||
| mdcx:wildcard | <<mdcx_mdcx:wildcard>> | wildcard endpoint names in MDCX commands are unsupported.
|
||||
| mdcx:no_conn | <<mdcx_mdcx:no_conn>> | endpoint specified in MDCX command has no active connections.
|
||||
| mdcx:callid | <<mdcx_mdcx:callid>> | invalid CallId specified in MDCX command.
|
||||
| mdcx:connid | <<mdcx_mdcx:connid>> | invalid connection ID specified in MDCX command.
|
||||
| crcx:unhandled_param | <<mdcx_crcx:unhandled_param>> | unhandled parameter in MDCX command.
|
||||
| mdcx:no_connid | <<mdcx_mdcx:no_connid>> | no connection ID specified in MDCX command.
|
||||
| mdcx:conn_not_found | <<mdcx_mdcx:conn_not_found>> | connection specified in MDCX command does not exist.
|
||||
| mdcx:invalid_mode | <<mdcx_mdcx:invalid_mode>> | invalid connection mode in MDCX command.
|
||||
| mdcx:conn_opt | <<mdcx_mdcx:conn_opt>> | connection options invalid.
|
||||
| mdcx:no_remote_conn_desc | <<mdcx_mdcx:no_remote_conn_desc>> | no opposite end specified for connection.
|
||||
| mdcx:start_rtp_failure | <<mdcx_mdcx:start_rtp_failure>> | failure to start RTP processing.
|
||||
| mdcx:conn_rejected | <<mdcx_mdcx:conn_rejected>> | connection rejected by policy.
|
||||
| mdcx:conn_deferred | <<mdcx_mdcx:conn_deferred>> | connection deferred by policy.
|
||||
|===
|
||||
// rate_ctr_group table crxc statistics
|
||||
.crcx - crxc statistics
|
||||
[options="header"]
|
||||
|===
|
||||
| Name | Reference | Description
|
||||
| crcx:success | <<crcx_crcx:success>> | CRCX command processed successfully.
|
||||
| crcx:bad_action | <<crcx_crcx:bad_action>> | bad action in CRCX command.
|
||||
| crcx:unhandled_param | <<crcx_crcx:unhandled_param>> | unhandled parameter in CRCX command.
|
||||
| crcx:missing_callid | <<crcx_crcx:missing_callid>> | missing CallId in CRCX command.
|
||||
| crcx:invalid_mode | <<crcx_crcx:invalid_mode>> | invalid connection mode in CRCX command.
|
||||
| crcx:limit_exceeded | <<crcx_crcx:limit_exceeded>> | limit of concurrent connections was reached.
|
||||
| crcx:unkown_callid | <<crcx_crcx:unkown_callid>> | unknown CallId in CRCX command.
|
||||
| crcx:alloc_conn_fail | <<crcx_crcx:alloc_conn_fail>> | connection allocation failure.
|
||||
| crcx:no_remote_conn_desc | <<crcx_crcx:no_remote_conn_desc>> | no opposite end specified for connection.
|
||||
| crcx:start_rtp_failure | <<crcx_crcx:start_rtp_failure>> | failure to start RTP processing.
|
||||
| crcx:conn_rejected | <<crcx_crcx:conn_rejected>> | connection rejected by policy.
|
||||
| crcx:no_osmux | <<crcx_crcx:no_osmux>> | no osmux offered by peer.
|
||||
| crcx:conn_opt | <<crcx_crcx:conn_opt>> | connection options invalid.
|
||||
| crcx:codec_nego | <<crcx_crcx:codec_nego>> | codec negotiation failure.
|
||||
| crcx:bind_port | <<crcx_crcx:bind_port>> | port bind failure.
|
||||
|===
|
||||
== Osmo Stat Items
|
||||
|
||||
// generating tables for osmo_stat_items
|
||||
== Osmo Counters
|
||||
|
||||
// generating tables for osmo_counters
|
||||
// there are no ungrouped osmo_counters
|
72
doc/manuals/chapters/mgcp_extensions.adoc
Normal file
72
doc/manuals/chapters/mgcp_extensions.adoc
Normal file
@@ -0,0 +1,72 @@
|
||||
== MGCP Extensions
|
||||
|
||||
The MGCP protocol is extendable. The following non-standard extensions are
|
||||
understood by OsmoMGW.
|
||||
|
||||
=== `X-Osmo-IGN`
|
||||
|
||||
`X-Osmo-IGN` indicates to OsmoMGW that specific items of an endpoint should be
|
||||
ignored, so that it is lenient on mismatching values that would normally
|
||||
indicate collisions or configuration errors.
|
||||
|
||||
==== `X-Osmo-IGN` Format
|
||||
|
||||
The value part of `X-Osmo-IGN` must be one or more items separated by one or more
|
||||
spaces. Each item consists of one or more non-whitespace characters.
|
||||
|
||||
.Example: `X-Osmo-IGN` format with three ficticious items "X", "abc" and "123".
|
||||
----
|
||||
X-Osmo-IGN: X abc 123
|
||||
----
|
||||
|
||||
`X-Osmo-IGN` must be issued in the MGCP header section (typically as its last item),
|
||||
before the SDP section starts.
|
||||
|
||||
==== Supported `X-Osmo-IGN` Items
|
||||
|
||||
Currently, the following `X-Osmo-IGN` items are supported:
|
||||
|
||||
* `C`: ignore CallID mismatches, i.e. differing "C" values between connections
|
||||
on the same endpoint.
|
||||
|
||||
.Note:
|
||||
`X-Osmo-IGN` does not support ignoring mismatches on the domain part of
|
||||
an endpoint name, e.g. ignoring a mismatch on "example.com" in
|
||||
`rtpbridge/123abc@example.com`. Instead, you may globally configure OsmoMGW
|
||||
with `mgcp` / `domain *` to permit all domain parts.
|
||||
|
||||
===== `X-Osmo-IGN: C`
|
||||
|
||||
By default, OsmoMGW verifies that all CallIDs ("C" values) match for all
|
||||
connections on any one given endpoint. To ignore CallID mismatches, pass a `C`
|
||||
in the `X-Osmo-IGN` header, for the first or the second `CRCX` on an endpoint.
|
||||
When the `X-Osmo-IGN: C` is sent for any one `CRCX` on an endpoint, CallID
|
||||
mismatches will be ignored for that and all subsequent messages for that
|
||||
endpoint. Hence this header only needs to be included once per endpoint, in any
|
||||
`CRCX` message that precedes or coincides with a CallID mismatch.
|
||||
|
||||
This is particularly useful for a BSC that is connected to an A/SCCPlite MSC,
|
||||
where the BSC and MSC each are expected to configure their respective own
|
||||
connection on a shared endpoint. For A/SCCPlite, it is impossible for the BSC
|
||||
to know the CallID that the MSC will use, so CallID mismatches are inevitable.
|
||||
See also OsmoBSC, which will by default pass the `X-Osmo-IGN: C` header for
|
||||
endpoints associated with an A/SCCPlite MSC.
|
||||
|
||||
.Example: `CRCX` message that instructs OsmoMGW to ignore CallID mismatches
|
||||
----
|
||||
CRCX 2 rtpbridge/123abc@mgw MGCP 1.0
|
||||
M: recvonly
|
||||
C: 2
|
||||
L: p:20
|
||||
X-Osmo-IGN: C
|
||||
|
||||
v=0
|
||||
c=IN IP4 123.12.12.123
|
||||
m=audio 5904 RTP/AVP 97
|
||||
a=rtpmap:97 GSM-EFR/8000
|
||||
a=ptime:40
|
||||
----
|
||||
|
||||
=== `X-Osmux`
|
||||
|
||||
See <<mgcp-extension-osmux>>
|
100
doc/manuals/chapters/overview.adoc
Normal file
100
doc/manuals/chapters/overview.adoc
Normal file
@@ -0,0 +1,100 @@
|
||||
[[overview]]
|
||||
== Overview
|
||||
|
||||
This manual should help you getting started with OsmoMGW. It will cover
|
||||
aspects of configuring and running the media gateway.
|
||||
|
||||
[[intro_overview]]
|
||||
=== About OsmoMGW
|
||||
|
||||
OsmoMGW is the Osmocom implementation of a media gateway to handle user
|
||||
plane (voice) traffic in cellular networks. It can connect and optionally
|
||||
transcode RTP voice streams between different network elements such as BTSs
|
||||
and external entities like SIP. It is typically co-located with both OsmoBSC
|
||||
and OsmoMSC and controlled by them via MGCP, the Media Gateway Control
|
||||
Protocol.
|
||||
|
||||
[[fig-bsc]]
|
||||
.OsmoMGW used with OsmoBSC
|
||||
[graphviz]
|
||||
----
|
||||
digraph G {
|
||||
rankdir = LR;
|
||||
OsmoBTS -> OsmoBSC [label="Abis/IP"];
|
||||
OsmoBSC -> OsmoMSC [label="3GPP AoIP"];
|
||||
OsmoBSC -> OsmoMGW [label="MGCP"];
|
||||
OsmoBTS -> OsmoMGW [label="RTP",dir=both];
|
||||
OsmoMGW -> OsmoMSC [label="RTP",dir=both];
|
||||
{rank=same OsmoBSC OsmoMGW}
|
||||
OsmoMGW [color=red];
|
||||
}
|
||||
----
|
||||
|
||||
[[fig-msc]]
|
||||
.OsmoMGW used with OsmoMSC
|
||||
[graphviz]
|
||||
----
|
||||
digraph G {
|
||||
rankdir = LR;
|
||||
BTS -> BSC [label="Abis"];
|
||||
BSC -> OsmoMSC [label="3GPP AoIP"];
|
||||
OsmoMSC -> OsmoMGW [label="MGCP"];
|
||||
BSC -> OsmoMGW [label="RTP",dir=both];
|
||||
OsmoMSC -> OsmoSIP [label="MNCC"];
|
||||
OsmoSIP -> PBX [label="SIP Trunk"];
|
||||
OsmoMGW -> PBX [label="RTP",dir=both];
|
||||
{rank=same OsmoMSC OsmoMGW}
|
||||
OsmoSIP [label="osmo-sip-connector"];
|
||||
OsmoMGW [color=red];
|
||||
|
||||
hNodeB -> OsmoHNBGW [label="Iuh"];
|
||||
OsmoHNBGW -> OsmoMSC [label="IuCS"];
|
||||
hNodeB -> OsmoMGW [label="RTP",dir=both];
|
||||
}
|
||||
----
|
||||
|
||||
=== Software Components
|
||||
|
||||
OsmoMGW contains a variety of different software components, which we’ll
|
||||
quickly describe in this section.
|
||||
|
||||
==== MGCP Implementation
|
||||
|
||||
OsmoMGW brings its own MGCP implementation through which OsmoMGW is
|
||||
controlled.
|
||||
|
||||
The commands implemented are CRCX, MDCX, DLCX and RSIP. The command AUEP is
|
||||
implemented as a stub and will simply respond with OK.
|
||||
|
||||
==== RTP implementation
|
||||
|
||||
Support for IuUP which is used in 3G cells is quite lacking at the moment.
|
||||
3G<->3G and 2G<->2G calls should work, but 3G<->2G does not.
|
||||
|
||||
==== Audio transcoder
|
||||
|
||||
Transcoding is currently not supported in OsmoMGW.
|
||||
|
||||
=== Limitations
|
||||
|
||||
Osmux is not yet supported in OsmoMGW.
|
||||
|
||||
At the moment (July 2018), OsmoMGW only implements RTP proxy / RTP bridge
|
||||
type endpoints, to each of which two RTP connections can be established.
|
||||
We are planning to add endpoint types for:
|
||||
|
||||
- classic E1/T1 timeslots (64kBps alaw/ulaw)
|
||||
- classic E1/T1 16k sub-slots with TRAU frames for classic BTS support
|
||||
- announcement/playout end-points
|
||||
- conference endpoints
|
||||
|
||||
=== Additional resources
|
||||
|
||||
You can find the OsmoMGW issue tracker and wiki online at
|
||||
|
||||
- https://osmocom.org/projects/osmomgw
|
||||
- https://osmocom.org/projects/osmomgw/wiki
|
||||
|
||||
RFC 3435 for MGCP is located at
|
||||
|
||||
- https://tools.ietf.org/html/rfc3435
|
25
doc/manuals/chapters/running.adoc
Normal file
25
doc/manuals/chapters/running.adoc
Normal file
@@ -0,0 +1,25 @@
|
||||
== Running OsmoMGW
|
||||
|
||||
The OsmoMGW executable (`osmo-mgw`) offers the following command-line
|
||||
arguments:
|
||||
|
||||
=== SYNOPSIS
|
||||
|
||||
*osmo-mgw* [-h|-V] [-D] [-c 'CONFIGFILE'] [-s]
|
||||
|
||||
=== OPTIONS
|
||||
|
||||
*-h, --help*::
|
||||
Print a short help message about the supported options
|
||||
*-V, --version*::
|
||||
Print the compile-time version number of the OsmoBTS program
|
||||
*-D, --daemonize*::
|
||||
Fork the process as a daemon into background.
|
||||
*-c, --config-file 'CONFIGFILE'*::
|
||||
Specify the file and path name of the configuration file to be
|
||||
used. If none is specified, use `osmo-mgw.cfg` in the current
|
||||
working directory.
|
||||
*-s, --disable-color*::
|
||||
Disable colors for logging to stderr. This has mostly been
|
||||
deprecated by VTY based logging configuration, see <<logging>>
|
||||
for more information.
|
47
doc/manuals/osmomgw-usermanual-docinfo.xml
Normal file
47
doc/manuals/osmomgw-usermanual-docinfo.xml
Normal file
@@ -0,0 +1,47 @@
|
||||
<revhistory>
|
||||
<revision>
|
||||
<revnumber>1</revnumber>
|
||||
<date>July 24th, 2018</date>
|
||||
<authorinitials>DW</authorinitials>
|
||||
<revremark>
|
||||
Initial version
|
||||
</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<firstname>Daniel</firstname>
|
||||
<surname>Willmann</surname>
|
||||
<email>dwillmann@sysmocom.de</email>
|
||||
<authorinitials>DW</authorinitials>
|
||||
<affiliation>
|
||||
<shortaffil>sysmocom</shortaffil>
|
||||
<orgname>sysmocom - s.f.m.c. GmbH</orgname>
|
||||
</affiliation>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
<copyright>
|
||||
<year>2018</year>
|
||||
<holder>sysmocom - s.f.m.c. GmbH</holder>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>
|
||||
Permission is granted to copy, distribute and/or modify this
|
||||
document under the terms of the GNU Free Documentation License,
|
||||
Version 1.3 or any later version published by the Free Software
|
||||
Foundation; with the Invariant Sections being just 'Foreword',
|
||||
'Acknowledgements' and 'Preface', with no Front-Cover Texts,
|
||||
and no Back-Cover Texts. A copy of the license is included in
|
||||
the section entitled "GNU Free Documentation License".
|
||||
</para>
|
||||
<para>
|
||||
The Asciidoc source code of this manual can be found at
|
||||
<ulink url="http://git.osmocom.org/osmo-gsm-manuals/">
|
||||
http://git.osmocom.org/osmo-gsm-manuals/
|
||||
</ulink>
|
||||
</para>
|
||||
</legalnotice>
|
||||
|
33
doc/manuals/osmomgw-usermanual.adoc
Normal file
33
doc/manuals/osmomgw-usermanual.adoc
Normal file
@@ -0,0 +1,33 @@
|
||||
:gfdl-enabled:
|
||||
:program-name: OsmoMGW
|
||||
|
||||
OsmoMGW User Manual
|
||||
====================
|
||||
Daniel Willmann <dwillmann@sysmocom.de>
|
||||
|
||||
|
||||
include::./common/chapters/preface.adoc[]
|
||||
|
||||
include::{srcdir}/chapters/overview.adoc[]
|
||||
|
||||
include::{srcdir}/chapters/running.adoc[]
|
||||
|
||||
include::./common/chapters/vty.adoc[]
|
||||
|
||||
include::./common/chapters/logging.adoc[]
|
||||
|
||||
include::{srcdir}/chapters/configuration.adoc[]
|
||||
|
||||
include::{srcdir}/chapters/mgcp_extensions.adoc[]
|
||||
|
||||
include::./common/chapters/osmux/osmux.adoc[]
|
||||
|
||||
//include::{srcdir}/chapters/counters.adoc[]
|
||||
|
||||
include::./common/chapters/port_numbers.adoc[]
|
||||
|
||||
include::./common/chapters/bibliography.adoc[]
|
||||
|
||||
include::./common/chapters/glossary.adoc[]
|
||||
|
||||
include::./common/chapters/gfdl.adoc[]
|
38
doc/manuals/osmomgw-vty-reference.xml
Normal file
38
doc/manuals/osmomgw-vty-reference.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
ex:ts=2:sw=42sts=2:et
|
||||
-*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||
-->
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN"
|
||||
"http://docbook.org/xml/5.0/dtd/docbook.dtd" [
|
||||
<!ENTITY chapter-vty SYSTEM "./common/chapters/vty.xml" >
|
||||
<!ENTITY sections-vty SYSTEM "generated/docbook_vty.xml" >
|
||||
]>
|
||||
|
||||
<book>
|
||||
<info>
|
||||
<revhistory>
|
||||
<revision>
|
||||
<revnumber>v1</revnumber>
|
||||
<date>12th December 2017</date>
|
||||
<authorinitials>pm</authorinitials>
|
||||
<revremark>Initial</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
|
||||
<title>OsmoMGW VTY Reference</title>
|
||||
|
||||
<copyright>
|
||||
<year>2017</year>
|
||||
</copyright>
|
||||
|
||||
<legalnotice>
|
||||
<para>This work is copyright by <orgname>sysmocom - s.f.m.c. GmbH</orgname>. All rights reserved.
|
||||
</para>
|
||||
</legalnotice>
|
||||
</info>
|
||||
|
||||
<!-- Main chapters-->
|
||||
&chapter-vty;
|
||||
</book>
|
||||
|
17
doc/manuals/regen_doc.sh
Executable file
17
doc/manuals/regen_doc.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
if [ -z "$DOCKER_PLAYGROUND" ]; then
|
||||
echo "You need to set DOCKER_PLAYGROUND"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT=$(realpath "$0")
|
||||
MANUAL_DIR=$(dirname "$SCRIPT")
|
||||
|
||||
COMMIT=${COMMIT:-$(git log -1 --format=format:%H)}
|
||||
|
||||
cd "$DOCKER_PLAYGROUND/scripts" || exit 1
|
||||
|
||||
OSMO_MGW_BRANCH=$COMMIT ./regen_doc.sh osmo-mgw 4243 \
|
||||
"$MANUAL_DIR/chapters/counters_generated.adoc" \
|
||||
"$MANUAL_DIR/vty/mgw_vty_reference.xml"
|
2
doc/manuals/vty/mgw_vty_additions.xml
Normal file
2
doc/manuals/vty/mgw_vty_additions.xml
Normal file
@@ -0,0 +1,2 @@
|
||||
<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'>
|
||||
</vtydoc>
|
1677
doc/manuals/vty/mgw_vty_reference.xml
Normal file
1677
doc/manuals/vty/mgw_vty_reference.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -92,8 +92,8 @@ fi
|
||||
if test -n "$v"
|
||||
then
|
||||
: # use $v
|
||||
elif test -d ./../.git \
|
||||
&& v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
|
||||
elif
|
||||
v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \
|
||||
|| git describe --abbrev=4 HEAD 2>/dev/null` \
|
||||
&& case $v in
|
||||
[0-9]*) ;;
|
@@ -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()
|
||||
|
19
include/Makefile.am
Normal file
19
include/Makefile.am
Normal file
@@ -0,0 +1,19 @@
|
||||
SUBDIRS = \
|
||||
osmocom \
|
||||
$(NULL)
|
||||
|
||||
nobase_include_HEADERS = \
|
||||
osmocom/mgcp_client/mgcp_client.h \
|
||||
osmocom/mgcp_client/mgcp_client_endpoint_fsm.h \
|
||||
osmocom/mgcp_client/mgcp_client_fsm.h \
|
||||
osmocom/mgcp/mgcp.h \
|
||||
osmocom/mgcp/mgcp_common.h \
|
||||
osmocom/mgcp/mgcp_internal.h \
|
||||
osmocom/mgcp/osmux.h \
|
||||
$(NULL)
|
||||
|
||||
# This gets copied during make from osmocom/mgcp/mgcp_common.h. Therefore it is not included in the source tree and we
|
||||
# don't need to distribute it (OS#4084).
|
||||
nobase_nodist_include_HEADERS = \
|
||||
osmocom/mgcp_client/mgcp_common.h \
|
||||
$(NULL)
|
4
include/osmocom/Makefile.am
Normal file
4
include/osmocom/Makefile.am
Normal file
@@ -0,0 +1,4 @@
|
||||
SUBDIRS = \
|
||||
mgcp_client \
|
||||
mgcp \
|
||||
$(NULL)
|
12
include/osmocom/mgcp/Makefile.am
Normal file
12
include/osmocom/mgcp/Makefile.am
Normal file
@@ -0,0 +1,12 @@
|
||||
noinst_HEADERS = \
|
||||
vty.h \
|
||||
mgcp_msg.h \
|
||||
mgcp_conn.h \
|
||||
mgcp_stat.h \
|
||||
mgcp_endp.h \
|
||||
mgcp_sdp.h \
|
||||
mgcp_codec.h \
|
||||
debug.h \
|
||||
iuup_cn_node.h \
|
||||
iuup_protocol.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,19 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#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,
|
||||
DIUUP,
|
||||
Debug_LastEntry,
|
||||
};
|
||||
|
||||
extern const struct log_info log_info;
|
47
include/osmocom/mgcp/iuup_cn_node.h
Normal file
47
include/osmocom/mgcp/iuup_cn_node.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
/* IuUP CN node, minimal implementation */
|
||||
|
||||
/* _____IuUP_CN_____
|
||||
* | |
|
||||
* UE <--> RNC --PDU-> osmo_iuup_cn_rx_pdu() -+-> ---+-> rx_payload()
|
||||
* | | |
|
||||
* | <-PDU-- tx_msg() <-------------+-- <-+--- osmo_iuup_cn_tx_payload()
|
||||
* | |
|
||||
* -----------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
struct msgb;
|
||||
|
||||
typedef int (*osmo_iuup_data_cb_t)(struct msgb *msg, void *node_priv);
|
||||
|
||||
struct osmo_iuup_cn_cfg {
|
||||
void *node_priv;
|
||||
|
||||
/* When the IuUP peer sent a voice packet, the clean RTP without the IuUP header is fed to this
|
||||
* callback. */
|
||||
osmo_iuup_data_cb_t rx_payload;
|
||||
|
||||
/* IuUP handler requests that a PDU shall be sent to the IuUP peer (e.g. the RNC).
|
||||
* It is guaranteed that the msgb->dst pointer is preserved or copied from the msgb that
|
||||
* originated the request. */
|
||||
osmo_iuup_data_cb_t tx_msg;
|
||||
};
|
||||
|
||||
struct osmo_iuup_cn {
|
||||
struct osmo_iuup_cn_cfg cfg;
|
||||
char *name;
|
||||
uint8_t next_frame_nr;
|
||||
int rtp_payload_type;
|
||||
};
|
||||
|
||||
bool osmo_iuup_cn_is_iuup_init(struct msgb *msg);
|
||||
|
||||
struct osmo_iuup_cn *osmo_iuup_cn_init(void *ctx, struct osmo_iuup_cn_cfg *cfg,
|
||||
const char *name_fmt, ...);
|
||||
void osmo_iuup_cn_free(struct osmo_iuup_cn *cn);
|
||||
|
||||
int osmo_iuup_cn_tx_payload(struct osmo_iuup_cn *cn, struct msgb *payload);
|
||||
|
||||
int osmo_iuup_cn_rx_pdu(struct osmo_iuup_cn *cn, struct msgb *pdu);
|
117
include/osmocom/mgcp/iuup_protocol.h
Normal file
117
include/osmocom/mgcp/iuup_protocol.h
Normal file
@@ -0,0 +1,117 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
/* IuUP protocol handling, minimal implementation */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/endian.h>
|
||||
#include <osmocom/core/msgb.h>
|
||||
|
||||
#define OSMO_IUUP_HEADROOM 32
|
||||
|
||||
enum osmo_iuup_pdu_type {
|
||||
OSMO_IUUP_PDU_DATA_WITH_CRC = 0,
|
||||
OSMO_IUUP_PDU_CONTROL_PROCEDURE = 14,
|
||||
};
|
||||
|
||||
enum osmo_iuup_acknack {
|
||||
OSMO_IUUP_ACKNACK_PROCEDURE = 0,
|
||||
OSMO_IUUP_ACKNACK_ACK = 1,
|
||||
OSMO_IUUP_ACKNACK_NACK = 2,
|
||||
};
|
||||
|
||||
enum osmo_iuup_procedure {
|
||||
OSMO_IUUP_PROC_INITIALIZATION = 0,
|
||||
OSMO_IUUP_PROC_RATE_CONTROL = 1,
|
||||
OSMO_IUUP_PROC_TIME_ALIGNMENT = 2,
|
||||
OSMO_IUUP_PROC_ERROR_EVENT = 3,
|
||||
};
|
||||
|
||||
enum osmo_iuup_frame_good {
|
||||
OSMO_IUUP_FRAME_GOOD = 0,
|
||||
OSMO_IUUP_FRAME_BAD = 1,
|
||||
OSMO_IUUP_FRAME_BAD_DUE_TO_RADIO = 2,
|
||||
};
|
||||
|
||||
struct osmo_iuup_hdr_ctrl {
|
||||
#if OSMO_IS_BIG_ENDIAN
|
||||
uint8_t pdu_type:4,
|
||||
ack_nack:2,
|
||||
frame_nr:2;
|
||||
uint8_t mode_version:4,
|
||||
procedure:4;
|
||||
uint8_t header_crc:6,
|
||||
payload_crc_hi:2;
|
||||
uint8_t payload_crc_lo;
|
||||
uint8_t payload[0];
|
||||
#elif OSMO_IS_LITTLE_ENDIAN
|
||||
uint8_t frame_nr:2,
|
||||
ack_nack:2,
|
||||
pdu_type:4;
|
||||
uint8_t procedure:4,
|
||||
mode_version:4;
|
||||
uint8_t payload_crc_hi:2,
|
||||
header_crc:6;
|
||||
uint8_t payload_crc_lo;
|
||||
uint8_t payload[0];
|
||||
#endif
|
||||
} __attribute__((packed));
|
||||
|
||||
union osmo_iuup_hdr_ctrl_payload {
|
||||
struct {
|
||||
#if OSMO_IS_BIG_ENDIAN
|
||||
uint8_t spare:3,
|
||||
iptis_present:1,
|
||||
subflows:3,
|
||||
chain:1;
|
||||
#elif OSMO_IS_LITTLE_ENDIAN
|
||||
uint8_t spare:3,
|
||||
iptis_present:1,
|
||||
subflows:3,
|
||||
chain:1;
|
||||
#endif
|
||||
} initialization;
|
||||
|
||||
struct {
|
||||
#if OSMO_IS_BIG_ENDIAN
|
||||
uint8_t error_distance:2,
|
||||
error_cause:6;
|
||||
#elif OSMO_IS_LITTLE_ENDIAN
|
||||
uint8_t error_cause:6,
|
||||
error_distance:2;
|
||||
#endif
|
||||
} error_event;
|
||||
};
|
||||
|
||||
extern const struct value_string osmo_iuup_error_cause_names[];
|
||||
static inline const char *osmo_iuup_error_cause_name(uint8_t val)
|
||||
{ return get_value_string(osmo_iuup_error_cause_names, val); }
|
||||
|
||||
struct osmo_iuup_hdr_data {
|
||||
#if OSMO_IS_BIG_ENDIAN
|
||||
uint8_t pdu_type:4,
|
||||
frame_nr:4;
|
||||
uint8_t frame_good:2,
|
||||
rfci:6;
|
||||
uint8_t header_crc:6,
|
||||
payload_crc_hi:2;
|
||||
uint8_t payload_crc_lo;
|
||||
#elif OSMO_IS_LITTLE_ENDIAN
|
||||
uint8_t frame_nr:4,
|
||||
pdu_type:4;
|
||||
uint8_t rfci:6,
|
||||
frame_good:2;
|
||||
uint8_t payload_crc_hi:2,
|
||||
header_crc:6;
|
||||
uint8_t payload_crc_lo;
|
||||
#endif
|
||||
uint8_t payload[0];
|
||||
} __attribute__((packed));
|
||||
|
||||
int osmo_iuup_classify(bool log_errors,
|
||||
const char *log_label,
|
||||
struct msgb *pdu,
|
||||
struct osmo_iuup_hdr_ctrl **is_ctrl,
|
||||
struct osmo_iuup_hdr_data **is_data);
|
||||
bool osmo_iuup_is_init(struct msgb *pdu);
|
||||
void osmo_iuup_make_init_ack(struct msgb *ack);
|
||||
void osmo_iuup_set_checksums(uint8_t *iuup_header_and_payload, unsigned int header_and_payload_len);
|
303
include/osmocom/mgcp/mgcp.h
Normal file
303
include/osmocom/mgcp/mgcp.h
Normal file
@@ -0,0 +1,303 @@
|
||||
/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
|
||||
|
||||
/*
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/write_queue.h>
|
||||
#include <osmocom/core/timer.h>
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#include <osmocom/mgcp/mgcp_common.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define RTP_PORT_DEFAULT_RANGE_START 16002
|
||||
#define RTP_PORT_DEFAULT_RANGE_END RTP_PORT_DEFAULT_RANGE_START + 64
|
||||
|
||||
/*
|
||||
* Handling of MGCP Endpoints and the MGCP Config
|
||||
*/
|
||||
struct mgcp_endpoint;
|
||||
struct mgcp_config;
|
||||
struct mgcp_trunk_config;
|
||||
struct mgcp_rtp_end;
|
||||
|
||||
#define MGCP_ENDP_CRCX 1
|
||||
#define MGCP_ENDP_DLCX 2
|
||||
#define MGCP_ENDP_MDCX 3
|
||||
|
||||
/*
|
||||
* what to do with the msg?
|
||||
* - continue as usual?
|
||||
* - reject and send a failure code?
|
||||
* - defer? do not send anything
|
||||
*/
|
||||
#define MGCP_POLICY_CONT 4
|
||||
#define MGCP_POLICY_REJECT 5
|
||||
#define MGCP_POLICY_DEFER 6
|
||||
|
||||
typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
|
||||
typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
|
||||
typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
|
||||
typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
|
||||
typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
|
||||
|
||||
/**
|
||||
* Return:
|
||||
* < 0 in case no audio was processed
|
||||
* >= 0 in case audio was processed. The remaining payload
|
||||
* length will be returned.
|
||||
*/
|
||||
typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
|
||||
struct mgcp_conn_rtp;
|
||||
|
||||
typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn_rtp *conn_dst,
|
||||
struct mgcp_conn_rtp *conn_src);
|
||||
|
||||
struct mgcp_rtp_codec;
|
||||
|
||||
typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
|
||||
const struct mgcp_rtp_codec **codec,
|
||||
const char **fmtp_extra,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
|
||||
/**
|
||||
* This holds information on how to allocate ports
|
||||
*/
|
||||
struct mgcp_port_range {
|
||||
/* addr or NULL to fall-back to default */
|
||||
char *bind_addr;
|
||||
|
||||
/* dynamically allocated */
|
||||
int range_start;
|
||||
int range_end;
|
||||
int last_port;
|
||||
|
||||
/* set to true to enable automatic probing
|
||||
* of the local bind IP-Address, bind_addr
|
||||
* (or its fall back) is used when automatic
|
||||
* probing fails */
|
||||
bool bind_addr_probe;
|
||||
};
|
||||
|
||||
/* There are up to three modes in which the keep-alive dummy packet can be
|
||||
* sent. The behaviour is controlled via the keepalive_interval member of the
|
||||
* trunk config. If that member is set to 0 (MGCP_KEEPALIVE_NEVER) no dummy-
|
||||
* packet is sent at all and the timer that sends regular dummy packets
|
||||
* is no longer scheduled. If the keepalive_interval is set to -1, only
|
||||
* one dummy packet is sent when an CRCX or an MDCX is performed. No timer
|
||||
* is scheduled. For all vales greater 0, the timer is scheduled and the
|
||||
* value is used as interval. See also mgcp_keepalive_timer_cb(),
|
||||
* handle_modify_con(), and handle_create_con() */
|
||||
#define MGCP_KEEPALIVE_ONCE (-1)
|
||||
#define MGCP_KEEPALIVE_NEVER 0
|
||||
|
||||
/* Global MCGP CRCX related rate counters */
|
||||
enum {
|
||||
MGCP_CRCX_SUCCESS,
|
||||
MGCP_CRCX_FAIL_BAD_ACTION,
|
||||
MGCP_CRCX_FAIL_UNHANDLED_PARAM,
|
||||
MGCP_CRCX_FAIL_MISSING_CALLID,
|
||||
MGCP_CRCX_FAIL_INVALID_MODE,
|
||||
MGCP_CRCX_FAIL_LIMIT_EXCEEDED,
|
||||
MGCP_CRCX_FAIL_UNKNOWN_CALLID,
|
||||
MGCP_CRCX_FAIL_ALLOC_CONN,
|
||||
MGCP_CRCX_FAIL_NO_REMOTE_CONN_DESC,
|
||||
MGCP_CRCX_FAIL_START_RTP,
|
||||
MGCP_CRCX_FAIL_REJECTED_BY_POLICY,
|
||||
MGCP_CRCX_FAIL_NO_OSMUX,
|
||||
MGCP_CRCX_FAIL_INVALID_CONN_OPTIONS,
|
||||
MGCP_CRCX_FAIL_CODEC_NEGOTIATION,
|
||||
MGCP_CRCX_FAIL_BIND_PORT,
|
||||
};
|
||||
|
||||
/* Global MCGP MDCX related rate counters */
|
||||
enum {
|
||||
MGCP_MDCX_SUCCESS,
|
||||
MGCP_MDCX_FAIL_WILDCARD,
|
||||
MGCP_MDCX_FAIL_NO_CONN,
|
||||
MGCP_MDCX_FAIL_INVALID_CALLID,
|
||||
MGCP_MDCX_FAIL_INVALID_CONNID,
|
||||
MGCP_MDCX_FAIL_UNHANDLED_PARAM,
|
||||
MGCP_MDCX_FAIL_NO_CONNID,
|
||||
MGCP_MDCX_FAIL_CONN_NOT_FOUND,
|
||||
MGCP_MDCX_FAIL_INVALID_MODE,
|
||||
MGCP_MDCX_FAIL_INVALID_CONN_OPTIONS,
|
||||
MGCP_MDCX_FAIL_NO_REMOTE_CONN_DESC,
|
||||
MGCP_MDCX_FAIL_START_RTP,
|
||||
MGCP_MDCX_FAIL_REJECTED_BY_POLICY,
|
||||
MGCP_MDCX_DEFERRED_BY_POLICY
|
||||
};
|
||||
|
||||
/* Global MCGP DLCX related rate counters */
|
||||
enum {
|
||||
MGCP_DLCX_SUCCESS,
|
||||
MGCP_DLCX_FAIL_WILDCARD,
|
||||
MGCP_DLCX_FAIL_NO_CONN,
|
||||
MGCP_DLCX_FAIL_INVALID_CALLID,
|
||||
MGCP_DLCX_FAIL_INVALID_CONNID,
|
||||
MGCP_DLCX_FAIL_UNHANDLED_PARAM,
|
||||
MGCP_DLCX_FAIL_REJECTED_BY_POLICY,
|
||||
MGCP_DLCX_DEFERRED_BY_POLICY,
|
||||
};
|
||||
|
||||
struct mgcp_trunk_config {
|
||||
struct llist_head entry;
|
||||
|
||||
struct mgcp_config *cfg;
|
||||
|
||||
int trunk_nr;
|
||||
int trunk_type;
|
||||
|
||||
char *audio_fmtp_extra;
|
||||
char *audio_name;
|
||||
int audio_payload;
|
||||
int audio_send_ptime;
|
||||
int audio_send_name;
|
||||
int audio_loop;
|
||||
|
||||
int no_audio_transcoding;
|
||||
|
||||
int omit_rtcp;
|
||||
int keepalive_interval;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* 0: don't, 1: once */
|
||||
int force_aligned_timing;
|
||||
bool rfc5993_hr_convert;
|
||||
|
||||
/* spec handling */
|
||||
int force_realloc;
|
||||
|
||||
/* timer */
|
||||
struct osmo_timer_list keepalive_timer;
|
||||
|
||||
/* When set, incoming RTP packets are not filtered
|
||||
* when ports and ip-address do not match (debug) */
|
||||
int rtp_accept_all;
|
||||
|
||||
unsigned int number_endpoints;
|
||||
int vty_number_endpoints;
|
||||
struct mgcp_endpoint *endpoints;
|
||||
|
||||
/* Rate counter group which contains stats for processed CRCX commands. */
|
||||
struct rate_ctr_group *mgcp_crcx_ctr_group;
|
||||
/* Rate counter group which contains stats for processed MDCX commands. */
|
||||
struct rate_ctr_group *mgcp_mdcx_ctr_group;
|
||||
/* Rate counter group which contains stats for processed DLCX commands. */
|
||||
struct rate_ctr_group *mgcp_dlcx_ctr_group;
|
||||
/* Rate counter group which aggregates stats of individual RTP connections. */
|
||||
struct rate_ctr_group *all_rtp_conn_stats;
|
||||
};
|
||||
|
||||
enum mgcp_role {
|
||||
MGCP_BSC = 0,
|
||||
MGCP_BSC_NAT,
|
||||
};
|
||||
|
||||
struct mgcp_config {
|
||||
int source_port;
|
||||
char *local_ip;
|
||||
char *source_addr;
|
||||
char *call_agent_addr;
|
||||
|
||||
/* RTP processing */
|
||||
mgcp_processing rtp_processing_cb;
|
||||
mgcp_processing_setup setup_rtp_processing_cb;
|
||||
|
||||
mgcp_get_format get_net_downlink_format_cb;
|
||||
|
||||
struct osmo_wqueue gw_fd;
|
||||
|
||||
struct mgcp_port_range net_ports;
|
||||
int endp_dscp;
|
||||
|
||||
int force_ptime;
|
||||
|
||||
mgcp_change change_cb;
|
||||
mgcp_policy policy_cb;
|
||||
mgcp_reset reset_cb;
|
||||
mgcp_realloc realloc_cb;
|
||||
mgcp_rqnt rqnt_cb;
|
||||
void *data;
|
||||
|
||||
uint32_t last_call_id;
|
||||
|
||||
/* trunk handling */
|
||||
struct mgcp_trunk_config trunk;
|
||||
struct llist_head trunks;
|
||||
|
||||
enum mgcp_role role;
|
||||
|
||||
/* osmux translator: 0 means disabled, 1 means enabled */
|
||||
int osmux;
|
||||
/* addr to bind the server to */
|
||||
char *osmux_addr;
|
||||
/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
|
||||
* the osmux socket is already initialized.
|
||||
*/
|
||||
int osmux_init;
|
||||
/* osmux batch factor: from 1 to 4 maximum */
|
||||
int osmux_batch;
|
||||
/* osmux batch size (in bytes) */
|
||||
int osmux_batch_size;
|
||||
/* osmux port */
|
||||
uint16_t osmux_port;
|
||||
/* Pad circuit with dummy messages until we see the first voice
|
||||
* message.
|
||||
*/
|
||||
uint16_t osmux_dummy;
|
||||
/* domain name of the media gateway */
|
||||
char domain[255+1];
|
||||
|
||||
/* time after which inactive connections (CIs) get closed */
|
||||
int conn_timeout;
|
||||
};
|
||||
|
||||
/* config management */
|
||||
struct mgcp_config *mgcp_config_alloc(void);
|
||||
int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
|
||||
enum mgcp_role role);
|
||||
int mgcp_vty_init(void);
|
||||
int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
|
||||
void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
|
||||
|
||||
/*
|
||||
* format helper functions
|
||||
*/
|
||||
struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
|
||||
|
||||
|
||||
int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
|
||||
int mgcp_send_reset_all(struct mgcp_config *cfg);
|
||||
|
||||
|
||||
int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
|
||||
int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
|
9
include/osmocom/mgcp/mgcp_codec.h
Normal file
9
include/osmocom/mgcp/mgcp_codec.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
void mgcp_codec_summary(struct mgcp_conn_rtp *conn);
|
||||
void mgcp_codec_reset_all(struct mgcp_conn_rtp *conn);
|
||||
int mgcp_codec_add(struct mgcp_conn_rtp *conn, int payload_type, const char *audio_name, const struct mgcp_codec_param *param);
|
||||
int mgcp_codec_decide(struct mgcp_conn_rtp *conn);
|
||||
int mgcp_codec_pt_translate(struct mgcp_conn_rtp *conn_src, struct mgcp_conn_rtp *conn_dst, int payload_type);
|
||||
const struct mgcp_rtp_codec *mgcp_codec_pt_find_by_subtype_name(struct mgcp_conn_rtp *conn,
|
||||
const char *subtype_name, unsigned int match_nr);
|
107
include/osmocom/mgcp/mgcp_common.h
Normal file
107
include/osmocom/mgcp/mgcp_common.h
Normal file
@@ -0,0 +1,107 @@
|
||||
/* MGCP common implementations.
|
||||
* These are used in libosmo-mgcp as well as libosmo-mgcp-client.
|
||||
* To avoid interdependency, these are implemented in .h file only. */
|
||||
|
||||
/*
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* (C) 2009-2012 by On-Waves
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Two copies of this file are kept in osmocom/mgcp/ and osmocom/mgcp_client/.
|
||||
* Since both are by definition identical, use the old header exclusion ifdefs
|
||||
* instead of '#pragma once' to avoid including both of these files.
|
||||
* Though at the time of writing there are no such users, this allows including
|
||||
* both libosmo-mgcp and libosmo-mgcp-client headers in the same file. */
|
||||
#ifndef OSMO_MGCP_COMMON_H
|
||||
#define OSMO_MGCP_COMMON_H
|
||||
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/logging.h>
|
||||
|
||||
#define for_each_non_empty_line(line, save) \
|
||||
for (line = strtok_r(NULL, "\r\n", &save); line; \
|
||||
line = strtok_r(NULL, "\r\n", &save))
|
||||
|
||||
enum mgcp_connection_mode {
|
||||
MGCP_CONN_NONE = 0,
|
||||
MGCP_CONN_RECV_ONLY = 1,
|
||||
MGCP_CONN_SEND_ONLY = 2,
|
||||
MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
|
||||
MGCP_CONN_LOOPBACK = 4 | MGCP_CONN_RECV_SEND,
|
||||
};
|
||||
|
||||
#define MGCP_X_OSMO_IGN_HEADER "X-Osmo-IGN:"
|
||||
#define MGCP_X_OSMO_OSMUX_HEADER "X-Osmux:"
|
||||
|
||||
/* Values should be bitwise-OR-able */
|
||||
enum mgcp_x_osmo_ign {
|
||||
MGCP_X_OSMO_IGN_NONE = 0,
|
||||
MGCP_X_OSMO_IGN_CALLID = 1,
|
||||
};
|
||||
|
||||
/* Codec parameters (communicated via SDP/fmtp) */
|
||||
struct mgcp_codec_param {
|
||||
bool amr_octet_aligned_present;
|
||||
bool amr_octet_aligned;
|
||||
};
|
||||
|
||||
/* Ensure that the msg->l2h is NUL terminated. */
|
||||
static inline int mgcp_msg_terminate_nul(struct msgb *msg)
|
||||
{
|
||||
unsigned char *tail = msg->l2h + msgb_l2len(msg); /* char after l2 data */
|
||||
if (tail[-1] == '\0')
|
||||
/* nothing to do */;
|
||||
else if (msgb_tailroom(msg) > 0)
|
||||
tail[0] = '\0';
|
||||
else if (tail[-1] == '\r' || tail[-1] == '\n')
|
||||
tail[-1] = '\0';
|
||||
else {
|
||||
LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: "
|
||||
"Length: %d, Buffer size: %d\n",
|
||||
msgb_l2len(msg), msg->data_len);
|
||||
return -ENOTSUP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Maximum length of the comment field */
|
||||
#define MGCP_COMMENT_MAXLEN 256
|
||||
|
||||
/* Maximum allowed String length of Connection Identifiers as per spec
|
||||
* (see also RFC3435 2.1.3.2 Names of Connections), plus one for '\0'. */
|
||||
#define MGCP_CONN_ID_MAXLEN 32+1
|
||||
|
||||
/* Deprecated: old name of MGCP_CONN_ID_MAXLEN. */
|
||||
#define MGCP_CONN_ID_LENGTH MGCP_CONN_ID_MAXLEN
|
||||
|
||||
/* String length of Endpoint Identifiers.
|
||||
/ (see also RFC3435 section 3.2.1.3) */
|
||||
#define MGCP_ENDPOINT_MAXLEN (255*2+1+1)
|
||||
|
||||
/* A prefix to denote the virtual trunk (RTP on both ends) */
|
||||
#define MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK "rtpbridge/"
|
||||
|
||||
/* Maximal number of payload types / codecs that can be negotiated via SDP at
|
||||
* at once. */
|
||||
#define MGCP_MAX_CODECS 10
|
||||
|
||||
#endif
|
80
include/osmocom/mgcp/mgcp_conn.h
Normal file
80
include/osmocom/mgcp/mgcp_conn.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/* Message connection list handling */
|
||||
|
||||
/*
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/mgcp/mgcp_internal.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/rate_ctr.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
/* RTP connection related counters */
|
||||
enum {
|
||||
IN_STREAM_ERR_TSTMP_CTR,
|
||||
OUT_STREAM_ERR_TSTMP_CTR,
|
||||
RTP_PACKETS_RX_CTR,
|
||||
RTP_OCTETS_RX_CTR,
|
||||
RTP_PACKETS_TX_CTR,
|
||||
RTP_OCTETS_TX_CTR,
|
||||
RTP_DROPPED_PACKETS_CTR,
|
||||
RTP_NUM_CONNECTIONS,
|
||||
};
|
||||
|
||||
/* RTP per-connection statistics. Instances of the corresponding rate counter group
|
||||
* exist for the lifetime of an RTP connection.
|
||||
* Must be kept in sync with all_rtp_conn_rate_ctr_desc below */
|
||||
static const struct rate_ctr_desc mgcp_conn_rate_ctr_desc[] = {
|
||||
[IN_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:in", "Inbound rtp-stream timestamp errors."},
|
||||
[OUT_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:out", "Outbound rtp-stream timestamp errors."},
|
||||
[RTP_PACKETS_RX_CTR] = {"rtp:packets_rx", "Inbound rtp packets."},
|
||||
[RTP_OCTETS_RX_CTR] = {"rtp:octets_rx", "Inbound rtp octets."},
|
||||
[RTP_PACKETS_TX_CTR] = {"rtp:packets_tx", "Outbound rtp packets."},
|
||||
[RTP_OCTETS_TX_CTR] = {"rtp:octets_tx", "Outbound rtp octets."},
|
||||
[RTP_DROPPED_PACKETS_CTR] = {"rtp:dropped", "dropped rtp packets."}
|
||||
};
|
||||
|
||||
/* Aggregated RTP connection stats. These are updated when an RTP connection is freed.
|
||||
* Must be kept in sync with mgcp_conn_rate_ctr_desc above */
|
||||
static const struct rate_ctr_desc all_rtp_conn_rate_ctr_desc[] = {
|
||||
[IN_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_in", "Total inbound rtp-stream timestamp errors."},
|
||||
[OUT_STREAM_ERR_TSTMP_CTR] = {"all_rtp:err_tstmp_out", "Total outbound rtp-stream timestamp errors."},
|
||||
[RTP_PACKETS_RX_CTR] = {"all_rtp:packets_rx", "Total inbound rtp packets."},
|
||||
[RTP_OCTETS_RX_CTR] = {"all_rtp:octets_rx", "Total inbound rtp octets."},
|
||||
[RTP_PACKETS_TX_CTR] = {"all_rtp:packets_tx", "Total outbound rtp packets."},
|
||||
[RTP_OCTETS_TX_CTR] = {"all_rtp:octets_tx", "Total outbound rtp octets."},
|
||||
[RTP_DROPPED_PACKETS_CTR] = {"all_rtp:dropped", "Total dropped rtp packets."},
|
||||
|
||||
/* This last counter does not exist in per-connection stats, only here. */
|
||||
[RTP_NUM_CONNECTIONS] = {"all_rtp:num_closed_conns", "Total number of rtp connections closed."}
|
||||
};
|
||||
|
||||
struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
|
||||
enum mgcp_conn_type type, char *name);
|
||||
struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, const char *id);
|
||||
struct mgcp_conn_rtp *mgcp_conn_get_rtp(struct mgcp_endpoint *endp,
|
||||
const char *id);
|
||||
void mgcp_conn_free(struct mgcp_endpoint *endp, const char *id);
|
||||
void mgcp_conn_free_oldest(struct mgcp_endpoint *endp);
|
||||
void mgcp_conn_free_all(struct mgcp_endpoint *endp);
|
||||
char *mgcp_conn_dump(struct mgcp_conn *conn);
|
||||
struct mgcp_conn *mgcp_find_dst_conn(struct mgcp_conn *conn);
|
113
include/osmocom/mgcp/mgcp_endp.h
Normal file
113
include/osmocom/mgcp/mgcp_endp.h
Normal file
@@ -0,0 +1,113 @@
|
||||
/* Endpoint types */
|
||||
|
||||
/*
|
||||
* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
|
||||
struct sockaddr_in;
|
||||
struct mgcp_conn;
|
||||
struct mgcp_conn_rtp;
|
||||
struct mgcp_endpoint;
|
||||
|
||||
struct osmo_rtp_msg_ctx {
|
||||
int proto;
|
||||
struct mgcp_conn_rtp *conn_src;
|
||||
struct sockaddr_in *from_addr;
|
||||
};
|
||||
|
||||
#define OSMO_RTP_MSG_CTX(MSGB) (*(struct osmo_rtp_msg_ctx**)&((MSGB)->dst))
|
||||
|
||||
#define LOG_ENDP(endp, level, fmt, args...) \
|
||||
LOGP(DRTP, level, "%x@ " fmt, ENDPOINT_NUMBER(endp), ## args)
|
||||
|
||||
/* Callback type for RTP dispatcher functions (e.g mgcp_dispatch_rtp_bridge_cb, see below).
|
||||
* The OSMO_RTP_MSG_CTX() should be set appropriately on the msg. */
|
||||
typedef int (*mgcp_dispatch_rtp_cb) (struct msgb *msg);
|
||||
|
||||
/* Callback type for endpoint specific cleanup actions. This function
|
||||
* is automatically executed when a connection is freed (see mgcp_conn_free()
|
||||
* in mgcp_conn.c). Depending on the type of the endpoint there may be endpoint
|
||||
* specific things to take care of once a connection has been removed. */
|
||||
typedef void (*mgcp_cleanup_cp) (struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn *conn);
|
||||
|
||||
/*! MGCP endpoint properties */
|
||||
struct mgcp_endpoint_type {
|
||||
/*! maximum number of connections */
|
||||
int max_conns;
|
||||
|
||||
/*! callback that defines how to dispatch incoming RTP data */
|
||||
mgcp_dispatch_rtp_cb dispatch_rtp_cb;
|
||||
|
||||
/*! callback that implements endpoint specific cleanup actions */
|
||||
mgcp_cleanup_cp cleanup_cb;
|
||||
};
|
||||
|
||||
/*! MGCP endpoint typeset */
|
||||
struct mgcp_endpoint_typeset {
|
||||
struct mgcp_endpoint_type rtp;
|
||||
};
|
||||
|
||||
/*! static MGCP endpoint typeset (pre-initalized, read-only) */
|
||||
extern const struct mgcp_endpoint_typeset ep_typeset;
|
||||
|
||||
/*! MGCP endpoint model */
|
||||
struct mgcp_endpoint {
|
||||
|
||||
/*! Call identifier string (as supplied by the call agant) */
|
||||
char *callid;
|
||||
|
||||
/*! Local connection options (see mgcp_internal.h) */
|
||||
struct mgcp_lco local_options;
|
||||
|
||||
/*! List of struct mgcp_conn, of the connections active on this endpoint */
|
||||
struct llist_head conns;
|
||||
|
||||
/*! Backpointer to the MGW configuration */
|
||||
struct mgcp_config *cfg;
|
||||
|
||||
/*! Backpointer to the Trunk specific configuration */
|
||||
struct mgcp_trunk_config *tcfg;
|
||||
|
||||
/*! Endpoint properties (see above) */
|
||||
const struct mgcp_endpoint_type *type;
|
||||
|
||||
/*! Last MGCP transmission (in case re-transmission is required) */
|
||||
char *last_trans;
|
||||
|
||||
/*! Last MGCP response (in case re-transmission is required) */
|
||||
char *last_response;
|
||||
|
||||
/*! Memorize if this endpoint was choosen by the MGW (wildcarded, true)
|
||||
* or if the user has choosen the particular endpoint explicitly. */
|
||||
bool wildcarded_req;
|
||||
|
||||
/*! MGCP_X_OSMO_IGN_* flags from 'X-Osmo-IGN:' header */
|
||||
uint32_t x_osmo_ign;
|
||||
};
|
||||
|
||||
/*! Extract endpoint number for a given endpoint */
|
||||
#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
|
||||
|
||||
void mgcp_endp_release(struct mgcp_endpoint *endp);
|
365
include/osmocom/mgcp/mgcp_internal.h
Normal file
365
include/osmocom/mgcp/mgcp_internal.h
Normal file
@@ -0,0 +1,365 @@
|
||||
/* 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"
|
||||
|
||||
#define LOG_CONN(conn, level, fmt, args...) \
|
||||
LOGP(DRTP, level, "(%d@ I:%s) " fmt, \
|
||||
ENDPOINT_NUMBER((conn)->endp), (conn)->id, ## args)
|
||||
|
||||
#define LOG_CONN_RTP(conn_rtp, level, fmt, args...) \
|
||||
LOG_CONN(conn_rtp->conn, level, fmt, ## args)
|
||||
|
||||
enum mgcp_trunk_type {
|
||||
MGCP_TRUNK_VIRTUAL,
|
||||
MGCP_TRUNK_E1,
|
||||
};
|
||||
|
||||
struct mgcp_rtp_stream_state {
|
||||
uint32_t ssrc;
|
||||
uint16_t last_seq;
|
||||
uint32_t last_timestamp;
|
||||
struct rate_ctr *err_ts_ctr;
|
||||
int32_t last_tsdelta;
|
||||
uint32_t last_arrival_time;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_state {
|
||||
/* has this state structure been initialized? */
|
||||
int initialized;
|
||||
|
||||
struct {
|
||||
/* are we patching the SSRC value? */
|
||||
int patch_ssrc;
|
||||
/* original SSRC (to which we shall patch any different SSRC) */
|
||||
uint32_t orig_ssrc;
|
||||
/* offset to apply on the sequence number */
|
||||
int seq_offset;
|
||||
/* offset to apply on the timestamp number */
|
||||
int32_t timestamp_offset;
|
||||
} patch;
|
||||
|
||||
/* duration of a packet (FIXME: in which unit?) */
|
||||
uint32_t packet_duration;
|
||||
|
||||
struct mgcp_rtp_stream_state in_stream;
|
||||
struct mgcp_rtp_stream_state out_stream;
|
||||
|
||||
/* jitter and packet loss calculation */
|
||||
struct {
|
||||
int initialized;
|
||||
uint16_t base_seq;
|
||||
uint16_t max_seq;
|
||||
uint32_t ssrc;
|
||||
uint32_t jitter;
|
||||
int32_t transit;
|
||||
int cycles;
|
||||
} stats;
|
||||
|
||||
bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
|
||||
};
|
||||
|
||||
struct mgcp_rtp_codec {
|
||||
uint32_t rate;
|
||||
int channels;
|
||||
uint32_t frame_duration_num;
|
||||
uint32_t frame_duration_den;
|
||||
|
||||
int payload_type;
|
||||
char *audio_name;
|
||||
char *subtype_name;
|
||||
|
||||
bool param_present;
|
||||
struct mgcp_codec_param param;
|
||||
};
|
||||
|
||||
/* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */
|
||||
struct mgcp_rtp_end {
|
||||
/* local IP address of the RTP socket */
|
||||
struct in_addr addr;
|
||||
|
||||
/* in network byte order */
|
||||
int rtp_port, rtcp_port;
|
||||
|
||||
/* currently selected audio codec */
|
||||
struct mgcp_rtp_codec *codec;
|
||||
|
||||
/* array with assigned audio codecs to choose from (SDP) */
|
||||
struct mgcp_rtp_codec codecs[MGCP_MAX_CODECS];
|
||||
|
||||
/* number of assigned audio codecs (SDP) */
|
||||
unsigned int codecs_assigned;
|
||||
|
||||
/* per endpoint data */
|
||||
int frames_per_packet;
|
||||
uint32_t packet_duration_ms;
|
||||
int maximum_packet_time; /* -1: not set */
|
||||
char *fmtp_extra;
|
||||
/* are we transmitting packets (1) or dropping (0) outbound packets */
|
||||
int output_enabled;
|
||||
/* FIXME: This parameter can be set + printed, but is nowhere used! */
|
||||
int force_output_ptime;
|
||||
|
||||
/* RTP patching */
|
||||
int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
|
||||
/* should we perform align_rtp_timestamp_offset() (1) or not (0) */
|
||||
int force_aligned_timing;
|
||||
bool rfc5993_hr_convert;
|
||||
|
||||
/* Each end has a separate socket for RTP and RTCP */
|
||||
struct osmo_fd rtp;
|
||||
struct osmo_fd rtcp;
|
||||
|
||||
/* local UDP port number of the RTP socket; RTCP is +1 */
|
||||
int local_port;
|
||||
};
|
||||
|
||||
struct mgcp_rtp_tap {
|
||||
/* is this tap active (1) or not (0) */
|
||||
int enabled;
|
||||
/* IP/port to which we're forwarding the tapped data */
|
||||
struct sockaddr_in forward;
|
||||
};
|
||||
|
||||
struct mgcp_lco {
|
||||
char *string;
|
||||
char *codec;
|
||||
int pkt_period_min; /* time in ms */
|
||||
int pkt_period_max; /* time in ms */
|
||||
};
|
||||
|
||||
/* Specific rtp connection type (see struct mgcp_conn_rtp) */
|
||||
enum mgcp_conn_rtp_type {
|
||||
MGCP_RTP_DEFAULT = 0,
|
||||
MGCP_OSMUX_BSC,
|
||||
MGCP_OSMUX_BSC_NAT,
|
||||
};
|
||||
|
||||
#include <osmocom/mgcp/osmux.h>
|
||||
struct mgcp_conn;
|
||||
|
||||
/* MGCP connection (RTP) */
|
||||
struct mgcp_conn_rtp {
|
||||
|
||||
/* Backpointer to conn struct */
|
||||
struct mgcp_conn *conn;
|
||||
|
||||
/* Specific connection type */
|
||||
enum mgcp_conn_rtp_type type;
|
||||
|
||||
/* Port status */
|
||||
struct mgcp_rtp_end end;
|
||||
|
||||
/* Sequence bits */
|
||||
struct mgcp_rtp_state state;
|
||||
|
||||
/* taps for the rtp connection; one per direction */
|
||||
struct mgcp_rtp_tap tap_in;
|
||||
struct mgcp_rtp_tap tap_out;
|
||||
|
||||
/* Osmux states (optional) */
|
||||
struct {
|
||||
/* Osmux state: disabled, activating, active */
|
||||
enum osmux_state state;
|
||||
/* Is cid holding valid data? is it allocated from pool? */
|
||||
bool cid_allocated;
|
||||
/* Allocated Osmux circuit ID for this conn */
|
||||
uint8_t cid;
|
||||
/* handle to batch messages */
|
||||
struct osmux_in_handle *in;
|
||||
/* handle to unbatch messages */
|
||||
struct osmux_out_handle out;
|
||||
/* statistics */
|
||||
struct {
|
||||
uint32_t chunks;
|
||||
uint32_t octets;
|
||||
} stats;
|
||||
} osmux;
|
||||
|
||||
struct rate_ctr_group *rate_ctr_group;
|
||||
|
||||
struct osmo_iuup_cn *iuup;
|
||||
};
|
||||
|
||||
/*! Connection type, specifies which member of the union "u" in mgcp_conn
|
||||
* contains a useful connection description (currently only RTP) */
|
||||
enum mgcp_conn_type {
|
||||
MGCP_CONN_TYPE_RTP,
|
||||
};
|
||||
|
||||
/*! MGCP connection (untyped) */
|
||||
struct mgcp_conn {
|
||||
/*! list head */
|
||||
struct llist_head entry;
|
||||
|
||||
/*! Backpointer to the endpoint where the conn belongs to */
|
||||
struct mgcp_endpoint *endp;
|
||||
|
||||
/*! type of the connection (union) */
|
||||
enum mgcp_conn_type type;
|
||||
|
||||
/*! mode of the connection */
|
||||
enum mgcp_connection_mode mode;
|
||||
|
||||
/*! copy of the mode to restore the original setting (VTY) */
|
||||
enum mgcp_connection_mode mode_orig;
|
||||
|
||||
/*! connection id to identify the connection */
|
||||
char id[MGCP_CONN_ID_MAXLEN];
|
||||
|
||||
/*! human readable name (vty, logging) */
|
||||
char name[256];
|
||||
|
||||
/*! activity tracker (for cleaning up inactive connections) */
|
||||
struct osmo_timer_list watchdog;
|
||||
|
||||
/*! union with connection description */
|
||||
union {
|
||||
struct mgcp_conn_rtp rtp;
|
||||
} u;
|
||||
|
||||
/*! pointer to optional private data */
|
||||
void *priv;
|
||||
};
|
||||
|
||||
#include <osmocom/mgcp/mgcp_conn.h>
|
||||
|
||||
struct mgcp_endpoint_type;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Internal structure while parsing a request
|
||||
*/
|
||||
struct mgcp_parse_data {
|
||||
struct mgcp_config *cfg;
|
||||
struct mgcp_endpoint *endp;
|
||||
char *trans;
|
||||
char *save;
|
||||
};
|
||||
|
||||
int mgcp_send(struct mgcp_endpoint *endp, int is_rtp, struct sockaddr_in *addr,
|
||||
struct msgb *msg, struct mgcp_conn_rtp *conn_src,
|
||||
struct mgcp_conn_rtp *conn_dst);
|
||||
int mgcp_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
|
||||
int mgcp_dispatch_rtp_bridge_cb(struct msgb *msg);
|
||||
void mgcp_cleanup_rtp_bridge_cb(struct mgcp_endpoint *endp, struct mgcp_conn *conn);
|
||||
int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
void mgcp_free_rtp_port(struct mgcp_rtp_end *end);
|
||||
|
||||
/* For transcoding we need to manage an in and an output that are connected */
|
||||
static inline int endp_back_channel(int endpoint)
|
||||
{
|
||||
return endpoint + 60;
|
||||
}
|
||||
|
||||
struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
|
||||
struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
|
||||
|
||||
char *get_lco_identifier(const char *options);
|
||||
int check_local_cx_options(void *ctx, const char *options);
|
||||
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_end *rtp);
|
||||
|
||||
/* payload processing default functions */
|
||||
int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
|
||||
char *data, int *len, int buf_size);
|
||||
|
||||
int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn_rtp *conn_dst,
|
||||
struct mgcp_conn_rtp *conn_src);
|
||||
|
||||
void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
|
||||
const struct mgcp_rtp_codec **codec,
|
||||
const char **fmtp_extra,
|
||||
struct mgcp_conn_rtp *conn);
|
||||
|
||||
/* internal RTP Annex A counting */
|
||||
void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
|
||||
const uint16_t seq, const int32_t transit,
|
||||
const uint32_t ssrc);
|
||||
|
||||
int mgcp_set_ip_tos(int fd, int tos);
|
||||
|
||||
/* Was conn configured to handle Osmux? */
|
||||
static inline bool mgcp_conn_rtp_is_osmux(const struct mgcp_conn_rtp *conn) {
|
||||
return conn->type == MGCP_OSMUX_BSC || conn->type == MGCP_OSMUX_BSC_NAT;
|
||||
}
|
||||
|
||||
enum {
|
||||
MGCP_DEST_NET = 0,
|
||||
MGCP_DEST_BTS,
|
||||
};
|
||||
|
||||
|
||||
#define MGCP_DUMMY_LOAD 0x23
|
||||
|
||||
|
||||
/**
|
||||
* SDP related information
|
||||
*/
|
||||
/* Assume audio frame length of 20ms */
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
|
||||
#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
|
||||
#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_RATE 8000
|
||||
#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
|
||||
|
||||
#define PTYPE_UNDEFINED (-1)
|
||||
|
||||
void mgcp_get_local_addr(char *addr, struct mgcp_conn_rtp *conn);
|
||||
void mgcp_conn_watchdog_kick(struct mgcp_conn *conn);
|
||||
|
||||
#define LOGPENDP(endp, cat, level, fmt, args...) \
|
||||
LOGP(cat, level, "endpoint:0x%x " fmt, \
|
||||
endp ? ENDPOINT_NUMBER(endp) : -1, \
|
||||
## args)
|
||||
|
||||
#define LOGPCONN(conn, cat, level, fmt, args...) \
|
||||
LOGPENDP((conn)->endp, cat, level, "CI:%s " fmt, \
|
||||
(conn)->id, \
|
||||
## args)
|
||||
|
||||
void mgcp_patch_and_count(struct mgcp_endpoint *endp,
|
||||
struct mgcp_rtp_state *state,
|
||||
struct mgcp_rtp_end *rtp_end,
|
||||
struct sockaddr_in *addr, struct msgb *msg);
|
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,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#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_conn_rtp *conn, uint32_t *expected, int *loss);
|
||||
|
||||
/* Exposed for test purposes only, do not use actively */
|
||||
uint32_t calc_jitter(struct mgcp_rtp_state *);
|
39
include/osmocom/mgcp/osmux.h
Normal file
39
include/osmocom/mgcp/osmux.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <osmocom/netif/osmux.h>
|
||||
struct mgcp_conn_rtp;
|
||||
|
||||
#define OSMUX_PORT 1984
|
||||
|
||||
enum {
|
||||
OSMUX_ROLE_BSC = 0,
|
||||
OSMUX_ROLE_BSC_NAT,
|
||||
};
|
||||
|
||||
int osmux_init(int role, struct mgcp_config *cfg);
|
||||
int osmux_enable_conn(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn,
|
||||
struct in_addr *addr, uint16_t port);
|
||||
void conn_osmux_disable(struct mgcp_conn_rtp *conn);
|
||||
int conn_osmux_allocate_cid(struct mgcp_conn_rtp *conn, int osmux_cid);
|
||||
void conn_osmux_release_cid(struct mgcp_conn_rtp *conn);
|
||||
int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn);
|
||||
int osmux_send_dummy(struct mgcp_endpoint *endp, struct mgcp_conn_rtp *conn);
|
||||
|
||||
void osmux_cid_pool_get(uint8_t osmux_cid);
|
||||
int osmux_cid_pool_get_next(void);
|
||||
void osmux_cid_pool_put(uint8_t osmux_cid);
|
||||
bool osmux_cid_pool_allocated(uint8_t osmux_cid);
|
||||
int osmux_cid_pool_count_used(void);
|
||||
|
||||
enum osmux_state {
|
||||
OSMUX_STATE_DISABLED = 0, /* Osmux not being currently used by endp */
|
||||
OSMUX_STATE_ACTIVATING, /* Osmux was accepted in MGCP CRCX ACK. It can now be enabled by \ref osmux_enable_endpoint. */
|
||||
OSMUX_STATE_ENABLED, /* Osmux was initialized by \ref osmux_enable_endpoint and can process frames */
|
||||
};
|
||||
|
||||
enum osmux_usage {
|
||||
OSMUX_USAGE_OFF = 0,
|
||||
OSMUX_USAGE_ON = 1,
|
||||
OSMUX_USAGE_ONLY = 2,
|
||||
};
|
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
|
165
include/osmocom/mgcp_client/mgcp_client.h
Normal file
165
include/osmocom/mgcp_client/mgcp_client.h
Normal file
@@ -0,0 +1,165 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <osmocom/mgcp_client/mgcp_common.h>
|
||||
|
||||
/* See also: RFC 3435, chapter 3.5 Transmission over UDP */
|
||||
#define MGCP_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
|
||||
#define MGCP_CLIENT_LOCAL_PORT_DEFAULT 2727
|
||||
#define MGCP_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
|
||||
#define MGCP_CLIENT_REMOTE_PORT_DEFAULT 2427
|
||||
|
||||
#define MGCP_CLIENT_MGW_STR "Configure MGCP connection to Media Gateway\n"
|
||||
|
||||
struct msgb;
|
||||
struct vty;
|
||||
struct mgcp_client;
|
||||
|
||||
struct mgcp_client_conf {
|
||||
const char *local_addr;
|
||||
int local_port;
|
||||
const char *remote_addr;
|
||||
int remote_port;
|
||||
|
||||
/* By default, we are always addressing the MGW with e.g. 'rtpbridge/123@mgw'.
|
||||
* If this is nonempty, the contained name will be used instead of 'mgw'. */
|
||||
char endpoint_domain_name[MGCP_ENDPOINT_MAXLEN];
|
||||
};
|
||||
|
||||
typedef unsigned int mgcp_trans_id_t;
|
||||
|
||||
/*! Enumeration of the codec types that mgcp_client is able to handle. */
|
||||
enum mgcp_codecs {
|
||||
CODEC_PCMU_8000_1 = 0,
|
||||
CODEC_GSM_8000_1 = 3,
|
||||
CODEC_PCMA_8000_1 = 8,
|
||||
CODEC_G729_8000_1 = 18,
|
||||
CODEC_GSMEFR_8000_1 = 110,
|
||||
CODEC_GSMHR_8000_1 = 111,
|
||||
CODEC_AMR_8000_1 = 112,
|
||||
CODEC_AMRWB_16000_1 = 113,
|
||||
};
|
||||
/* Note: when new codec types are added, the corresponding value strings
|
||||
* in mgcp_client.c (codec_table) must be updated as well. Enumerations
|
||||
* in enum mgcp_codecs must correspond to a valid payload type. However,
|
||||
* this is an internal assumption that is made to avoid lookup tables.
|
||||
* The API-User should not rely on this coincidence! */
|
||||
|
||||
extern const struct value_string osmo_mgcpc_codec_names[];
|
||||
static inline const char *osmo_mgcpc_codec_name(enum mgcp_codecs val)
|
||||
{ return get_value_string(osmo_mgcpc_codec_names, val); }
|
||||
|
||||
/*! Structure to build a payload type map to allow the defiition custom payload
|
||||
* types. */
|
||||
struct ptmap {
|
||||
/*! codec for which a payload type number should be defined */
|
||||
enum mgcp_codecs codec;
|
||||
|
||||
/*! payload type number (96-127) */
|
||||
unsigned int pt;
|
||||
};
|
||||
|
||||
struct mgcp_response_head {
|
||||
int response_code;
|
||||
mgcp_trans_id_t trans_id;
|
||||
char comment[MGCP_COMMENT_MAXLEN];
|
||||
char conn_id[MGCP_CONN_ID_MAXLEN];
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
bool x_osmo_osmux_use;
|
||||
uint8_t x_osmo_osmux_cid;
|
||||
};
|
||||
|
||||
struct mgcp_response {
|
||||
char *body;
|
||||
struct mgcp_response_head head;
|
||||
uint16_t audio_port;
|
||||
char audio_ip[INET_ADDRSTRLEN];
|
||||
unsigned int ptime;
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
unsigned int codecs_len;
|
||||
struct ptmap ptmap[MGCP_MAX_CODECS];
|
||||
unsigned int ptmap_len;
|
||||
};
|
||||
|
||||
enum mgcp_verb {
|
||||
MGCP_VERB_CRCX,
|
||||
MGCP_VERB_MDCX,
|
||||
MGCP_VERB_DLCX,
|
||||
MGCP_VERB_AUEP,
|
||||
MGCP_VERB_RSIP,
|
||||
};
|
||||
|
||||
#define MGCP_MSG_PRESENCE_ENDPOINT 0x0001
|
||||
#define MGCP_MSG_PRESENCE_CALL_ID 0x0002
|
||||
#define MGCP_MSG_PRESENCE_CONN_ID 0x0004
|
||||
#define MGCP_MSG_PRESENCE_AUDIO_IP 0x0008
|
||||
#define MGCP_MSG_PRESENCE_AUDIO_PORT 0x0010
|
||||
#define MGCP_MSG_PRESENCE_CONN_MODE 0x0020
|
||||
#define MGCP_MSG_PRESENCE_X_OSMO_OSMUX_CID 0x4000
|
||||
#define MGCP_MSG_PRESENCE_X_OSMO_IGN 0x8000
|
||||
|
||||
struct mgcp_msg {
|
||||
enum mgcp_verb verb;
|
||||
/* See MGCP_MSG_PRESENCE_* constants */
|
||||
uint32_t presence;
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
unsigned int call_id;
|
||||
char *conn_id;
|
||||
uint16_t audio_port;
|
||||
char *audio_ip;
|
||||
enum mgcp_connection_mode conn_mode;
|
||||
unsigned int ptime;
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
unsigned int codecs_len;
|
||||
struct ptmap ptmap[MGCP_MAX_CODECS];
|
||||
unsigned int ptmap_len;
|
||||
uint32_t x_osmo_ign;
|
||||
bool x_osmo_osmux_use;
|
||||
int x_osmo_osmux_cid; /* -1 is wildcard */
|
||||
bool param_present;
|
||||
struct mgcp_codec_param param;
|
||||
};
|
||||
|
||||
void mgcp_client_conf_init(struct mgcp_client_conf *conf);
|
||||
void mgcp_client_vty_init(void *talloc_ctx, int node, struct mgcp_client_conf *conf);
|
||||
int mgcp_client_config_write(struct vty *vty, const char *indent);
|
||||
struct mgcp_client_conf *mgcp_client_conf_actual(struct mgcp_client *mgcp);
|
||||
|
||||
struct mgcp_client *mgcp_client_init(void *ctx,
|
||||
struct mgcp_client_conf *conf);
|
||||
int mgcp_client_connect(struct mgcp_client *mgcp);
|
||||
|
||||
const char *mgcp_client_remote_addr_str(struct mgcp_client *mgcp);
|
||||
uint16_t mgcp_client_remote_port(struct mgcp_client *mgcp);
|
||||
uint32_t mgcp_client_remote_addr_n(struct mgcp_client *mgcp);
|
||||
|
||||
const char *mgcp_client_endpoint_domain(const struct mgcp_client *mgcp);
|
||||
const char *mgcp_client_rtpbridge_wildcard(const struct mgcp_client *mgcp);
|
||||
|
||||
/* Invoked when an MGCP response is received or sending failed. When the
|
||||
* response is passed as NULL, this indicates failure during transmission. */
|
||||
typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
|
||||
int mgcp_response_parse_params(struct mgcp_response *r);
|
||||
|
||||
int mgcp_client_tx(struct mgcp_client *mgcp, struct msgb *msg,
|
||||
mgcp_response_cb_t response_cb, void *priv);
|
||||
int mgcp_client_cancel(struct mgcp_client *mgcp, mgcp_trans_id_t trans_id);
|
||||
|
||||
enum mgcp_connection_mode;
|
||||
|
||||
struct msgb *mgcp_msg_gen(struct mgcp_client *mgcp, struct mgcp_msg *mgcp_msg);
|
||||
mgcp_trans_id_t mgcp_msg_trans_id(struct msgb *msg);
|
||||
|
||||
extern const struct value_string mgcp_client_connection_mode_strs[];
|
||||
static inline const char *mgcp_client_cmode_name(enum mgcp_connection_mode mode)
|
||||
{
|
||||
return get_value_string(mgcp_client_connection_mode_strs, mode);
|
||||
}
|
||||
|
||||
enum mgcp_codecs map_str_to_codec(const char *str);
|
||||
unsigned int map_codec_to_pt(const struct ptmap *ptmap, unsigned int ptmap_len,
|
||||
enum mgcp_codecs codec);
|
||||
enum mgcp_codecs map_pt_to_codec(struct ptmap *ptmap, unsigned int ptmap_len,
|
||||
unsigned int pt);
|
48
include/osmocom/mgcp_client/mgcp_client_endpoint_fsm.h
Normal file
48
include/osmocom/mgcp_client/mgcp_client_endpoint_fsm.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/* FSM to manage multiple connections of an MGW endpoint */
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/mgcp_client/mgcp_client_fsm.h>
|
||||
|
||||
#define LOG_MGCPC_EP(ep, level, fmt, args...) do { \
|
||||
LOGPFSML(ep->fi, level, "%s " fmt, \
|
||||
osmo_mgcpc_ep_name(ep), ## args); \
|
||||
} while(0)
|
||||
|
||||
struct osmo_mgcpc_ep;
|
||||
struct osmo_mgcpc_ep_ci;
|
||||
struct osmo_tdef;
|
||||
|
||||
struct osmo_mgcpc_ep *osmo_mgcpc_ep_alloc(struct osmo_fsm_inst *parent, uint32_t parent_term_event,
|
||||
struct mgcp_client *mgcp_client,
|
||||
const struct osmo_tdef *T_defs,
|
||||
const char *fsm_id,
|
||||
const char *endpoint_str_fmt, ...);
|
||||
|
||||
struct osmo_mgcpc_ep_ci *osmo_mgcpc_ep_ci_add(struct osmo_mgcpc_ep *ep, const char *label_fmt, ...);
|
||||
const struct mgcp_conn_peer *osmo_mgcpc_ep_ci_get_rtp_info(const struct osmo_mgcpc_ep_ci *ci);
|
||||
bool osmo_mgcpc_ep_ci_get_crcx_info_to_sockaddr(const struct osmo_mgcpc_ep_ci *ci, struct sockaddr_storage *dest);
|
||||
bool osmo_mgcpc_ep_ci_get_crcx_info_to_osmux_cid(const struct osmo_mgcpc_ep_ci *ci, uint8_t* cid);
|
||||
|
||||
void osmo_mgcpc_ep_ci_request(struct osmo_mgcpc_ep_ci *ci,
|
||||
enum mgcp_verb verb, const struct mgcp_conn_peer *verb_info,
|
||||
struct osmo_fsm_inst *notify,
|
||||
uint32_t event_success, uint32_t event_failure,
|
||||
void *notify_data);
|
||||
|
||||
/*! Dispatch a DLCX for the given connection.
|
||||
* \param ci Connection identifier as obtained from osmo_mgcpc_ep_ci_add().
|
||||
*/
|
||||
static inline void osmo_mgcpc_ep_ci_dlcx(struct osmo_mgcpc_ep_ci *ci)
|
||||
{
|
||||
osmo_mgcpc_ep_ci_request(ci, MGCP_VERB_DLCX, NULL, NULL, 0, 0, NULL);
|
||||
}
|
||||
|
||||
void osmo_mgcpc_ep_clear(struct osmo_mgcpc_ep *ep);
|
||||
|
||||
const char *osmo_mgcpc_ep_name(const struct osmo_mgcpc_ep *ep);
|
||||
const char *osmo_mgcpc_ep_ci_name(const struct osmo_mgcpc_ep_ci *ci);
|
||||
const char *osmo_mgcpc_ep_ci_id(const struct osmo_mgcpc_ep_ci *ci);
|
||||
|
||||
extern const struct value_string osmo_mgcp_verb_names[];
|
||||
static inline const char *osmo_mgcp_verb_name(enum mgcp_verb val)
|
||||
{ return get_value_string(osmo_mgcp_verb_names, val); }
|
73
include/osmocom/mgcp_client/mgcp_client_fsm.h
Normal file
73
include/osmocom/mgcp_client/mgcp_client_fsm.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/mgcp_client/mgcp_common.h>
|
||||
#include <osmocom/mgcp_client/mgcp_client.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
|
||||
/*! This struct organizes the connection infromation one connection side
|
||||
* (either remote or local). It is used to pass parameters (local) to the FSM
|
||||
* and get responses (remote) from the FSM as pointer attached to the FSM
|
||||
* event.
|
||||
*
|
||||
* When modifiying a connection, the endpoint and call_id members may be left
|
||||
* unpopulated. The call_id field is ignored in this case. If an endpoint
|
||||
* identifier is supplied it is checked against the internal state to make
|
||||
* sure it is correct. */
|
||||
struct mgcp_conn_peer {
|
||||
/*! RTP connection IP-Address (optional, string e.g. "127.0.0.1") */
|
||||
char addr[INET_ADDRSTRLEN];
|
||||
|
||||
/*! RTP connection IP-Port (optional) */
|
||||
uint16_t port;
|
||||
|
||||
/*! RTP endpoint */
|
||||
char endpoint[MGCP_ENDPOINT_MAXLEN];
|
||||
|
||||
/*! CALL ID (unique per connection) */
|
||||
unsigned int call_id;
|
||||
|
||||
/*! RTP packetization interval (optional) */
|
||||
unsigned int ptime;
|
||||
|
||||
/*! RTP codec list (optional) */
|
||||
enum mgcp_codecs codecs[MGCP_MAX_CODECS];
|
||||
|
||||
/*! Number of codecs in RTP codec list (optional) */
|
||||
unsigned int codecs_len;
|
||||
|
||||
/*! RTP payload type map (optional, only needed when payload types are
|
||||
* used that differ from what IANA/3GPP defines) */
|
||||
struct ptmap ptmap[MGCP_MAX_CODECS];
|
||||
|
||||
/*! RTP payload type map length (optional, only needed when payload
|
||||
* types are used that differ from what IANA/3GPP defines) */
|
||||
unsigned int ptmap_len;
|
||||
|
||||
/*! If nonzero, send 'X-Osmo-IGN:' header. This is useful e.g. for SCCPlite MSCs where the MSC is
|
||||
* known to issue incoherent or unknown CallIDs / to issue CRCX commands with a different domain
|
||||
* name than the BSC. An OsmoMGW will then ignore these and not fail on mismatches. */
|
||||
uint32_t x_osmo_ign;
|
||||
|
||||
/*! send 'X-Osmux: %d' header (or "*" as wildcard). */
|
||||
bool x_osmo_osmux_use;
|
||||
/*! -1 means send wildcard. */
|
||||
int x_osmo_osmux_cid;
|
||||
|
||||
/*! If left MGCP_CONN_NONE, use MGCP_CONN_RECV_ONLY or MGCP_CONN_RECV_SEND, depending on whether an audio RTP
|
||||
* address is set. If != MGCP_CONN_NONE, force this conn mode. */
|
||||
enum mgcp_connection_mode conn_mode;
|
||||
|
||||
/*! If the codec requires additional format parameters (fmtp), those cann be set here, see also
|
||||
* mgcp_common.h */
|
||||
bool param_present;
|
||||
struct mgcp_codec_param param;
|
||||
};
|
||||
|
||||
struct osmo_fsm_inst *mgcp_conn_create(struct mgcp_client *mgcp, struct osmo_fsm_inst *parent_fi, uint32_t parent_term_evt,
|
||||
uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
|
||||
int mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer);
|
||||
void mgcp_conn_delete(struct osmo_fsm_inst *fi);
|
||||
|
||||
const char *mgcp_conn_get_ci(struct osmo_fsm_inst *fi);
|
||||
|
||||
const char *osmo_mgcpc_conn_peer_name(const struct mgcp_conn_peer *info);
|
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-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
|
63
openbsc/.gitignore
vendored
63
openbsc/.gitignore
vendored
@@ -1,63 +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
|
||||
tests/gprs/gprs_test
|
||||
|
||||
tests/atconfig
|
||||
tests/atlocal
|
||||
tests/package.m4
|
||||
tests/testsuite
|
||||
tests/testsuite.log
|
||||
|
||||
|
||||
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,120 +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])
|
||||
AC_CONFIG_TESTDIR(tests)
|
||||
|
||||
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_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_SUBST(osmo_ac_build_nat)
|
||||
|
||||
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.1.0)
|
||||
|
||||
found_libgtp=yes
|
||||
PKG_CHECK_MODULES(LIBGTP, libgtp, , found_libgtp=no)
|
||||
AM_CONDITIONAL(HAVE_LIBGTP, test "$found_libgtp" = yes)
|
||||
|
||||
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/atlocal
|
||||
tests/debug/Makefile
|
||||
tests/gsm0408/Makefile
|
||||
tests/db/Makefile
|
||||
tests/channel/Makefile
|
||||
tests/bsc-nat/Makefile
|
||||
tests/mgcp/Makefile
|
||||
tests/gprs/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,104 +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)
|
||||
if len(data) == 0:
|
||||
print "Connection is gone."
|
||||
break
|
||||
|
||||
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
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user