mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-20 16:10:29 +00:00
Compare commits
1704 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fb76157c8 | ||
|
|
6f812f7003 | ||
|
|
761bf3c4c2 | ||
|
|
8575b151fc | ||
|
|
78e0a53d03 | ||
|
|
a945f85d6f | ||
|
|
41d16f1696 | ||
|
|
a35865b749 | ||
|
|
cdcc1d54f4 | ||
|
|
35f34bbdcc | ||
|
|
121da9468e | ||
|
|
e3cc82b9fe | ||
|
|
0daf79bfc8 | ||
|
|
f38572b444 | ||
|
|
622b919b37 | ||
|
|
30e11cbf53 | ||
|
|
c866677a8f | ||
|
|
592bcf3867 | ||
|
|
5df5b70909 | ||
|
|
0293141817 | ||
|
|
c5fd670803 | ||
|
|
9c167fc3bf | ||
|
|
d7096758aa | ||
|
|
17b9a9e917 | ||
|
|
309ca06685 | ||
|
|
f7466b0e1a | ||
|
|
2fbb26789f | ||
|
|
ebc8cbf4e0 | ||
|
|
8633d6c2df | ||
|
|
9e4f700aae | ||
|
|
2ed9a48d6e | ||
|
|
5917cdaff8 | ||
|
|
1661294de5 | ||
|
|
030a345258 | ||
|
|
3ed32a77d0 | ||
|
|
4c2c1a3631 | ||
|
|
96db5ea596 | ||
|
|
f5be2be550 | ||
|
|
10c9d899bb | ||
|
|
8d5901c815 | ||
|
|
a2f37668f1 | ||
|
|
a738eeade4 | ||
|
|
767606f9f2 | ||
|
|
a64bcb1408 | ||
|
|
04b5954f96 | ||
|
|
aae302f15e | ||
|
|
b5eec87e75 | ||
|
|
ed145f5799 | ||
|
|
a2cf0a2295 | ||
|
|
bcdb62e140 | ||
|
|
4ac34f7c7c | ||
|
|
40e42c4c2d | ||
|
|
33e242de6a | ||
|
|
bf7eb25cf5 | ||
|
|
0b332b5536 | ||
|
|
cb637c033c | ||
|
|
232f56b9e6 | ||
|
|
08b8b3142d | ||
|
|
4deeb083fc | ||
|
|
9adfa48de8 | ||
|
|
28171c1aa7 | ||
|
|
ef87ec519e | ||
|
|
d102d96431 | ||
|
|
a8ae85f6ca | ||
|
|
0da6027438 | ||
|
|
bc2a93183d | ||
|
|
2e559d8237 | ||
|
|
fdae0065ac | ||
|
|
d951795ae4 | ||
|
|
5d936f3518 | ||
|
|
f364d13ddf | ||
|
|
85ac4e4648 | ||
|
|
0b4b2dda14 | ||
|
|
a10a29b576 | ||
|
|
00158f85d9 | ||
|
|
3f1e218a01 | ||
|
|
727782a04a | ||
|
|
ff9f54e187 | ||
|
|
dd8eb2903e | ||
|
|
71d7fcb016 | ||
|
|
037da40423 | ||
|
|
adbb533de6 | ||
|
|
9566187ab3 | ||
|
|
f152ddaa5e | ||
|
|
9be3a02fb9 | ||
|
|
4aed32e786 | ||
|
|
fadb9b8378 | ||
|
|
b7b13de36a | ||
|
|
ce29fca6b6 | ||
|
|
39e74bc8ab | ||
|
|
a45fbd0fae | ||
|
|
68c72ac012 | ||
|
|
e10dd54a9b | ||
|
|
09fe0bdc24 | ||
|
|
2826ceea00 | ||
|
|
6194ef4831 | ||
|
|
9542e8a8f9 | ||
|
|
3c56a7edc5 | ||
|
|
804a9a0630 | ||
|
|
9eb6d6a4ec | ||
|
|
0ef58f685a | ||
|
|
7580d021d3 | ||
|
|
71ea13fa4b | ||
|
|
9ddaf93eab | ||
|
|
00242daa6b | ||
|
|
e48247f9eb | ||
|
|
633fda9a6e | ||
|
|
df691a2034 | ||
|
|
60c4b5ecd7 | ||
|
|
a08a4f4efb | ||
|
|
cc41eb9dd8 | ||
|
|
c9de7cfe6d | ||
|
|
0617062560 | ||
|
|
bc0f099091 | ||
|
|
0a92f6ff41 | ||
|
|
8c6bd1d5be | ||
|
|
d7e5e3193c | ||
|
|
56743415f9 | ||
|
|
32a330a4a4 | ||
|
|
c5d321cb6f | ||
|
|
c2a5199f0d | ||
|
|
7a8aa100b0 | ||
|
|
f2607d336a | ||
|
|
ea39c866de | ||
|
|
32b636d77a | ||
|
|
0cc838702a | ||
|
|
1029a62208 | ||
|
|
82545b8265 | ||
|
|
10ad08db41 | ||
|
|
b67847c9cf | ||
|
|
31ef9b5203 | ||
|
|
324e6501d6 | ||
|
|
8758d3d4cf | ||
|
|
9bef36f23a | ||
|
|
16acea57cc | ||
|
|
a6f98a8b28 | ||
|
|
c98339e104 | ||
|
|
2237b431c2 | ||
|
|
c15a9a8294 | ||
|
|
f3914c74f0 | ||
|
|
312fad1293 | ||
|
|
87eb459823 | ||
|
|
65c845ea67 | ||
|
|
b74f10a878 | ||
|
|
8e57a58dd6 | ||
|
|
9cf288f6f3 | ||
|
|
685464c204 | ||
|
|
dd7691ec60 | ||
|
|
8625a8672a | ||
|
|
abf30c20b1 | ||
|
|
667bfb0173 | ||
|
|
fe350d5b6f | ||
|
|
d79c186a13 | ||
|
|
8160f8a23f | ||
|
|
c08bd6ba9c | ||
|
|
dcfdd76113 | ||
|
|
9d65f4dd09 | ||
|
|
94dd884325 | ||
|
|
f6693af628 | ||
|
|
4eefaffb47 | ||
|
|
5e323eefa2 | ||
|
|
dd07d878a3 | ||
|
|
430a8c4e11 | ||
|
|
099b7f2ac6 | ||
|
|
0023d448f7 | ||
|
|
ce08fa8e9e | ||
|
|
15bb39704a | ||
|
|
f12350ce62 | ||
|
|
9cd3e2e887 | ||
|
|
11006597c9 | ||
|
|
0f42d5a344 | ||
|
|
9eaee53bb6 | ||
|
|
0bb229451a | ||
|
|
2d97b777b6 | ||
|
|
06f2889b2d | ||
|
|
9107d2831b | ||
|
|
d0b5d6539b | ||
|
|
3d4ba1a3b0 | ||
|
|
ad6d0ac59e | ||
|
|
893f36e81e | ||
|
|
899d150621 | ||
|
|
adb3b25c67 | ||
|
|
34c6805f7a | ||
|
|
98a7a16ead | ||
|
|
bdaef7956d | ||
|
|
261353680c | ||
|
|
5904734d99 | ||
|
|
f2f79a1647 | ||
|
|
966291029d | ||
|
|
8d787768c4 | ||
|
|
3fcdec1ad7 | ||
|
|
ceb13b8aa4 | ||
|
|
3c6e206e97 | ||
|
|
cd7e479fc7 | ||
|
|
780c7b03ba | ||
|
|
bdcc8ecf66 | ||
|
|
655859b865 | ||
|
|
5e149161b7 | ||
|
|
7854030b90 | ||
|
|
46da64063b | ||
|
|
b7b057a162 | ||
|
|
8163d78ce3 | ||
|
|
59e9e2e85f | ||
|
|
c124e32ab5 | ||
|
|
fc4d03d419 | ||
|
|
20a2bfd109 | ||
|
|
2e86a60982 | ||
|
|
89292a763d | ||
|
|
ab907918b0 | ||
|
|
58aa9f1f52 | ||
|
|
5498741f0b | ||
|
|
63b10db645 | ||
|
|
2e8d01f36b | ||
|
|
fd618f4357 | ||
|
|
965aa5e6ef | ||
|
|
94f880ad23 | ||
|
|
fbcc9a2393 | ||
|
|
38abafed2e | ||
|
|
10113a3517 | ||
|
|
f50ea1b14c | ||
|
|
01b1101288 | ||
|
|
61033059c4 | ||
|
|
6f02decf7a | ||
|
|
8f75878544 | ||
|
|
e7f1cf4238 | ||
|
|
666ae5d0e1 | ||
|
|
316f6aba9e | ||
|
|
c36c04537a | ||
|
|
a032502713 | ||
|
|
49006696ac | ||
|
|
bb4131b33d | ||
|
|
3c7c61a46c | ||
|
|
2437d0fbd0 | ||
|
|
37c71e5a02 | ||
|
|
c207df8b0e | ||
|
|
99280926ed | ||
|
|
81215a2461 | ||
|
|
72c387987b | ||
|
|
26f06f35fe | ||
|
|
0a33a1d3e7 | ||
|
|
2af0ef847b | ||
|
|
740d3f647d | ||
|
|
b7762c6a7d | ||
|
|
9814de0570 | ||
|
|
02bfef2184 | ||
|
|
9af7f280b7 | ||
|
|
9a464ca077 | ||
|
|
ca0ff4b51f | ||
|
|
adf920b6a9 | ||
|
|
f65150aa64 | ||
|
|
40f9b9f4e0 | ||
|
|
002b9b0f65 | ||
|
|
0487631c76 | ||
|
|
8d88bae9e8 | ||
|
|
2660ac0570 | ||
|
|
924c421beb | ||
|
|
4fea65a265 | ||
|
|
4a2f9d2571 | ||
|
|
040957c1d4 | ||
|
|
9e78b40d2e | ||
|
|
66c5892c9e | ||
|
|
e6798f5b96 | ||
|
|
5dfdec6c25 | ||
|
|
fa0b8668fb | ||
|
|
a0f40fd02b | ||
|
|
800f66b3d4 | ||
|
|
1213521c30 | ||
|
|
a77082c1ed | ||
|
|
b6991ab2e0 | ||
|
|
e05a417cd2 | ||
|
|
78bf45f3f3 | ||
|
|
5485f131c3 | ||
|
|
af8ce457f3 | ||
|
|
4e3acb6a5d | ||
|
|
fc5c876a81 | ||
|
|
75aff99bf6 | ||
|
|
fec6832122 | ||
|
|
c54cb41805 | ||
|
|
b8c4365479 | ||
|
|
5db0548af0 | ||
|
|
b5a03474bf | ||
|
|
6448738e9b | ||
|
|
583123e042 | ||
|
|
53bb6a8c2c | ||
|
|
d296abb8d0 | ||
|
|
5345b160fc | ||
|
|
045132ba6e | ||
|
|
4080a63938 | ||
|
|
f754e31ead | ||
|
|
7a6709a24e | ||
|
|
676ca5c3a0 | ||
|
|
dfcbeff0d4 | ||
|
|
181eb532e1 | ||
|
|
bc10722013 | ||
|
|
60efa62dc8 | ||
|
|
7c7022a198 | ||
|
|
89c60dacfd | ||
|
|
34c303efb5 | ||
|
|
e9d88a101d | ||
|
|
e5c5185eda | ||
|
|
e268611bec | ||
|
|
4a6e433b21 | ||
|
|
b95ff08295 | ||
|
|
cfac326c00 | ||
|
|
c01d9dc1f0 | ||
|
|
99b521901c | ||
|
|
6977429706 | ||
|
|
ac437d3d12 | ||
|
|
d2098da06c | ||
|
|
71fde41477 | ||
|
|
b3d9e19899 | ||
|
|
aaac4894c9 | ||
|
|
92ee6017cd | ||
|
|
7514e7139a | ||
|
|
048f07f67f | ||
|
|
3ce5f50755 | ||
|
|
a3f7ceb395 | ||
|
|
1789b3de59 | ||
|
|
e82c6764f9 | ||
|
|
bf3a4f6464 | ||
|
|
d8627b5e3f | ||
|
|
2291f4ebec | ||
|
|
216cd0bf02 | ||
|
|
8dd8a97c34 | ||
|
|
11856c6b00 | ||
|
|
774452bbbb | ||
|
|
4fcb6272f4 | ||
|
|
cff9149920 | ||
|
|
89f747a218 | ||
|
|
238b22e5b5 | ||
|
|
fe0b84ddaf | ||
|
|
b88fec2304 | ||
|
|
23109e1a82 | ||
|
|
9d2a4717d0 | ||
|
|
6219ddc581 | ||
|
|
9d3eed3b43 | ||
|
|
48d7a1ef3a | ||
|
|
7685cf1811 | ||
|
|
668d7af7d2 | ||
|
|
79c304a24a | ||
|
|
ca0d8a445e | ||
|
|
98efcd5220 | ||
|
|
93c1315bbd | ||
|
|
1677e8f847 | ||
|
|
e2d46f8040 | ||
|
|
b596ede727 | ||
|
|
bd17343334 | ||
|
|
d0a51bec01 | ||
|
|
e2350103f4 | ||
|
|
1218cc8f65 | ||
|
|
7ffc20426b | ||
|
|
5014b84c30 | ||
|
|
f2e9e3f2dc | ||
|
|
41dda3d3de | ||
|
|
fd1e01579c | ||
|
|
d86c5a9092 | ||
|
|
1e2f952a9c | ||
|
|
b835f63956 | ||
|
|
a92ed31914 | ||
|
|
2011c7d689 | ||
|
|
1c57eadd33 | ||
|
|
2a44ae639e | ||
|
|
7847143610 | ||
|
|
a19a27ff33 | ||
|
|
19bd4d8cf7 | ||
|
|
7f9b19cce8 | ||
|
|
c13d5c21f3 | ||
|
|
639d2eefc6 | ||
|
|
faa5e07af8 | ||
|
|
b440abef33 | ||
|
|
b2bda9498c | ||
|
|
c6581031d5 | ||
|
|
4ae599990a | ||
|
|
d5a9334306 | ||
|
|
353334f69b | ||
|
|
20b420bb84 | ||
|
|
415201c3dc | ||
|
|
950c1c060e | ||
|
|
fc6dec9edd | ||
|
|
01530385f1 | ||
|
|
65f49f9ffd | ||
|
|
f5aa0135b1 | ||
|
|
40fa3e076c | ||
|
|
18f628848c | ||
|
|
b4f8219170 | ||
|
|
bf71c6f01e | ||
|
|
1e193853eb | ||
|
|
752b305270 | ||
|
|
28a50c15e9 | ||
|
|
c1da605f6d | ||
|
|
cf9727c4be | ||
|
|
dabf833c10 | ||
|
|
488933eddc | ||
|
|
4a331c6fb3 | ||
|
|
3a43c08ae3 | ||
|
|
bd4898222f | ||
|
|
bd3394f528 | ||
|
|
a500b2b293 | ||
|
|
21481c4a6a | ||
|
|
0e78513b5a | ||
|
|
cec9cb7662 | ||
|
|
b82b7781ee | ||
|
|
a194009e00 | ||
|
|
947e50f33d | ||
|
|
e5908bfdaa | ||
|
|
14d927d414 | ||
|
|
263b7aa07a | ||
|
|
fe5fd2494c | ||
|
|
8e8fec1e19 | ||
|
|
9fd0f35134 | ||
|
|
112b3719e4 | ||
|
|
83a045ec83 | ||
|
|
e709933695 | ||
|
|
132018a136 | ||
|
|
39c7e629fb | ||
|
|
c135dd611b | ||
|
|
e14f3677e5 | ||
|
|
02f3298a58 | ||
|
|
e704a3155c | ||
|
|
a587e35a9d | ||
|
|
340d05eebf | ||
|
|
7f24927c43 | ||
|
|
e6cd9873cd | ||
|
|
0ce73b4d0e | ||
|
|
8e022654dc | ||
|
|
4abc1d21e3 | ||
|
|
7f60e38fee | ||
|
|
83b311beac | ||
|
|
28c009a072 | ||
|
|
212dff253f | ||
|
|
19a2337c99 | ||
|
|
4342595ea8 | ||
|
|
7c7172ca18 | ||
|
|
305ebf5c4b | ||
|
|
9dd65f2801 | ||
|
|
05fe029a62 | ||
|
|
3d1e01e283 | ||
|
|
bb8c6b2c52 | ||
|
|
3dc1963a2d | ||
|
|
42b834d64c | ||
|
|
ba55fcac27 | ||
|
|
ff6d41b6e8 | ||
|
|
b218eea839 | ||
|
|
ce1ac08b19 | ||
|
|
b5ab7267c2 | ||
|
|
fd5932c544 | ||
|
|
477a171fbc | ||
|
|
dc960a6043 | ||
|
|
b45e9a68a8 | ||
|
|
5c375d3ae8 | ||
|
|
6504013077 | ||
|
|
709b1fd299 | ||
|
|
c1e460183b | ||
|
|
05f89b3922 | ||
|
|
1b1270e847 | ||
|
|
f94835becf | ||
|
|
94229ca593 | ||
|
|
b2c57f42fc | ||
|
|
e1293616d6 | ||
|
|
684ca32e9b | ||
|
|
52006fc6ea | ||
|
|
74e2cf77fa | ||
|
|
7d649f432b | ||
|
|
2e9dfe0fbb | ||
|
|
0a46cc56a2 | ||
|
|
25f35fbbb4 | ||
|
|
2edbcbdf66 | ||
|
|
3d8fb53073 | ||
|
|
5c0f42a277 | ||
|
|
b1bf9db8fa | ||
|
|
2ef3dd8ff7 | ||
|
|
b81ee87f4d | ||
|
|
bf6a3b522d | ||
|
|
3a7fd01f22 | ||
|
|
daa308c33a | ||
|
|
465ab00bc5 | ||
|
|
fa9b91ad1d | ||
|
|
2c238010a7 | ||
|
|
aac9c6119d | ||
|
|
60b83d84ea | ||
|
|
abfeb4ef06 | ||
|
|
c17e81b2aa | ||
|
|
2f4fcb5ecc | ||
|
|
dcb48081a0 | ||
|
|
0030635237 | ||
|
|
34ca9a7f93 | ||
|
|
b0d468c0f7 | ||
|
|
068ce4ca55 | ||
|
|
46b37aaa31 | ||
|
|
e98c3e8143 | ||
|
|
38771f270b | ||
|
|
339353a96c | ||
|
|
c8e642494b | ||
|
|
ea858d54fa | ||
|
|
b82e7c1a88 | ||
|
|
39f26e945e | ||
|
|
e62f569b5d | ||
|
|
f9b5dafe29 | ||
|
|
603c84c700 | ||
|
|
96dc12ccce | ||
|
|
37bc075cb2 | ||
|
|
74afbf84f4 | ||
|
|
baeb930397 | ||
|
|
053704b5c2 | ||
|
|
ac7c0df520 | ||
|
|
7c11cf9646 | ||
|
|
122953d986 | ||
|
|
e3186c1741 | ||
|
|
f58c7b1be9 | ||
|
|
76574a1ac0 | ||
|
|
1b417979e9 | ||
|
|
eadcba956e | ||
|
|
3dd1faadd4 | ||
|
|
10a50563eb | ||
|
|
9a5d17d967 | ||
|
|
9535e7a276 | ||
|
|
e7e48144e1 | ||
|
|
31c85b22ea | ||
|
|
70c84ef835 | ||
|
|
ba6d140445 | ||
|
|
bcfeb7af32 | ||
|
|
36bd7e1d75 | ||
|
|
1f3b1ff8ff | ||
|
|
f92bd91544 | ||
|
|
be0541aa8c | ||
|
|
6f6f9acb52 | ||
|
|
fbe109a66c | ||
|
|
6397e66c29 | ||
|
|
63c0ed7042 | ||
|
|
7d9945e884 | ||
|
|
7b36af0597 | ||
|
|
7c4630057f | ||
|
|
bfa8a28ccb | ||
|
|
23c7547698 | ||
|
|
d65d91ddcc | ||
|
|
f52a42eda5 | ||
|
|
4ecdfa05f1 | ||
|
|
6c789a36bc | ||
|
|
09139ab018 | ||
|
|
2dc9dc0316 | ||
|
|
1a591da2bc | ||
|
|
614d6bbe2a | ||
|
|
f66f6e49cb | ||
|
|
9ecae1837c | ||
|
|
b904ce7978 | ||
|
|
14aa96787a | ||
|
|
aefb958a6f | ||
|
|
5805215227 | ||
|
|
e88d1e739e | ||
|
|
d930378e13 | ||
|
|
cd6ac4529d | ||
|
|
6ba07564af | ||
|
|
8d7c06b194 | ||
|
|
4d8e41100a | ||
|
|
82403ed1dd | ||
|
|
fa432bdd26 | ||
|
|
b2b1dc9f18 | ||
|
|
442bb79bd0 | ||
|
|
7fd46420d9 | ||
|
|
cd1bd0467c | ||
|
|
9e55f8ebcd | ||
|
|
0bcee1e40e | ||
|
|
8f7b6391a5 | ||
|
|
c5f400e9d3 | ||
|
|
fc46dcff36 | ||
|
|
80f47817d9 | ||
|
|
a75cfd9073 | ||
|
|
9bf108c227 | ||
|
|
012d333c8e | ||
|
|
94e039ac87 | ||
|
|
91e12a9724 | ||
|
|
2bf1180884 | ||
|
|
ce14050bb4 | ||
|
|
0ada1e9e32 | ||
|
|
ae674104b3 | ||
|
|
b9e03cf251 | ||
|
|
b31282ae30 | ||
|
|
3c191c26f3 | ||
|
|
62bcd5edf9 | ||
|
|
3e77251f96 | ||
|
|
e400b5e709 | ||
|
|
234acfea7f | ||
|
|
9c6cb96baf | ||
|
|
393fe86563 | ||
|
|
80eaec1d5c | ||
|
|
51b23b4061 | ||
|
|
157707b042 | ||
|
|
5c09741fac | ||
|
|
7e13688e80 | ||
|
|
6b81ddf611 | ||
|
|
ce465e503a | ||
|
|
d3b4251053 | ||
|
|
b44c49bc30 | ||
|
|
4661138d87 | ||
|
|
d3af6f1f36 | ||
|
|
e0b8998def | ||
|
|
39bdc2bce8 | ||
|
|
ab2c1fcc8e | ||
|
|
0cd250bc50 | ||
|
|
d1d4bb9f0c | ||
|
|
274030c4d5 | ||
|
|
483822d427 | ||
|
|
e2ae88de23 | ||
|
|
bb5ee76ad8 | ||
|
|
31dde6129c | ||
|
|
8250ecd794 | ||
|
|
024af3e730 | ||
|
|
0e687fb765 | ||
|
|
79242aaf54 | ||
|
|
41a261266a | ||
|
|
39ec1f7071 | ||
|
|
bebc2a1088 | ||
|
|
b55d80ffd2 | ||
|
|
883310d88d | ||
|
|
358e6926ca | ||
|
|
d72294b966 | ||
|
|
a3427bf85b | ||
|
|
ea6fb5c481 | ||
|
|
d141195ea3 | ||
|
|
90cb9d6cb8 | ||
|
|
7b1cbfc326 | ||
|
|
723510f684 | ||
|
|
094ac2f3ea | ||
|
|
00ebfbb0bc | ||
|
|
c935da6414 | ||
|
|
9f33d0904b | ||
|
|
163c37a5a3 | ||
|
|
0a91243ca5 | ||
|
|
73dded9a21 | ||
|
|
e45f26e48e | ||
|
|
6d6e1c8687 | ||
|
|
03a39ccae2 | ||
|
|
29cc22bd18 | ||
|
|
0e42ffa2a0 | ||
|
|
5551c5e596 | ||
|
|
66b93704e2 | ||
|
|
2d8ae33544 | ||
|
|
03bf3a6dc5 | ||
|
|
bb903e8d4f | ||
|
|
452b63fc36 | ||
|
|
dd9778924d | ||
|
|
90fbbe7ef4 | ||
|
|
a51c30f459 | ||
|
|
6337bc77b1 | ||
|
|
f1d4f4b93c | ||
|
|
7b64eae285 | ||
|
|
4eae34a9d8 | ||
|
|
61b3de99cb | ||
|
|
02148c7950 | ||
|
|
afb60b8500 | ||
|
|
9224d36176 | ||
|
|
dc5f420d88 | ||
|
|
0c13a37517 | ||
|
|
d1ef731728 | ||
|
|
11b3e6dfbb | ||
|
|
53e416be0b | ||
|
|
106f31524b | ||
|
|
f6e42ce9e4 | ||
|
|
c62b54a030 | ||
|
|
1cd46a75d7 | ||
|
|
b9407c40cf | ||
|
|
471a7d7d10 | ||
|
|
b98bb25fba | ||
|
|
d34a8019b2 | ||
|
|
c84f68cefc | ||
|
|
e88561e90d | ||
|
|
974e5beebc | ||
|
|
60eddd2c8f | ||
|
|
0dd076a37a | ||
|
|
a33a3ead22 | ||
|
|
26d99fae5d | ||
|
|
422c06c932 | ||
|
|
d2e02ee2e6 | ||
|
|
8bff2cff3e | ||
|
|
b3ded7799a | ||
|
|
a731de2f13 | ||
|
|
3fdcf5b676 | ||
|
|
3d0fbc00a1 | ||
|
|
30fde6bfe2 | ||
|
|
e439a24f03 | ||
|
|
d8aa8d4a64 | ||
|
|
95503ffd52 | ||
|
|
747cea249b | ||
|
|
af4027660b | ||
|
|
6c588589ac | ||
|
|
bf699414d1 | ||
|
|
86c8d0f95a | ||
|
|
51c7753526 | ||
|
|
1b54e18a47 | ||
|
|
8d36213f6f | ||
|
|
459a6ec372 | ||
|
|
c86b437eb3 | ||
|
|
fcb857e508 | ||
|
|
5c8410c56f | ||
|
|
7fe8d45d6a | ||
|
|
f03e2dbc0e | ||
|
|
eeb44860e9 | ||
|
|
ef2dee59d4 | ||
|
|
8461a56aa1 | ||
|
|
8ae72d1cf1 | ||
|
|
e2dc453b62 | ||
|
|
292535fe06 | ||
|
|
804595d483 | ||
|
|
33b2d11fc2 | ||
|
|
fe2193ba75 | ||
|
|
17d155325a | ||
|
|
c4707bd8b7 | ||
|
|
b43c6cbfdd | ||
|
|
8bc36c3b96 | ||
|
|
260e696c8b | ||
|
|
5fc045644c | ||
|
|
45fccb0203 | ||
|
|
9af3599153 | ||
|
|
e36aee0b7f | ||
|
|
dcf35b2af1 | ||
|
|
5367d5dc3f | ||
|
|
1ca4d551b8 | ||
|
|
8d34217ce4 | ||
|
|
556d5a65e9 | ||
|
|
fcf2444ee1 | ||
|
|
64e296ed67 | ||
|
|
38d7adc7e3 | ||
|
|
c7a36ec6d2 | ||
|
|
e6daacf7ea | ||
|
|
a99e1a95af | ||
|
|
53fa94785a | ||
|
|
5ab2fccf2f | ||
|
|
26538bb9e2 | ||
|
|
5b90bcbd25 | ||
|
|
b33b4df006 | ||
|
|
ec889250a5 | ||
|
|
c875b44958 | ||
|
|
60032f57b4 | ||
|
|
289f1ea971 | ||
|
|
46438c7cd9 | ||
|
|
404c346182 | ||
|
|
607f0ca377 | ||
|
|
83e1dc9ed0 | ||
|
|
9a33bca200 | ||
|
|
ef05c1d900 | ||
|
|
491f299bf2 | ||
|
|
5899af2efd | ||
|
|
576bbd252c | ||
|
|
7340b5e071 | ||
|
|
2d7f557ae9 | ||
|
|
5665b05c7c | ||
|
|
809be889a7 | ||
|
|
f99e5e1ff0 | ||
|
|
84fa851dfa | ||
|
|
7ff4939da6 | ||
|
|
73937668f0 | ||
|
|
e6b5e1c34d | ||
|
|
844a8af418 | ||
|
|
55364a8860 | ||
|
|
223247ceb0 | ||
|
|
4742178aee | ||
|
|
d4de8aaf0f | ||
|
|
ee82aed182 | ||
|
|
2ee6ae11df | ||
|
|
7c8dbbdb25 | ||
|
|
2d8cf88884 | ||
|
|
b4cbddb970 | ||
|
|
3835f10659 | ||
|
|
3df061b540 | ||
|
|
7a2984e8ae | ||
|
|
d0476cb02b | ||
|
|
68ff688b71 | ||
|
|
7aa57b4d84 | ||
|
|
2045a49313 | ||
|
|
101d28e9da | ||
|
|
e84a00174b | ||
|
|
37a18b2530 | ||
|
|
af67618095 | ||
|
|
69c8b8a933 | ||
|
|
74d07a70f6 | ||
|
|
e6f3c9b899 | ||
|
|
da0cbaf86c | ||
|
|
f7fb0280a0 | ||
|
|
a0f19a7265 | ||
|
|
a6219153d9 | ||
|
|
da75a07870 | ||
|
|
c824eea074 | ||
|
|
c3c2b774d6 | ||
|
|
0d3fa21187 | ||
|
|
428c2212aa | ||
|
|
c1fee62473 | ||
|
|
a5d5a21ddb | ||
|
|
89445da9eb | ||
|
|
c33afccb1b | ||
|
|
2a1d1134e9 | ||
|
|
56241235cf | ||
|
|
2c578f350a | ||
|
|
390085c377 | ||
|
|
27a1101a58 | ||
|
|
b77694e89c | ||
|
|
5933f21882 | ||
|
|
38b387794e | ||
|
|
05d02c43ec | ||
|
|
e0c7479122 | ||
|
|
0695828e4c | ||
|
|
b0b5cb21e5 | ||
|
|
1224cf44ae | ||
|
|
dce5191542 | ||
|
|
773afc1490 | ||
|
|
12cc35932a | ||
|
|
adbc609bbf | ||
|
|
550759231d | ||
|
|
a5e6690ded | ||
|
|
ab57b0ddd3 | ||
|
|
8a9ef14e4f | ||
|
|
fdbab0e856 | ||
|
|
67e53e72ab | ||
|
|
84b61f2264 | ||
|
|
9fc584d173 | ||
|
|
dc8190dc6a | ||
|
|
73920f3f6e | ||
|
|
dec41a2a99 | ||
|
|
0af4c17000 | ||
|
|
97db12c9f2 | ||
|
|
8be18c360b | ||
|
|
2da964bb2d | ||
|
|
84c61990b7 | ||
|
|
4c78c177db | ||
|
|
6fd41105c9 | ||
|
|
9ee29fb0b2 | ||
|
|
0f47f01cae | ||
|
|
848f78465b | ||
|
|
ff11cf5f23 | ||
|
|
fe2446b7e3 | ||
|
|
c6a2cf042a | ||
|
|
c88ec0bd81 | ||
|
|
31cbb18f0e | ||
|
|
490492cbfa | ||
|
|
7edff5fe0b | ||
|
|
adfaa6d9f3 | ||
|
|
90015dfb35 | ||
|
|
5715de89f2 | ||
|
|
ab7a3e8e9c | ||
|
|
d5a6817887 | ||
|
|
ccdb80efbc | ||
|
|
801a2e5de7 | ||
|
|
669aa1fbcf | ||
|
|
237da58846 | ||
|
|
396d59ff22 | ||
|
|
c70e705aa4 | ||
|
|
89cff54730 | ||
|
|
00b7568ed2 | ||
|
|
9df4a4910d | ||
|
|
d36e4e4c85 | ||
|
|
a36ccb97a2 | ||
|
|
22942608fa | ||
|
|
f45256c66b | ||
|
|
f2f32f5340 | ||
|
|
3ec3d2a6b1 | ||
|
|
f3b84e7495 | ||
|
|
cb67d586a4 | ||
|
|
8d3368b79d | ||
|
|
bfecb5e54a | ||
|
|
9162c069d1 | ||
|
|
78efb33243 | ||
|
|
f16fe1423e | ||
|
|
637e2f0793 | ||
|
|
2a6274338d | ||
|
|
c1360397ed | ||
|
|
6e9a28b1a7 | ||
|
|
5575fed27b | ||
|
|
14d28e2dbd | ||
|
|
d31634c358 | ||
|
|
de8ab34d85 | ||
|
|
0e919b9913 | ||
|
|
328731af18 | ||
|
|
40add2d572 | ||
|
|
4f235bb83e | ||
|
|
1f95f48f41 | ||
|
|
3f4a993e9f | ||
|
|
b29f6bc7e5 | ||
|
|
e05bf365be | ||
|
|
217eba6b6e | ||
|
|
de665ee4e3 | ||
|
|
ce9b316da2 | ||
|
|
02ecf9fd45 | ||
|
|
6bba411e1b | ||
|
|
4bdd700a38 | ||
|
|
4fe2d6d724 | ||
|
|
2e7c28a591 | ||
|
|
23fc8fdb26 | ||
|
|
a190005316 | ||
|
|
28d16f4a91 | ||
|
|
e66338669e | ||
|
|
e466b2c1bc | ||
|
|
219016e7a4 | ||
|
|
8effdc36a7 | ||
|
|
59d0cf1c54 | ||
|
|
1d331c0bf8 | ||
|
|
93a244cfaf | ||
|
|
2612df9ef2 | ||
|
|
2507933c82 | ||
|
|
975342399d | ||
|
|
3b44919d0b | ||
|
|
cedde4ad1f | ||
|
|
db4b77ebd2 | ||
|
|
12ed6c21f1 | ||
|
|
6f9ba77bd8 | ||
|
|
759f5f751f | ||
|
|
a1f25f073c | ||
|
|
f24068c2a4 | ||
|
|
6b79dc9ac3 | ||
|
|
dfc537ff3d | ||
|
|
a513f8bc39 | ||
|
|
dabdf7933b | ||
|
|
afeb256604 | ||
|
|
8673fa8415 | ||
|
|
3dabb5447a | ||
|
|
210cbd60ef | ||
|
|
8d2bb6cbc2 | ||
|
|
127f1a9438 | ||
|
|
619d34d781 | ||
|
|
d9255b5c72 | ||
|
|
378020ce97 | ||
|
|
15a1af31db | ||
|
|
3bf8768d1b | ||
|
|
5ebdbf9f2d | ||
|
|
66c292b95b | ||
|
|
2a62db97e6 | ||
|
|
a525be94c3 | ||
|
|
f79dd53edf | ||
|
|
d11a22aa8d | ||
|
|
fce9f0b5d5 | ||
|
|
089eb06a59 | ||
|
|
abfc21ad28 | ||
|
|
17d62a6777 | ||
|
|
2164f7cd03 | ||
|
|
4622ba134f | ||
|
|
82437cccb7 | ||
|
|
9044dc3535 | ||
|
|
2f3483d1d3 | ||
|
|
1167dd6b33 | ||
|
|
9fa556ffbf | ||
|
|
af68b3974b | ||
|
|
ca078ff549 | ||
|
|
7a92f587e5 | ||
|
|
595db57af0 | ||
|
|
1b07582ce4 | ||
|
|
e227a12736 | ||
|
|
495e357a1e | ||
|
|
35ae311ac8 | ||
|
|
be28fd3352 | ||
|
|
01c50449c3 | ||
|
|
7f4c961d82 | ||
|
|
8f6746beae | ||
|
|
17aefade3f | ||
|
|
e0bf855fbf | ||
|
|
e04e8a62cc | ||
|
|
5976ea4a95 | ||
|
|
a574c3d31b | ||
|
|
0a9d013f59 | ||
|
|
8db3583b09 | ||
|
|
3750ebc2d6 | ||
|
|
d31b6ef83b | ||
|
|
46b2ee9577 | ||
|
|
752ceb1922 | ||
|
|
497e89d97e | ||
|
|
e4a84606b9 | ||
|
|
179ff73658 | ||
|
|
bd30471076 | ||
|
|
18c3a32321 | ||
|
|
e470e2d3bd | ||
|
|
e6671827bb | ||
|
|
05a261ae66 | ||
|
|
55e50b2052 | ||
|
|
4041a661fc | ||
|
|
488b84cb46 | ||
|
|
53777043c3 | ||
|
|
6c6d20b622 | ||
|
|
0fb34b2e28 | ||
|
|
3a3a699bc5 | ||
|
|
bf5bf8ba04 | ||
|
|
7e4e63ae64 | ||
|
|
086520f50e | ||
|
|
675e0b10cb | ||
|
|
8daa6897e9 | ||
|
|
4a0e4b5e14 | ||
|
|
81daba1931 | ||
|
|
e1b9533200 | ||
|
|
ae253f45b2 | ||
|
|
726a543abf | ||
|
|
8def47c488 | ||
|
|
a2acf0a98f | ||
|
|
9a0f32aa1d | ||
|
|
41582eb340 | ||
|
|
2270dae1e7 | ||
|
|
5b6a83fc7f | ||
|
|
bff8e40d00 | ||
|
|
bc032392c9 | ||
|
|
f52a2c9583 | ||
|
|
031a72de7d | ||
|
|
d7831c1f57 | ||
|
|
108cf6bff0 | ||
|
|
b0766d7074 | ||
|
|
54057dce28 | ||
|
|
7be5af4c09 | ||
|
|
76ee52a635 | ||
|
|
0717c18ccb | ||
|
|
1255cf856f | ||
|
|
a78ef7c932 | ||
|
|
62e235ac3e | ||
|
|
0b254522c9 | ||
|
|
eb82608878 | ||
|
|
0640959560 | ||
|
|
688fe7bcf8 | ||
|
|
cfc308dd4c | ||
|
|
05c635311d | ||
|
|
8aa61a1d29 | ||
|
|
7c9a3311e7 | ||
|
|
490b695b3d | ||
|
|
8678be1692 | ||
|
|
2774702108 | ||
|
|
f4b93cdc12 | ||
|
|
f22e56ee6d | ||
|
|
ce1e9cb15a | ||
|
|
53ccc0e7ad | ||
|
|
cae34e0f4d | ||
|
|
f89c70dfc3 | ||
|
|
cbc2164e50 | ||
|
|
1e485b4b5e | ||
|
|
a016cb7589 | ||
|
|
7adc4703be | ||
|
|
e1c4e78b69 | ||
|
|
31541601ce | ||
|
|
ea7c0e1b36 | ||
|
|
b80ce3510e | ||
|
|
860394244b | ||
|
|
28923dc8e2 | ||
|
|
a4f8fff92b | ||
|
|
3b9869187b | ||
|
|
710a246596 | ||
|
|
001cf13632 | ||
|
|
ca2aeaccb8 | ||
|
|
9bea08ab65 | ||
|
|
6e21152fac | ||
|
|
29d6400210 | ||
|
|
ad9a246043 | ||
|
|
ee934102b6 | ||
|
|
484cad2431 | ||
|
|
8eeebdaf98 | ||
|
|
afe698db10 | ||
|
|
0bb875d9c2 | ||
|
|
956135f9a3 | ||
|
|
426e6cd74b | ||
|
|
bea768660b | ||
|
|
0579d47154 | ||
|
|
7d5ec24bb5 | ||
|
|
a242028878 | ||
|
|
7f0679593c | ||
|
|
7f1bef9b65 | ||
|
|
045c947015 | ||
|
|
c4405d6c41 | ||
|
|
62ed687ef5 | ||
|
|
7637ed26ba | ||
|
|
a6e6a2d649 | ||
|
|
eb711645d0 | ||
|
|
b0b472e035 | ||
|
|
8a08206670 | ||
|
|
41fd001b31 | ||
|
|
c67536062b | ||
|
|
933dc966c0 | ||
|
|
3b7a9400f2 | ||
|
|
f15426d75c | ||
|
|
03231dd163 | ||
|
|
af2ad0682f | ||
|
|
8cfd5f29f6 | ||
|
|
9d64a0382b | ||
|
|
0c52c76df6 | ||
|
|
03eb2c498d | ||
|
|
fe10da2642 | ||
|
|
f8aea6189d | ||
|
|
7715900222 | ||
|
|
f1bd8ba02a | ||
|
|
880cddb4a0 | ||
|
|
6f0b71deac | ||
|
|
ec92c55528 | ||
|
|
33e89e3e9f | ||
|
|
953de398a3 | ||
|
|
4b64879072 | ||
|
|
eb854b8e6a | ||
|
|
8bc94223b4 | ||
|
|
46b0c0fea5 | ||
|
|
77486af848 | ||
|
|
4429a6a601 | ||
|
|
f216bacb11 | ||
|
|
abab672e49 | ||
|
|
7133633997 | ||
|
|
441b062e3a | ||
|
|
2716aaa711 | ||
|
|
085718ae8b | ||
|
|
b4a6e03053 | ||
|
|
263254408d | ||
|
|
e3bf5fe068 | ||
|
|
adb0e77d39 | ||
|
|
8df3f84fc4 | ||
|
|
a4bdaddaaf | ||
|
|
780e213dcc | ||
|
|
3e838ca675 | ||
|
|
f02c1f20e4 | ||
|
|
63c68100f3 | ||
|
|
5869ec9633 | ||
|
|
7dbc59c830 | ||
|
|
f446a5ea17 | ||
|
|
c3c3f27487 | ||
|
|
d2398e1afe | ||
|
|
eab744f6f9 | ||
|
|
5a3b3ed0b5 | ||
|
|
ce8c81af0a | ||
|
|
60a1f34a5a | ||
|
|
b526ef7b47 | ||
|
|
3ae5f95653 | ||
|
|
1a8069b924 | ||
|
|
b55b63c5ab | ||
|
|
6bb69e1964 | ||
|
|
43df291374 | ||
|
|
09a2fa65e3 | ||
|
|
7a6ef377b5 | ||
|
|
8cb78dc4d5 | ||
|
|
040afd4800 | ||
|
|
e450941f7a | ||
|
|
5c5c336300 | ||
|
|
e86b3e31c7 | ||
|
|
dab71e4cbe | ||
|
|
9c4cee34f0 | ||
|
|
38b1efddf2 | ||
|
|
34b75f393d | ||
|
|
8369af0964 | ||
|
|
1fcc78375c | ||
|
|
20b0aae98b | ||
|
|
e0314d8b75 | ||
|
|
958c66c6db | ||
|
|
79bd3ea7d4 | ||
|
|
f974ec264e | ||
|
|
d9b32975c9 | ||
|
|
6fe8c9acec | ||
|
|
afbab21a54 | ||
|
|
85361335e5 | ||
|
|
0b1050c149 | ||
|
|
033513034f | ||
|
|
12f1cb9c7c | ||
|
|
8769024922 | ||
|
|
7f74065484 | ||
|
|
c03f13c07b | ||
|
|
319ae6fbbf | ||
|
|
64615dcc8e | ||
|
|
9648d1f245 | ||
|
|
fbfb756ca1 | ||
|
|
963ccb9bad | ||
|
|
22609539b0 | ||
|
|
92383b825a | ||
|
|
94a1510d2b | ||
|
|
69ccc900e8 | ||
|
|
9c65225869 | ||
|
|
f116a10de3 | ||
|
|
c0ad88e537 | ||
|
|
2965d79dd4 | ||
|
|
f0f34c029b | ||
|
|
3bd591bfec | ||
|
|
be0b164a52 | ||
|
|
54d8b116f9 | ||
|
|
6097e0516f | ||
|
|
09f149d86b | ||
|
|
1c86e23edf | ||
|
|
ad8b86d93a | ||
|
|
58284f60e7 | ||
|
|
0362cb8644 | ||
|
|
1568b5a167 | ||
|
|
ea4f2948fd | ||
|
|
985dcdc38c | ||
|
|
bb5b90eab0 | ||
|
|
2078a9e57c | ||
|
|
630e39aea3 | ||
|
|
cf59e0d891 | ||
|
|
1a99e785a0 | ||
|
|
d56c651081 | ||
|
|
2b045e8106 | ||
|
|
141689e793 | ||
|
|
b9416fb542 | ||
|
|
048b5384dd | ||
|
|
de98c17e48 | ||
|
|
5e94d108a1 | ||
|
|
68bcfd64e4 | ||
|
|
8750acebbc | ||
|
|
83929d42f2 | ||
|
|
8236206cb0 | ||
|
|
9672b41089 | ||
|
|
5864cc08cd | ||
|
|
92ef1739b1 | ||
|
|
8baf3e7e57 | ||
|
|
0cee514c73 | ||
|
|
92fda18ab6 | ||
|
|
8031eaa05c | ||
|
|
eff2887d92 | ||
|
|
65f047094c | ||
|
|
5bbdefeee8 | ||
|
|
057de07192 | ||
|
|
030bcd52d2 | ||
|
|
0554132dcf | ||
|
|
535755a528 | ||
|
|
c61d74cd49 | ||
|
|
9fbbd0678a | ||
|
|
7fb6b945ef | ||
|
|
81837312cb | ||
|
|
b018a3bbe9 | ||
|
|
2d963f5330 | ||
|
|
45184c769c | ||
|
|
7b39d594d5 | ||
|
|
c5a8dbfee2 | ||
|
|
04acbd4d6a | ||
|
|
4eb3774a74 | ||
|
|
bc7df9f5c4 | ||
|
|
3643c3e80a | ||
|
|
90e3931e4e | ||
|
|
10ab1c3e8b | ||
|
|
17e8a047b3 | ||
|
|
e156079e33 | ||
|
|
ddb959991d | ||
|
|
af9c77d09f | ||
|
|
11db1d89bb | ||
|
|
5e1d462aa9 | ||
|
|
727cdb4a87 | ||
|
|
3c7ec4e416 | ||
|
|
6644204765 | ||
|
|
0dfde2f441 | ||
|
|
7e6a74d5be | ||
|
|
9927838e8c | ||
|
|
b7a467839d | ||
|
|
2ace4029f3 | ||
|
|
0277475bef | ||
|
|
c37446507a | ||
|
|
f55c4e46cb | ||
|
|
b6c7909d03 | ||
|
|
31fbc80520 | ||
|
|
db8c2a0537 | ||
|
|
64116b90e1 | ||
|
|
1fa2f76e61 | ||
|
|
5bdfa81204 | ||
|
|
15e299bd11 | ||
|
|
948f2df9f1 | ||
|
|
5affbe3848 | ||
|
|
b218128862 | ||
|
|
d8defff0fa | ||
|
|
f1abf1a775 | ||
|
|
08499a69e2 | ||
|
|
25ab1c35ee | ||
|
|
b502b5060e | ||
|
|
9ed966cfe6 | ||
|
|
8c37787e23 | ||
|
|
9b9a7e50b4 | ||
|
|
a6742020d0 | ||
|
|
634ac5fc75 | ||
|
|
bd8344b471 | ||
|
|
9938bd5d05 | ||
|
|
93b9b73582 | ||
|
|
2ac2aaf355 | ||
|
|
915282df45 | ||
|
|
5725374ed4 | ||
|
|
e345a5d451 | ||
|
|
2e688c69ca | ||
|
|
9d5621e65c | ||
|
|
0705e71ffc | ||
|
|
8dcf0f0cfd | ||
|
|
3bd7225f9a | ||
|
|
2509847af6 | ||
|
|
138ed2fbb4 | ||
|
|
5894f3e6c2 | ||
|
|
190fc96af4 | ||
|
|
b0887a1b85 | ||
|
|
b11ed995d2 | ||
|
|
1b8c0d6551 | ||
|
|
4e7b1790c8 | ||
|
|
6dcfc1e4f1 | ||
|
|
50565a21f7 | ||
|
|
3e81e8c86b | ||
|
|
813187bf10 | ||
|
|
af454ffd85 | ||
|
|
2e76cb7e37 | ||
|
|
af09f29890 | ||
|
|
82e54108e9 | ||
|
|
f62063276a | ||
|
|
2332290a0d | ||
|
|
d02ee6cfe7 | ||
|
|
4e0e0191be | ||
|
|
a5210e4f4f | ||
|
|
679e7f6d40 | ||
|
|
8ce73e5a7e | ||
|
|
f80617601d | ||
|
|
e202953ccb | ||
|
|
7e6b0c34d2 | ||
|
|
094f439626 | ||
|
|
754cab7ec4 | ||
|
|
95077bae4f | ||
|
|
1de77c7a4e | ||
|
|
6feb848ebe | ||
|
|
19c81e741e | ||
|
|
7e2c8e39f8 | ||
|
|
fe2b7d80d3 | ||
|
|
6b48fd6380 | ||
|
|
54bce4155c | ||
|
|
856bb3abe9 | ||
|
|
577d62c63a | ||
|
|
5fda011043 | ||
|
|
e29524a5fe | ||
|
|
343f338d3f | ||
|
|
cf672ca016 | ||
|
|
6072a8b0ef | ||
|
|
eac26b014f | ||
|
|
7707bacc37 | ||
|
|
ecdf87f1ea | ||
|
|
1f8c702fbb | ||
|
|
fc1e26d074 | ||
|
|
17a828e80f | ||
|
|
b8494221bd | ||
|
|
b635612305 | ||
|
|
f7989c5ce9 | ||
|
|
394c4cab6a | ||
|
|
fd068005df | ||
|
|
f277acfef5 | ||
|
|
bc9c4cfebc | ||
|
|
c2e106fe86 | ||
|
|
7098429e3a | ||
|
|
4d49b5d22b | ||
|
|
1cbb2c5caa | ||
|
|
c590335798 | ||
|
|
0985080287 | ||
|
|
e10ed0bec8 | ||
|
|
cc6ca6fc12 | ||
|
|
7b114b08db | ||
|
|
341dde6729 | ||
|
|
9f4a849115 | ||
|
|
d19b10ae06 | ||
|
|
876cee3a2c | ||
|
|
fdde582e92 | ||
|
|
e3dbfa3dde | ||
|
|
987ffdd8a0 | ||
|
|
849639f3a2 | ||
|
|
1b4adae54f | ||
|
|
79e8653f03 | ||
|
|
4763438131 | ||
|
|
142c02a5b8 | ||
|
|
ce15e0e97b | ||
|
|
8cc39130e0 | ||
|
|
208e4d7e84 | ||
|
|
4e8e707951 | ||
|
|
aa69c550e3 | ||
|
|
b8e9e188c1 | ||
|
|
51e8e0ade7 | ||
|
|
a5b57ddce4 | ||
|
|
35bdc94092 | ||
|
|
08f73c72d8 | ||
|
|
802922dcf1 | ||
|
|
7463f71b48 | ||
|
|
cd8cc1a35c | ||
|
|
71c047d1ae | ||
|
|
615da86332 | ||
|
|
224498cf3b | ||
|
|
95808aec10 | ||
|
|
7d7cbc57f8 | ||
|
|
6a8a551ef3 | ||
|
|
4fa0810cdd | ||
|
|
b3fc3850d8 | ||
|
|
cfc5ff209e | ||
|
|
61a6b06129 | ||
|
|
2e2f6f9c20 | ||
|
|
a04682d47a | ||
|
|
5a40c9a8c7 | ||
|
|
81047e94af | ||
|
|
d7db5cdd57 | ||
|
|
c63abc0842 | ||
|
|
199434b92c | ||
|
|
0d11b26337 | ||
|
|
f5b368461b | ||
|
|
b1f64b22a6 | ||
|
|
719a94d2c4 | ||
|
|
7ca6a84e20 | ||
|
|
d621de7fb3 | ||
|
|
b6e7f7ec51 | ||
|
|
5370685740 | ||
|
|
7e03fe232e | ||
|
|
0f5b01457b | ||
|
|
b9c9293144 | ||
|
|
07d30b2288 | ||
|
|
104ed9ade1 | ||
|
|
59ba6f9e7b | ||
|
|
66f494cbd7 | ||
|
|
c4f8163246 | ||
|
|
cc9a5ede96 | ||
|
|
5615a75413 | ||
|
|
2b213a0ccc | ||
|
|
41d973df1b | ||
|
|
459913de55 | ||
|
|
bcea7d5917 | ||
|
|
bad4b7940a | ||
|
|
673ef5fa7a | ||
|
|
d4fd08785d | ||
|
|
345a9382f2 | ||
|
|
a47f3654f8 | ||
|
|
dd2e208361 | ||
|
|
9c9d3f4580 | ||
|
|
663a5f44f5 | ||
|
|
5dbae26032 | ||
|
|
6b15195ac5 | ||
|
|
60b7e425df | ||
|
|
7236e3ca17 | ||
|
|
46b1280a5e | ||
|
|
224ec7c4a1 | ||
|
|
abcdd194ff | ||
|
|
f545a225a4 | ||
|
|
985a2ec261 | ||
|
|
f5c798e48c | ||
|
|
3c7f2ff3ce | ||
|
|
5416a6f8d7 | ||
|
|
25796d27a1 | ||
|
|
a226423258 | ||
|
|
891cd96638 | ||
|
|
f97edfd04d | ||
|
|
42ffffd902 | ||
|
|
9fcca73f53 | ||
|
|
9fca33136d | ||
|
|
e196f5fcfb | ||
|
|
978a7a627e | ||
|
|
6eea200c35 | ||
|
|
aa50fcf02a | ||
|
|
7481959647 | ||
|
|
291a7f1752 | ||
|
|
06c4b91b61 | ||
|
|
127fa9ae37 | ||
|
|
4573c0b962 | ||
|
|
7ab320d923 | ||
|
|
c77fb6479e | ||
|
|
ef22a539aa | ||
|
|
c2971d5176 | ||
|
|
43b63be53a | ||
|
|
1b972a5537 | ||
|
|
c844f0aa25 | ||
|
|
3251cf792c | ||
|
|
e88c4d97cf | ||
|
|
c7828888ab | ||
|
|
160f5e0786 | ||
|
|
3a1f3df882 | ||
|
|
34db5f2003 | ||
|
|
8b28344448 | ||
|
|
ff5b585446 | ||
|
|
2a5a389f7d | ||
|
|
0dc76931c6 | ||
|
|
fc569650ce | ||
|
|
cd17018ec7 | ||
|
|
26bdf50109 | ||
|
|
93b7cf05e8 | ||
|
|
06b55e3fba | ||
|
|
47d3d77322 | ||
|
|
cdbc4baa58 | ||
|
|
d24f532396 | ||
|
|
d153208fc0 | ||
|
|
20cc8bc9f6 | ||
|
|
a576127c49 | ||
|
|
ad74bb0247 | ||
|
|
1843ef7928 | ||
|
|
c1f4953008 | ||
|
|
71b7693429 | ||
|
|
bbd125a778 | ||
|
|
4a04aeb2aa | ||
|
|
b46c6b700b | ||
|
|
7f645f9f34 | ||
|
|
d988214e01 | ||
|
|
04b07f8bd3 | ||
|
|
e3e30fbf07 | ||
|
|
ea13be85b9 | ||
|
|
f02e6ca526 | ||
|
|
c7c9da4296 | ||
|
|
0022ccf790 | ||
|
|
08783ca6d2 | ||
|
|
ac8b74ef4a | ||
|
|
a022eaf6b2 | ||
|
|
a8d646b108 | ||
|
|
f47f596a1f | ||
|
|
197726ce61 | ||
|
|
24785b3a61 | ||
|
|
9bbc22f496 | ||
|
|
a5fd618770 | ||
|
|
4c7d1e0381 | ||
|
|
f84568e171 | ||
|
|
fffb682f7a | ||
|
|
906e90727e | ||
|
|
a637957c7c | ||
|
|
00b158829f | ||
|
|
e1d1b0baff | ||
|
|
0ec3cfdf04 | ||
|
|
4672497206 | ||
|
|
25e5e3b837 | ||
|
|
d8cc6d95e6 | ||
|
|
7dd05df4ea | ||
|
|
dbf587a515 | ||
|
|
193ab717fa | ||
|
|
f922b493a6 | ||
|
|
71f6467581 | ||
|
|
02686ce804 | ||
|
|
95d51446f8 | ||
|
|
465168d2af | ||
|
|
991e995027 | ||
|
|
e6e117a567 | ||
|
|
591cb51a2d | ||
|
|
1caa45ad4b | ||
|
|
b523682af0 | ||
|
|
7b1ee53a4e | ||
|
|
b6c9a4a713 | ||
|
|
93cf1b1df7 | ||
|
|
08e25bf397 | ||
|
|
6fc604d182 | ||
|
|
3d2a1abb35 | ||
|
|
258a71ffbd | ||
|
|
cb8b6db577 | ||
|
|
b64cb5b250 | ||
|
|
a663654418 | ||
|
|
8aff18aed5 | ||
|
|
2de0b9b5e1 | ||
|
|
ff72fbc6bc | ||
|
|
a0289d74fa | ||
|
|
bb87425898 | ||
|
|
a404bfd96c | ||
|
|
b784e6bd64 | ||
|
|
e3aa8400d4 | ||
|
|
db255c130d | ||
|
|
e8f4e4e01f | ||
|
|
3d3c0c7c03 | ||
|
|
fd09bd61bf | ||
|
|
a8cd23944f | ||
|
|
07edce1712 | ||
|
|
afdc20a91b | ||
|
|
ab0e4aadae | ||
|
|
a91a25c972 | ||
|
|
64a02f3b67 | ||
|
|
cdb3e36b99 | ||
|
|
cb8007bb31 | ||
|
|
92f547655c | ||
|
|
c1c9b0bcbe | ||
|
|
bca0b40679 | ||
|
|
3df4cbae6b | ||
|
|
16bbb96d5b | ||
|
|
e3e01a64c9 | ||
|
|
3ad4d26fd1 | ||
|
|
dec1c93c3d | ||
|
|
9410e89310 | ||
|
|
a054eb8139 | ||
|
|
c453384e97 | ||
|
|
c7d2bbe513 | ||
|
|
78bc736c19 | ||
|
|
1f52063065 | ||
|
|
876d9eac52 | ||
|
|
56c660dbe9 | ||
|
|
e60c6e3f84 | ||
|
|
dcf4473284 | ||
|
|
b6ac32b0db | ||
|
|
071db178eb | ||
|
|
f703b8e1c5 | ||
|
|
f415d7118d | ||
|
|
5cec297209 | ||
|
|
2fbe01e15f | ||
|
|
ed7e13c6eb | ||
|
|
8fde111b93 | ||
|
|
98b91e1d4c | ||
|
|
7b5165c70a | ||
|
|
e6762ffe1f | ||
|
|
dbcf482f07 | ||
|
|
b00f64ed56 | ||
|
|
10e8d30699 | ||
|
|
fa315a3115 | ||
|
|
e2d13c9762 | ||
|
|
aaccaf9796 | ||
|
|
83324945ad | ||
|
|
cbd30e62fa | ||
|
|
22d0f60e12 | ||
|
|
694a5bb1b5 | ||
|
|
a8dabcefea | ||
|
|
3ce2ba4e5d | ||
|
|
432a889cc0 | ||
|
|
5e1e8a58a7 | ||
|
|
e5a94ee6dd | ||
|
|
42eeb9d65e | ||
|
|
e4dec0771c | ||
|
|
a9a67824dd | ||
|
|
388452f1bc | ||
|
|
73382b8284 | ||
|
|
a5f9c92507 | ||
|
|
d0fac35f68 | ||
|
|
bbb369a937 | ||
|
|
42eb48faa7 | ||
|
|
2ef32ad9bc | ||
|
|
3e2adfbcbc | ||
|
|
11b2f82936 | ||
|
|
b80a6660bf | ||
|
|
3521765b62 | ||
|
|
e88779c4ef | ||
|
|
e78075e831 | ||
|
|
80cb191214 | ||
|
|
e0c459be75 | ||
|
|
3262bfa66e | ||
|
|
3bc88cfd11 | ||
|
|
99cf3b654a | ||
|
|
4031335617 | ||
|
|
f2f0e68f9d | ||
|
|
7a8e3a421c | ||
|
|
f7d591f150 | ||
|
|
1f213b0b8e | ||
|
|
73c76d1456 | ||
|
|
fa64a12850 | ||
|
|
ef3991d461 | ||
|
|
6e839bf82c | ||
|
|
404814f706 | ||
|
|
eeaf2c1596 | ||
|
|
fe702e469d | ||
|
|
170291413d | ||
|
|
48ddbc6805 | ||
|
|
e42dd36967 | ||
|
|
e5e58ec2f4 | ||
|
|
b9cf840a10 | ||
|
|
0bea0aafc4 | ||
|
|
7241aa6a38 | ||
|
|
4f618d6170 | ||
|
|
d5830ced24 | ||
|
|
915af964f4 | ||
|
|
9c41f88a56 | ||
|
|
17251ddaac | ||
|
|
b21b87df28 | ||
|
|
e44851306d | ||
|
|
0dee574c57 | ||
|
|
988b483ab0 | ||
|
|
513ed46e56 | ||
|
|
bd1de293c6 | ||
|
|
877d7b3bf9 | ||
|
|
1673ba3dfb | ||
|
|
183e105f87 | ||
|
|
d6503bdd47 | ||
|
|
c2460ee36a | ||
|
|
5f1f1abe3f | ||
|
|
694718963a | ||
|
|
7ccf7a917f | ||
|
|
51af1a19f0 | ||
|
|
2b41586884 | ||
|
|
5c0098e2f0 | ||
|
|
7ad4dcd3a1 | ||
|
|
05fd086418 | ||
|
|
0d9f417f7b | ||
|
|
20a6f9785b | ||
|
|
d765d1f2ab | ||
|
|
9695420fce | ||
|
|
7f34328b24 | ||
|
|
790ba35688 | ||
|
|
6df0e46245 | ||
|
|
55c1f58192 | ||
|
|
d56adbf3c1 | ||
|
|
7d27d45d02 | ||
|
|
8d85ca9c78 | ||
|
|
cce0b45f97 | ||
|
|
e24847b130 | ||
|
|
992b32a969 | ||
|
|
6143779c63 | ||
|
|
0c5a731f23 | ||
|
|
11dc7d2b81 | ||
|
|
000e60c193 | ||
|
|
1096744662 | ||
|
|
bed11c711e | ||
|
|
13752a6768 | ||
|
|
62e38a05c0 | ||
|
|
b86efd9cbe | ||
|
|
8b56ae1755 | ||
|
|
a9c3b9b483 | ||
|
|
cf2b532a79 | ||
|
|
4a4a878507 | ||
|
|
ad5e6a9eea | ||
|
|
1d511eca7f | ||
|
|
ed83cbd1eb | ||
|
|
f6e750fb66 | ||
|
|
9576283381 | ||
|
|
c26f9fea3d | ||
|
|
9bd28ec137 | ||
|
|
4e9670b5aa | ||
|
|
857fd74e1b | ||
|
|
0d681a0e72 | ||
|
|
67262694de | ||
|
|
fac6a63f67 | ||
|
|
24645f26c6 | ||
|
|
b40ed6af9b | ||
|
|
7882472b73 | ||
|
|
dc636f2b44 | ||
|
|
b6b7bd1c19 | ||
|
|
d09d042806 | ||
|
|
a6f2310e4b | ||
|
|
d89807b6eb | ||
|
|
e5013e5327 | ||
|
|
1a1d843f16 | ||
|
|
fdea4022d1 | ||
|
|
3353735f3c | ||
|
|
aca66630ff | ||
|
|
70e1e0cecf | ||
|
|
3a5eda8cae | ||
|
|
f905243047 | ||
|
|
cf4a005e32 | ||
|
|
5adc20ca06 |
@@ -1,37 +1,17 @@
|
||||
job1:
|
||||
script:
|
||||
- echo $PWD
|
||||
- echo $USER
|
||||
- echo $OAI_USER
|
||||
- echo $OAI_EXTRA_ARGS
|
||||
- echo $NFS_SHARE_DIR
|
||||
- echo $EXTERNAL_SHARE_DIR
|
||||
- echo $SHELL
|
||||
- echo $OAI_TEST_CASE_GROUP
|
||||
- echo $MACHINELIST
|
||||
- echo $MACHINELISTGENERIC
|
||||
- git rev-parse --abbrev-ref HEAD
|
||||
- git_repo=`git config --get remote.origin.url`
|
||||
- git_head=`git rev-parse HEAD`
|
||||
- echo $git_head
|
||||
- tmp=`git show-ref --head | grep $git_head`
|
||||
- tmp=(${tmp///// })
|
||||
- git_branch=${tmp[@]:(-1)}
|
||||
- echo $git_branch
|
||||
- source oaienv
|
||||
- echo $OPENAIR_DIR
|
||||
- NFS_TEST_RESULTS_DIR=$NFS_SHARE_DIR/$git_branch/$git_head
|
||||
- EXTERNAL_SHARE_RESULTS_DIR=$EXTERNAL_SHARE_DIR/$git_branch/$git_head
|
||||
- echo $NFS_TEST_RESULTS_DIR
|
||||
- echo $EXTERNAL_SHARE_RESULTS_DIR
|
||||
- echo $NRUNS_LTE_SOFTMODEM
|
||||
- echo $TIMEOUT_CMD
|
||||
- mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
|
||||
- python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC" -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
|
||||
- python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC" -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
|
||||
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log
|
||||
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest_cleanup.log
|
||||
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
|
||||
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR
|
||||
- cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml
|
||||
when: manual
|
||||
- date
|
||||
- pwd
|
||||
- echo $OAI_TEST_CASE_GROUP
|
||||
- echo $MACHINELIST
|
||||
- echo $MACHINELISTGENERIC
|
||||
- echo $RESULT_DIR
|
||||
- echo $NRUNS_LTE_SOFTMODEM
|
||||
- source oaienv
|
||||
- rm -rf cmake_targets/autotests/log
|
||||
- mkdir cmake_targets/autotests/log
|
||||
- cd cmake_targets/autotests/v2
|
||||
- python main.py
|
||||
- date
|
||||
only:
|
||||
- triggers
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
The source code of openairinterface5g is distributed under OAI Public License V1.0.
|
||||
For more details of the license, refer to LICENSE file in the same directory.
|
||||
|
||||
However, the source code also contains third party software that is acknowledged here for reference.
|
||||
|
||||
Credits for LFDS user space source code located in folder openair2/UTILS/LFDS/liblfds6.1.1/
|
||||
http://liblfds.org/.
|
||||
Extract from http://liblfds.org/pages/downloads_and_license.html:
|
||||
|
||||
81
README.txt
81
README.txt
@@ -1,36 +1,45 @@
|
||||
OpenAirInterface is under OpenAirInterface Software Alliance license.
|
||||
├── http://www.openairinterface.org/?page_id=101
|
||||
├── http://www.openairinterface.org/?page_id=698
|
||||
|
||||
The OpenAirInterface (OAI) software is composed of the following parts:
|
||||
|
||||
openairinterface5g
|
||||
├── cmake_targets: build utilities to compile (simulation, emulation and real-time platforms), and generated build files
|
||||
├── common : some common OAI utilities, other tools can be found at openair2/UTILS
|
||||
├── LICENSE
|
||||
├── maketags : script to generate emacs tags
|
||||
├── openair1 : 3GPP LTE Rel-10 PHY layer + PHY RF simulation and a subset of Rel 12 Features.
|
||||
├── openair2 :3GPP LTE Rel-10 RLC/MAC/PDCP/RRC/X2AP implementation.
|
||||
├── LAYER2/RLC/ with the following subdirectories: UM_v9.3.0, TM_v9.3.0, and AM_v9.3.0.
|
||||
├── LAYER2/PDCP/PDCP_v10.1.0.
|
||||
├── RRC/LITE
|
||||
├── PHY_INTERFACE
|
||||
├── X2AP
|
||||
├── ENB_APP
|
||||
├── openair3: 3GPP LTE Rel10 for S1AP, NAS GTPV1-U for both ENB and UE.
|
||||
├── GTPV1-U
|
||||
├── NAS
|
||||
├── S1AP
|
||||
├── SCTP
|
||||
├── SECU
|
||||
├── UDP
|
||||
└── targets: top level wrapper for unitary simulation for PHY channels, system-level emulation (eNB-UE with and without S1), and realtime eNB and UE and RRH GW.
|
||||
|
||||
|
||||
RELEASE NOTES:
|
||||
|
||||
v0.1 -> Last stable commit on develop branch before enhancement-10-harmony
|
||||
v0.2 -> Merge of enhancement-10-harmony to include NGFI RRH + New Interface for RF/BBU
|
||||
v0.3 -> Last stable commit on develop branch before the merge of feature-131-new-license. This is the last commit with GPL License
|
||||
v0.4 -> Merge of feature-131-new-license. It closes issue#131 and changes the license to OAI Public License V1.0
|
||||
v0.5 -> Merge of enhancement-10-harmony-lts. It includes fixes for Ubuntu 16.04 support
|
||||
OpenAirInterface is under OpenAirInterface Software Alliance license.
|
||||
├── http://www.openairinterface.org/?page_id=101
|
||||
├── http://www.openairinterface.org/?page_id=698
|
||||
|
||||
It is distributed under OAI Public License V1.0.
|
||||
The license information is distributed under LICENSE file in the same directory.
|
||||
Please see NOTICE.txt for third party software that is included in the sources.
|
||||
|
||||
The OpenAirInterface (OAI) software is composed of the following parts:
|
||||
|
||||
openairinterface5g
|
||||
├── cmake_targets: build utilities to compile (simulation, emulation and real-time platforms), and generated build files
|
||||
├── common : some common OAI utilities, other tools can be found at openair2/UTILS
|
||||
├── LICENSE
|
||||
├── maketags : script to generate emacs tags
|
||||
├── openair1 : 3GPP LTE Rel-10 PHY layer + PHY RF simulation and a subset of Rel 12 Features.
|
||||
├── openair2 :3GPP LTE Rel-10 RLC/MAC/PDCP/RRC/X2AP implementation.
|
||||
├── LAYER2/RLC/ with the following subdirectories: UM_v9.3.0, TM_v9.3.0, and AM_v9.3.0.
|
||||
├── LAYER2/PDCP/PDCP_v10.1.0.
|
||||
├── RRC/LITE
|
||||
├── PHY_INTERFACE
|
||||
├── X2AP
|
||||
├── ENB_APP
|
||||
├── openair3: 3GPP LTE Rel10 for S1AP, NAS GTPV1-U for both ENB and UE.
|
||||
├── GTPV1-U
|
||||
├── NAS
|
||||
├── S1AP
|
||||
├── SCTP
|
||||
├── SECU
|
||||
├── UDP
|
||||
└── targets: top level wrapper for unitary simulation for PHY channels, system-level emulation (eNB-UE with and without S1), and realtime eNB and UE and RRH GW.
|
||||
|
||||
|
||||
RELEASE NOTES:
|
||||
|
||||
v0.1 -> Last stable commit on develop branch before enhancement-10-harmony
|
||||
v0.2 -> Merge of enhancement-10-harmony to include NGFI RRH + New Interface for RF/BBU
|
||||
v0.3 -> Last stable commit on develop branch before the merge of feature-131-new-license. This is the last commit with GPL License
|
||||
v0.4 -> Merge of feature-131-new-license. It closes issue#131 and changes the license to OAI Public License V1.0
|
||||
v0.5 -> Merge of enhancement-10-harmony-lts. It includes fixes for Ubuntu 16.04 support
|
||||
v0.5.1 -> Merge of bugfix-137-uplink-fixes. It includes stablity fixes for eNB
|
||||
v0.5.2 -> Last version with old code for oaisim (abstraction mode works)
|
||||
v0.6 -> RRH functionality, UE greatly improved, better TDD support,
|
||||
a lot of bugs fixed. WARNING: oaisim in PHY abstraction mode does not
|
||||
work, you need to use v0.5.2 for that.
|
||||
|
||||
@@ -37,11 +37,6 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
|
||||
|
||||
project (OpenAirInterface)
|
||||
|
||||
#add_definitions("-DEMIT_ASN_DEBUG=1")
|
||||
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m)
|
||||
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR)
|
||||
add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C)
|
||||
|
||||
###########################################
|
||||
# macros to define options as there is numerous options in oai
|
||||
################################################
|
||||
@@ -119,6 +114,8 @@ endmacro(add_list_string_option)
|
||||
####################################################
|
||||
# compilation flags
|
||||
#############################################
|
||||
|
||||
#set(CMAKE_BUILD_TYPE "Debug")
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
|
||||
endif()
|
||||
@@ -133,6 +130,9 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
||||
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
|
||||
if (CPUINFO MATCHES "avx2")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
||||
set(COMPILATION_AVX2 "True")
|
||||
else()
|
||||
set(COMPILATION_AVX2 "False")
|
||||
endif()
|
||||
if (CPUINFO MATCHES "sse4_1")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
|
||||
@@ -174,7 +174,7 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU
|
||||
# these changes are related to hardcoded path to include .h files
|
||||
add_definitions(-DCMAKER)
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
|
||||
|
||||
|
||||
set(GIT_BRANCH "UNKNOWN")
|
||||
@@ -199,7 +199,7 @@ if(GIT_FOUND)
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
|
||||
# Get the latest commit date of the working branch
|
||||
execute_process(
|
||||
COMMAND git log -1 --format=%cd
|
||||
@@ -227,14 +227,18 @@ add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
||||
add_boolean_option(XER_PRINT False "print XER Format")
|
||||
add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
|
||||
add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
|
||||
add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(TEST_OMG False "???")
|
||||
add_boolean_option(DEBUG_OMG False "???")
|
||||
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
||||
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
||||
add_boolean_option(T_TRACER False "Activate the T tracer, a debugging/monitoring framework" )
|
||||
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
|
||||
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
|
||||
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
|
||||
add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros")
|
||||
|
||||
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
||||
|
||||
@@ -282,8 +286,10 @@ if (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-86.asn)
|
||||
elseif (${RRC_ASN1_VERSION} STREQUAL "CBA")
|
||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20-lola.asn)
|
||||
else()
|
||||
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel10")
|
||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20.asn)
|
||||
else()
|
||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/RRC-e10.asn)
|
||||
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
||||
|
||||
set (RRC_FULL_DIR ${asn1_generated_dir}/${RRC_ASN1_VERSION})
|
||||
@@ -475,7 +481,7 @@ include_directories ("${X2AP_DIR}")
|
||||
# Hardware dependant options
|
||||
###################################
|
||||
add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
|
||||
add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
|
||||
|
||||
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW" "OAI_LMSSDR")
|
||||
@@ -489,107 +495,57 @@ add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/")
|
||||
#set (option_HWEXMIMOLIB_lib "-l ")
|
||||
set(HWLIB_EXMIMO_SOURCE
|
||||
set(HWLIB_EXMIMO_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
|
||||
# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c
|
||||
)
|
||||
add_library(oai_exmimodevif MODULE ${HWLIB_EXMIMO_SOURCE} )
|
||||
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
||||
set (option_HWUSRPLIB_lib "-l uhd")
|
||||
set(HWLIB_USRP_SOURCE
|
||||
set(HWLIB_USRP_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
|
||||
)
|
||||
add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} )
|
||||
target_link_libraries(oai_usrpdevif uhd)
|
||||
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
||||
set (option_HWBLADERFLIB_lib "-l bladerf")
|
||||
set(HWLIB_BLADERF_SOURCE
|
||||
set(HWLIB_BLADERF_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
||||
)
|
||||
add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} )
|
||||
target_link_libraries(oai_bladerfdevif bladeRF)
|
||||
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/")
|
||||
set (option_HWLMSSDRLIB_lib "-l LMS_SDR -l LMS7002M -l Si5351C")
|
||||
set(HWLIB_LMSSDR_SOURCE
|
||||
|
||||
set(HWLIB_LMSSDR_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
|
||||
)
|
||||
add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
|
||||
target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime)
|
||||
target_link_libraries(oai_lmssdrdevif LimeSuite )
|
||||
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
|
||||
set(TPLIB_ETHERNET_SOURCE
|
||||
set(TPLIB_ETHERNET_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c
|
||||
)
|
||||
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
|
||||
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/mobipass/")
|
||||
set(TPLIB_MOBIPASS_SOURCE
|
||||
${OPENAIR_TARGETS}/ARCH/mobipass/interface.c
|
||||
${OPENAIR_TARGETS}/ARCH/mobipass/mobipass.c
|
||||
${OPENAIR_TARGETS}/ARCH/mobipass/queues.c
|
||||
)
|
||||
add_library(oai_mobipass MODULE ${TPLIB_MOBIPASS_SOURCE} )
|
||||
|
||||
# RF devices / transport protocols settings
|
||||
######################################################################
|
||||
if (${RF_BOARD} STREQUAL "EXMIMO")
|
||||
set(DRIVER2013)
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c)
|
||||
# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c)
|
||||
set(option_HW_lib "-rdynamic -ldl")
|
||||
# Hide all functions/variables in the mobipass library.
|
||||
# Use __attribute__((__visibility__("default")))
|
||||
# in the source code to unhide a function/variable.
|
||||
get_target_property(mobipas_cflags oai_mobipass COMPILE_FLAGS)
|
||||
set_target_properties(oai_mobipass PROPERTIES COMPILE_FLAGS "${mobipass_cflags} -fvisibility=hidden")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_USRP")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
|
||||
include_directories("/opt/include/uhd")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp)
|
||||
LINK_DIRECTORIES("/opt/lib")
|
||||
set(option_HW_lib "-luhd -rdynamic -ldl -lboost_system")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LOG")
|
||||
include_directories("/usr/include")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
|
||||
)
|
||||
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||
|
||||
set(option_HW_lib "bladeRF -rdynamic -ldl")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C")
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard")
|
||||
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR")
|
||||
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m")
|
||||
LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C")
|
||||
set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp)
|
||||
set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "CPRIGW")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c
|
||||
)
|
||||
include_directories("${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/")
|
||||
set(option_HW_lib "-rdynamic dl")
|
||||
|
||||
endif (${RF_BOARD} STREQUAL "EXMIMO")
|
||||
|
||||
|
||||
if (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB")
|
||||
set(TRANSPORT_SOURCE ${TRANSPORT_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c
|
||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c
|
||||
)
|
||||
set(option_TP_lib "-rdynamic -ldl")
|
||||
|
||||
|
||||
endif (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||
##########################################################
|
||||
|
||||
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")
|
||||
@@ -621,7 +577,7 @@ add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequenc
|
||||
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
||||
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
||||
|
||||
add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller")
|
||||
add_boolean_option(FLEXRAN_AGENT_SB_IF False "enable FlexRAN agent to inteface with a SDN controller")
|
||||
|
||||
########################
|
||||
# Include order
|
||||
@@ -817,8 +773,10 @@ include_directories("${OPENAIR_DIR}/targets/ARCH/COMMON")
|
||||
include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/USERSPACE/LIB/")
|
||||
include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/DEFS")
|
||||
include_directories("${OPENAIR2_DIR}/ENB_APP")
|
||||
include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/OSA")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/MEM")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/LISTS")
|
||||
include_directories("${OPENAIR2_DIR}/UTIL/FIFO")
|
||||
@@ -837,6 +795,94 @@ include_directories("${OPENAIR_DIR}")
|
||||
|
||||
# Utilities Library
|
||||
################
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
# set the version of protobuf messages, V3 not supported yet
|
||||
add_list1_option(FLPT_VERSION V2 "FLPT MSG protobuf grammar version" V2 V3)
|
||||
|
||||
if (${FLPT_VERSION} STREQUAL "V2")
|
||||
set (FLPTDIR V2)
|
||||
elseif (${FLPT_VERSION} STREQUAL "V3")
|
||||
set (FLPTDIR V3)
|
||||
endif(${FLPT_VERSION} STREQUAL "V2")
|
||||
|
||||
set(FLPT_MSG_DIR ${OPENAIR2_DIR}/ENB_APP/MESSAGES/${FLPTDIR} )
|
||||
set(FLPT_MSG_FILES
|
||||
${FLPT_MSG_DIR}/header.proto
|
||||
${FLPT_MSG_DIR}/flexran.proto
|
||||
${FLPT_MSG_DIR}/stats_common.proto
|
||||
${FLPT_MSG_DIR}/stats_messages.proto
|
||||
${FLPT_MSG_DIR}/time_common.proto
|
||||
${FLPT_MSG_DIR}/controller_commands.proto
|
||||
${FLPT_MSG_DIR}/mac_primitives.proto
|
||||
${FLPT_MSG_DIR}/config_messages.proto
|
||||
${FLPT_MSG_DIR}/config_common.proto
|
||||
${FLPT_MSG_DIR}/control_delegation.proto
|
||||
)
|
||||
|
||||
set(FLPT_C_DIR ${protobuf_generated_dir}/${FLPTDIR})
|
||||
#message("calling protoc_call=${protoc_call} FLPT_C_DIR=${FLPT_C_DIR} FLPT_MSG_FILES=${FLPT_MSG_FILES}")
|
||||
execute_process(COMMAND ${protoc_call} ${FLPT_C_DIR} ${FLPT_MSG_DIR} ${FLPT_MSG_FILES})
|
||||
file(GLOB FLPT_source ${FLPT_C_DIR}/*.c)
|
||||
set(FLPT_OAI_generated
|
||||
${FLPT_C_DIR}/header.pb-c.c
|
||||
${FLPT_C_DIR}/flexran.pb-c.c
|
||||
${FLPT_C_DIR}/stats_common.pb-c.c
|
||||
${FLPT_C_DIR}/stats_messages.pb-c.c
|
||||
${FLPT_C_DIR}/time_common.pb-c.c
|
||||
${FLPT_C_DIR}/controller_commands.pb-c.c
|
||||
${FLPT_C_DIR}/mac_primitives.pb-c.c
|
||||
${FLPT_C_DIR}/config_messages.pb-c.c
|
||||
${FLPT_C_DIR}/config_common.pb-c.c
|
||||
${FLPT_C_DIR}/control_delegation.pb-c.c
|
||||
)
|
||||
|
||||
file(GLOB flpt_h ${FLPT_C_DIR}/*.h)
|
||||
set(flpt_h ${flpt_h} )
|
||||
|
||||
add_library(FLPT_MSG
|
||||
${FLPT_OAI_generated}
|
||||
${FLPT_source}
|
||||
)
|
||||
set(FLPT_MSG_LIB FLPT_MSG)
|
||||
#message("prpt c dir is : ${FLPT_C_DIR}")
|
||||
include_directories (${FLPT_C_DIR})
|
||||
|
||||
add_library(ASYNC_IF
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c
|
||||
${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c
|
||||
)
|
||||
set(ASYNC_IF_LIB ASYNC_IF)
|
||||
include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF)
|
||||
|
||||
add_library(FLEXRAN_AGENT
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_handler.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_common.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_common_internal.c
|
||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_task_manager.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c
|
||||
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
|
||||
)
|
||||
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
|
||||
#include_directories(${OPENAIR2_DIR}/ENB_APP)
|
||||
|
||||
set(PROTOBUF_LIB "protobuf-c")
|
||||
|
||||
FIND_PATH(LIBYAML_INCLUDE_DIR NAMES yaml.h)
|
||||
FIND_LIBRARY(LIBYAML_LIBRARIES NAMES yaml libyaml)
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Yaml DEFAULT_MSG LIBYAML_LIBRARIES LIBYAML_INCLUDE_DIR)
|
||||
MARK_AS_ADVANCED(LIBYAML_INCLUDE_DIR LIBYAML_LIBRARIES)
|
||||
|
||||
#set(PROTOBUF_LIB "protobuf") #for Cpp
|
||||
endif()
|
||||
|
||||
|
||||
add_library(HASHTABLE
|
||||
${OPENAIR_DIR}/common/utils/hashtable/hashtable.c
|
||||
${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c
|
||||
@@ -844,9 +890,9 @@ add_library(HASHTABLE
|
||||
include_directories(${OPENAIR_DIR}/common/utils/hashtable)
|
||||
|
||||
if (MESSAGE_CHART_GENERATOR)
|
||||
add_library(MSC
|
||||
add_library(MSC
|
||||
${OPENAIR_DIR}/common/utils/msc/msc.c
|
||||
)
|
||||
)
|
||||
set(MSC_LIB MSC)
|
||||
endif()
|
||||
include_directories(${OPENAIR_DIR}/common/utils/msc)
|
||||
@@ -923,13 +969,14 @@ add_library(SECU_CN ${SECU_CN_SRC})
|
||||
|
||||
# Scheduler
|
||||
################################"
|
||||
set(SCHED_SRC
|
||||
set(SCHED_SRC
|
||||
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c
|
||||
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c
|
||||
${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c
|
||||
${OPENAIR1_DIR}/SCHED/phy_mac_stub.c
|
||||
${OPENAIR1_DIR}/SCHED/pucch_pc.c
|
||||
${OPENAIR1_DIR}/SCHED/pusch_pc.c
|
||||
${OPENAIR1_DIR}/SCHED/srs_pc.c
|
||||
)
|
||||
add_library(SCHED_LIB ${SCHED_SRC})
|
||||
|
||||
@@ -978,11 +1025,14 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
|
||||
@@ -1011,6 +1061,7 @@ set(PHY_SRC
|
||||
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
||||
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
|
||||
@@ -1025,6 +1076,11 @@ set(PHY_SRC
|
||||
if (${SMBV})
|
||||
set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c")
|
||||
endif (${SMBV})
|
||||
|
||||
if (${COMPILATION_AVX2} STREQUAL "True")
|
||||
set(PHY_SRC ${PHY_SRC} ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c)
|
||||
endif ()
|
||||
|
||||
add_library(PHY ${PHY_SRC})
|
||||
|
||||
#Layer 2 library
|
||||
@@ -1095,7 +1151,17 @@ set (MAC_SRC
|
||||
${MAC_DIR}/eNB_scheduler_RA.c
|
||||
${MAC_DIR}/pre_processor.c
|
||||
${MAC_DIR}/config.c
|
||||
)
|
||||
)
|
||||
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
|
||||
set (MAC_SRC ${MAC_SRC}
|
||||
${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c
|
||||
${MAC_DIR}/flexran_agent_scheduler_dataplane.c
|
||||
${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c
|
||||
)
|
||||
|
||||
endif()
|
||||
|
||||
set (ENB_APP_SRC
|
||||
${OPENAIR2_DIR}/ENB_APP/enb_app.c
|
||||
@@ -1108,6 +1174,14 @@ add_library(L2
|
||||
${ENB_APP_SRC})
|
||||
# ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c)
|
||||
|
||||
if (FLEXRAN_AGENT_SB_IF)
|
||||
|
||||
#Test for adding a shared library
|
||||
add_library(default_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c)
|
||||
add_library(remote_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c)
|
||||
|
||||
endif()
|
||||
|
||||
# L3 Libs
|
||||
##########################
|
||||
|
||||
@@ -1194,7 +1268,7 @@ set(libnas_api_OBJS
|
||||
${NAS_SRC}COMMON/API/NETWORK/nas_message.c
|
||||
${NAS_SRC}COMMON/API/NETWORK/network_api.c
|
||||
)
|
||||
|
||||
|
||||
set(libnas_emm_msg_OBJS
|
||||
${NAS_SRC}COMMON/EMM/MSG/AttachAccept.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/AttachComplete.c
|
||||
@@ -1227,7 +1301,7 @@ set(libnas_emm_msg_OBJS
|
||||
${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateRequest.c
|
||||
${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c
|
||||
)
|
||||
|
||||
|
||||
set(libnas_esm_msg_OBJS
|
||||
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c
|
||||
${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c
|
||||
@@ -1347,7 +1421,7 @@ set (libnas_utils_OBJS
|
||||
${NAS_SRC}COMMON/UTIL/OctetString.c
|
||||
)
|
||||
|
||||
if(NAS_UE)
|
||||
if(NAS_UE)
|
||||
set(libnas_ue_api_OBJS
|
||||
${NAS_SRC}UE/API/USER/at_command.c
|
||||
${NAS_SRC}UE/API/USER/at_error.c
|
||||
@@ -1468,6 +1542,23 @@ add_library(LFDS
|
||||
${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c
|
||||
)
|
||||
|
||||
set(lfds7 ${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/src/)
|
||||
file(GLOB lfds7_queue ${lfds7}/lfds700_queue/*.c)
|
||||
file(GLOB lfds7_ring ${lfds7}/lfds700_ringbuffer/*.c)
|
||||
file(GLOB lfds7_qbss ${lfds7}/lfds700_queue_bounded_singleconsumer_singleproducer/*.c)
|
||||
file(GLOB lfds7_stack ${lfds7}/lfds700_stack/*.c)
|
||||
file(GLOB lfds7_freelist ${lfds7}/lfds700_freelist/*.c)
|
||||
file(GLOB lfds7_btree ${lfds7}/lfds700_btree_addonly_unbalanced/*.c)
|
||||
file(GLOB lfds7_hash ${lfds7}/lfds700_hash_addonly/*.c)
|
||||
file(GLOB lfds7_ordered_list ${lfds7}/lfds700_list_addonly_ordered_singlylinked/*.c)
|
||||
file(GLOB lfds7_unordered_list ${lfds7}/lfds700_list_addonly_singlylinked_unordered/*.c)
|
||||
file(GLOB lfds7_misc ${lfds7}/lfds700_misc/*.c)
|
||||
|
||||
include_directories(${lfds7})
|
||||
add_library(LFDS7
|
||||
${lfds7_queue} ${lfds7_ring} ${lfds7_qbss} ${lfds7_stack} ${lfds7_freelist} ${lfds7_btree} ${lfds7_hash} ${lfds7_ordered_list} ${lfds7_unordered_list} ${lfds7_misc}
|
||||
)
|
||||
|
||||
# Simulation library
|
||||
##########################
|
||||
add_library(SIMU
|
||||
@@ -1558,9 +1649,25 @@ else()
|
||||
endif()
|
||||
|
||||
# Atlas is required by some packages, but not found in pkg-config
|
||||
if(EXISTS "/usr/include/atlas/cblas.h")
|
||||
# So, here are some hacks here. Hope this gets fixed in future!
|
||||
if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h")
|
||||
include_directories("/usr/include/atlas")
|
||||
list(APPEND ATLAS_LIBRARIES lapack cblas atlas)
|
||||
LINK_DIRECTORIES("/usr/lib64")
|
||||
LINK_DIRECTORIES("/usr/lib64/atlas") #Added because atlas libraries in CentOS 7 are here!
|
||||
|
||||
if(EXISTS "/usr/lib64/libblas.so" OR EXISTS "/usr/lib/libblas.so") #Case for CentOS7
|
||||
list(APPEND ATLAS_LIBRARIES blas)
|
||||
else() # Case for Ubuntu
|
||||
list(APPEND ATLAS_LIBRARIES cblas)
|
||||
endif()
|
||||
|
||||
if(EXISTS "/usr/lib/atlas/libtatlas.so" OR EXISTS "/usr/lib64/atlas/libtatlas.so") #Case for CentOS7
|
||||
list(APPEND ATLAS_LIBRARIES tatlas)
|
||||
else()
|
||||
list(APPEND ATLAS_LIBRARIES atlas) #Case for Ubuntu
|
||||
endif()
|
||||
|
||||
list(APPEND ATLAS_LIBRARIES lapack)
|
||||
else()
|
||||
message("No Blas/Atlas libs found, some targets will fail")
|
||||
endif()
|
||||
@@ -1633,9 +1740,9 @@ add_executable(lte-softmodem
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${OPENAIR_DIR}/common/utils/utils.c
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${GTPU_need_ITTI}
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1644,11 +1751,11 @@ add_executable(lte-softmodem
|
||||
|
||||
target_link_libraries (lte-softmodem -ldl
|
||||
-Wl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${T_LIB})
|
||||
|
||||
@@ -1669,8 +1776,7 @@ add_executable(lte-softmodem-nos1
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1678,11 +1784,11 @@ add_executable(lte-softmodem-nos1
|
||||
)
|
||||
target_link_libraries (lte-softmodem-nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
|
||||
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem-nos1 ${T_LIB})
|
||||
|
||||
@@ -1694,33 +1800,18 @@ add_executable(rrh_gw
|
||||
${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c
|
||||
${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c
|
||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${T_SOURCE}
|
||||
)
|
||||
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti)
|
||||
target_link_libraries(rrh_gw
|
||||
-Wl,--start-group
|
||||
UTIL LFDS
|
||||
UTIL LFDS -ldl
|
||||
-Wl,--end-group )
|
||||
target_link_libraries (rrh_gw rt pthread m )
|
||||
target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib})
|
||||
target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (rrh_gw ${T_LIB})
|
||||
|
||||
Message("-- option_HW_lib=${option_HW_lib}")
|
||||
Message("-- HW_SOURCE=${HW_SOURCE}")
|
||||
Message("-- option_TP_lib=${option_TP_lib}")
|
||||
Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}")
|
||||
|
||||
if (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||
add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C)
|
||||
add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C)
|
||||
add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C)
|
||||
endif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
|
||||
|
||||
|
||||
|
||||
# USIM process
|
||||
#################
|
||||
@@ -1767,13 +1858,14 @@ add_executable(oaisim
|
||||
${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/event_handler.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/oaisim.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${OPENAIR_DIR}/common/utils/utils.c
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${GTPU_need_ITTI}
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${T_SOURCE}
|
||||
)
|
||||
@@ -1781,12 +1873,12 @@ add_executable(oaisim
|
||||
|
||||
target_include_directories(oaisim PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
||||
target_link_libraries (oaisim
|
||||
-Wl,--start-group
|
||||
-Wl,-ldl,--start-group
|
||||
RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} LIB_NAS_UE SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB}
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
||||
target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib}
|
||||
target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp
|
||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
||||
#Force link with forms, regardless XFORMS option
|
||||
target_link_libraries (oaisim forms)
|
||||
@@ -1812,31 +1904,48 @@ add_executable(oaisim_nos1
|
||||
${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/event_handler.c
|
||||
${OPENAIR_TARGETS}/SIMU/USER/oaisim.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
${XFORMS_SOURCE}
|
||||
${T_SOURCE}
|
||||
)
|
||||
target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER)
|
||||
target_link_libraries (oaisim_nos1
|
||||
-Wl,--start-group
|
||||
RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB}
|
||||
RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
|
||||
-Wl,--end-group )
|
||||
|
||||
target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
|
||||
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib}
|
||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES})
|
||||
target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES}
|
||||
${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
#Force link with forms, regardless XFORMS option
|
||||
target_link_libraries (oaisim_nos1 forms)
|
||||
|
||||
#message("protobuflib is ${PROTOBUF_LIB}")
|
||||
|
||||
target_link_libraries (oaisim_nos1 ${T_LIB})
|
||||
|
||||
|
||||
# Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator
|
||||
#####################################
|
||||
|
||||
foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
#special case for dlim TM4, which uses its own version of phy_scope code
|
||||
add_executable(dlsim_tm4
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
|
||||
${T_SOURCE}
|
||||
)
|
||||
target_link_libraries (dlsim_tm4
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group
|
||||
pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB}
|
||||
)
|
||||
|
||||
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||
|
||||
add_executable(${myExe}
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
||||
@@ -1844,7 +1953,8 @@ foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syn
|
||||
${T_SOURCE}
|
||||
)
|
||||
target_link_libraries (${myExe}
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group
|
||||
|
||||
-Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group
|
||||
pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB}
|
||||
)
|
||||
endforeach(myExe)
|
||||
@@ -1860,7 +1970,7 @@ add_executable(test_epc_generate_scenario
|
||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
||||
)
|
||||
target_link_libraries (test_epc_generate_scenario
|
||||
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
-Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
)
|
||||
|
||||
add_executable(test_epc_play_scenario
|
||||
@@ -1881,7 +1991,7 @@ add_executable(test_epc_play_scenario
|
||||
)
|
||||
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
|
||||
target_link_libraries (test_epc_play_scenario
|
||||
-Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
-Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
)
|
||||
|
||||
|
||||
@@ -1901,7 +2011,7 @@ foreach(myExe s1ap
|
||||
${OPENAIR3_DIR}/TEST/test_${myExe}.c
|
||||
)
|
||||
target_link_libraries (test_${myExe}
|
||||
-Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
-Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
|
||||
)
|
||||
endforeach(myExe)
|
||||
|
||||
@@ -1911,20 +2021,22 @@ endforeach(myExe)
|
||||
|
||||
#ensure that the T header files are generated before targets depending on them
|
||||
if (${T_TRACER})
|
||||
add_dependencies(lte-softmodem generate_T)
|
||||
add_dependencies(lte-softmodem-nos1 generate_T)
|
||||
add_dependencies(rrh_gw generate_T)
|
||||
add_dependencies(oaisim generate_T)
|
||||
add_dependencies(oaisim_nos1 generate_T)
|
||||
add_dependencies(dlsim generate_T)
|
||||
add_dependencies(ulsim generate_T)
|
||||
add_dependencies(pbchsim generate_T)
|
||||
add_dependencies(scansim generate_T)
|
||||
add_dependencies(mbmssim generate_T)
|
||||
add_dependencies(pdcchsim generate_T)
|
||||
add_dependencies(pucchsim generate_T)
|
||||
add_dependencies(prachsim generate_T)
|
||||
add_dependencies(syncsim generate_T)
|
||||
foreach(i
|
||||
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
||||
lte-softmodem lte-softmodem-nos1 rrh_gw oaisim oaisim_nos1
|
||||
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
|
||||
pdcchsim pucchsim prachsim syncsim
|
||||
#all "add_library" definitions
|
||||
ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
|
||||
oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
|
||||
oai_eth_transpro
|
||||
FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
|
||||
SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL MIH CN_UTILS
|
||||
GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU SIMU_ETH OPENAIR0_LIB)
|
||||
if (TARGET ${i})
|
||||
add_dependencies(${i} generate_T)
|
||||
endif()
|
||||
endforeach(i)
|
||||
endif (${T_TRACER})
|
||||
|
||||
##################################################
|
||||
@@ -1949,11 +2061,16 @@ endforeach()
|
||||
# force castxml and clang compilation with gnu89 standard
|
||||
# we can't use cXX standard as pthread_rwlock_t is gnu standard
|
||||
list(APPEND itti_compiler_options "-std=gnu89")
|
||||
|
||||
set (ITTI_H ${ITTI_DIR}/intertask_interface_types.h)
|
||||
if(EXISTS /usr/bin/gccxml)
|
||||
set(xml_command gccxml ${itti_compiler_options} -fxml=${OPENAIR_BIN_DIR}/messages.xml ${ITTI_H})
|
||||
else()
|
||||
set(xml_command castxml --castxml-gccxml ${itti_compiler_options} ${ITTI_H} -o ${OPENAIR_BIN_DIR}/messages.xml)
|
||||
endif()
|
||||
|
||||
add_custom_command (
|
||||
OUTPUT ${OPENAIR_BIN_DIR}/messages.xml
|
||||
COMMAND gccxml ${itti_compiler_options} -fxml=${OPENAIR_BIN_DIR}/messages.xml ${ITTI_H}
|
||||
COMMAND ${xml_command}
|
||||
DEPENDS ${S1AP_OAI_generated} ${RRC_FULL_DIR}/asn1_constants.h
|
||||
)
|
||||
|
||||
@@ -2063,16 +2180,16 @@ make_driver(ue_ip ${OPENAIR2_DIR}/NETWORK_DRIVER/UE_IP ${ue_ip_src})
|
||||
# OCTAVE tools
|
||||
###############
|
||||
set(OCT_INCL -I${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS -I${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB -I${OPENAIR_TARGETS}/ARCH/COMMON)
|
||||
set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB)
|
||||
set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB)
|
||||
set(OCT_FLAGS -DEXMIMO)
|
||||
set(OCT_DIR ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/OCTAVE)
|
||||
set(OCT_FILES
|
||||
oarf_config_exmimo.oct
|
||||
oarf_config_exmimo.oct
|
||||
oarf_get_frame.oct
|
||||
oarf_stop.oct
|
||||
oarf_send_frame.oct
|
||||
oarf_get_num_detected_cards.oct
|
||||
oarf_config_exmimo.oct
|
||||
oarf_get_frame.oct
|
||||
oarf_stop.oct
|
||||
oarf_send_frame.oct
|
||||
oarf_get_num_detected_cards.oct
|
||||
oarf_stop_without_reset.oct
|
||||
)
|
||||
|
||||
@@ -2082,7 +2199,7 @@ foreach(file IN ITEMS ${OCT_FILES})
|
||||
OUTPUT ${file}
|
||||
DEPENDS ${OCT_DIR}/${src} OPENAIR0_LIB
|
||||
COMMAND mkoctfile
|
||||
ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS}
|
||||
ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS}
|
||||
ARGS -o ${file} ${OCT_DIR}/${src}
|
||||
COMMENT "Generating ${file}"
|
||||
VERBATIM
|
||||
|
||||
@@ -88,31 +88,47 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototype
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2")
|
||||
|
||||
#This is to detect nettle version changes between Ubuntu 14.04/16.04
|
||||
set ( nettle_cmd "nettle-hash" )
|
||||
set ( nettle_arg "-V" )
|
||||
execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev)
|
||||
|
||||
string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov})
|
||||
|
||||
message("NETTLE_VERSION = ${nv}")
|
||||
|
||||
# we need to remove decimal as floating point arithematic does not work properly with C preprocessor
|
||||
STRING(REGEX REPLACE "[.]" "" nv ${nv})
|
||||
|
||||
if ("${nv}" STREQUAL "")
|
||||
message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" )
|
||||
endif()
|
||||
|
||||
set (NETTLE_VERSION "${nv}")
|
||||
add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}")
|
||||
##This is to detect nettle version changes between Ubuntu 14.04/16.04
|
||||
#set ( nettle_cmd "nettle-hash" )
|
||||
#set ( nettle_arg "-V" )
|
||||
#execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev)
|
||||
#
|
||||
#string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov})
|
||||
#
|
||||
#message("NETTLE_VERSION = ${nv}")
|
||||
#
|
||||
## we need to remove decimal as floating point arithematic does not work properly with C preprocessor
|
||||
#STRING(REGEX REPLACE "[.]" "" nv ${nv})
|
||||
#
|
||||
#if ("${nv}" STREQUAL "")
|
||||
# message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" )
|
||||
#endif()
|
||||
#
|
||||
#set (NETTLE_VERSION "${nv}")
|
||||
#add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}")
|
||||
|
||||
include(FindPkgConfig)
|
||||
|
||||
INCLUDE(FindNettle)
|
||||
IF( NOT NETTLE_FOUND )
|
||||
MESSAGE( SEND_ERROR "Nettle is required" )
|
||||
ENDIF( NOT NETTLE_FOUND )
|
||||
pkg_search_module(NETTLE nettle)
|
||||
if(NOT ${NETTLE_FOUND})
|
||||
message( FATAL_ERROR "PACKAGE nettle not found: some targets will fail. Run build_oai -I again!")
|
||||
else()
|
||||
include_directories(${NETTLE_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
message ("NETTLE VERSION_INSTALLED = ${NETTLE_VERSION}")
|
||||
|
||||
string(REGEX REPLACE "([0-9]+).*" "\\1" NETTLE_VERSION_MAJOR ${NETTLE_VERSION})
|
||||
string(REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" NETTLE_VERSION_MINOR ${NETTLE_VERSION})
|
||||
message ("NETTLE_VERSION_MAJOR = ${NETTLE_VERSION_MAJOR}")
|
||||
message ("NETTLE_VERSION_MINOR = ${NETTLE_VERSION_MINOR}")
|
||||
|
||||
if ("${NETTLE_VERSION_MAJOR}" STREQUAL "" OR "${NETTLE_VERSION_MINOR}" STREQUAL "")
|
||||
message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" )
|
||||
endif()
|
||||
|
||||
add_definitions("-DNETTLE_VERSION_MAJOR=${NETTLE_VERSION_MAJOR}")
|
||||
add_definitions("-DNETTLE_VERSION_MINOR=${NETTLE_VERSION_MINOR}")
|
||||
|
||||
|
||||
pkg_search_module(OPENSSL openssl REQUIRED)
|
||||
@@ -215,8 +231,8 @@ set(api_user_HDR
|
||||
|
||||
add_library(api_user ${api_user_SRC} ${api_user_HDR})
|
||||
target_include_directories(api_user PRIVATE ${OPENAIR_NAS_DIR}/UE/API/USER
|
||||
${OPENAIR_NAS_DIR}/UE
|
||||
${OPENAIR_NAS_DIR}/COMMON
|
||||
${OPENAIR_NAS_DIR}/UE
|
||||
)
|
||||
|
||||
################################################################################
|
||||
@@ -397,6 +413,7 @@ target_include_directories(emm PRIVATE
|
||||
${OPENAIR_DIR}/common/utils/msc
|
||||
${OPENAIR_DIR}/common/utils
|
||||
${OPENAIR_DIR}/openair2/COMMON
|
||||
${OPENAIR_NAS_DIR}/UE
|
||||
${OPENAIR_NAS_DIR}/UE/API/USIM
|
||||
${OPENAIR_NAS_DIR}/UE/EMM
|
||||
${OPENAIR_NAS_DIR}/COMMON/EMM/MSG
|
||||
@@ -409,7 +426,6 @@ target_include_directories(emm PRIVATE
|
||||
# esm LIB
|
||||
################################################################################
|
||||
set(esm_SRC
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/esm_main.c
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/DedicatedEpsBearerContextActivation.c
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/DefaultEpsBearerContextActivation.c
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/EpsBearerContextDeactivation.c
|
||||
@@ -452,6 +468,7 @@ set(esm_SRC
|
||||
)
|
||||
|
||||
set(esm_HDR
|
||||
${OPENAIR_TARGETS}/COMMON/openairinterface5g_limits.h
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/esm_main.h
|
||||
${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h
|
||||
${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h
|
||||
@@ -481,13 +498,17 @@ set(esm_HDR
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_recv.h
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_sap.h
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_send.h
|
||||
${OPENAIR_DIR}/common/utils/utils.h
|
||||
)
|
||||
|
||||
add_library(esm ${esm_SRC} ${esm_HDR})
|
||||
|
||||
target_include_directories(esm PRIVATE
|
||||
${OPENAIR_DIR}/common/utils
|
||||
${OPENAIR_NAS_DIR}/UE
|
||||
${OPENAIR_NAS_DIR}/UE/API/USER
|
||||
${OPENAIR_NAS_DIR}/UE/ESM
|
||||
${OPENAIR_TARGETS}/COMMON
|
||||
${OPENAIR_NAS_DIR}/COMMON/ESM/MSG
|
||||
${OPENAIR_NAS_DIR}/UE/ESM/SAP
|
||||
${OPENAIR_NAS_DIR}/COMMON/IES
|
||||
@@ -670,6 +691,9 @@ target_include_directories(ies PRIVATE
|
||||
# EXECUTABLE at_nas_ue
|
||||
################################################################################
|
||||
include_directories(
|
||||
${OPENAIR_TARGETS}/COMMON
|
||||
${OPENAIR_NAS_DIR}/UE
|
||||
${OPENAIR_DIR}/common/utils
|
||||
${OPENAIR_DIR}/common/utils/msc
|
||||
${OPENAIR3_DIR}/COMMON
|
||||
${OPENAIR3_DIR}/SECU
|
||||
@@ -691,6 +715,8 @@ ADD_EXECUTABLE(at_nas_ue ${OPENAIR_NAS_DIR}/UE/UEprocess.c
|
||||
${OPENAIR_NAS_DIR}/UE/nas_parser.c
|
||||
${OPENAIR_NAS_DIR}/UE/nas_proc.c
|
||||
${OPENAIR_NAS_DIR}/UE/nas_user.c
|
||||
${OPENAIR_DIR}/common/utils/utils.c
|
||||
${OPENAIR_DIR}/common/utils/system.c
|
||||
)
|
||||
|
||||
target_link_libraries (at_nas_ue
|
||||
|
||||
@@ -101,6 +101,19 @@ Obj.# Case# Test# Description
|
||||
01 51 04 pdcchsim (TBD)
|
||||
01 51 05 pbchsim (TBD)
|
||||
01 51 06 mbmssim (TBD)
|
||||
01 51 10 dlsim_tm4 test cases (Test 1: 10 MHz, R2.FDD (MCS 5), EVA5, -1dB),
|
||||
(Test 5: 1.4 MHz, R4.FDD (MCS 4), EVA5, 0dB (70%)),
|
||||
(Test 6: 10 MHz, R3.FDD (MCS 15), EVA5, 6.7dB (70%)),
|
||||
(Test 6b: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (70%)),
|
||||
(Test 7: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (30%)),
|
||||
(Test 7b: 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)),
|
||||
(Test 10: 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)),
|
||||
(Test 10b: 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)),
|
||||
(Test 11: 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%))
|
||||
(TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)),
|
||||
(TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)),
|
||||
|
||||
|
||||
|
||||
|
||||
01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2)
|
||||
@@ -200,7 +213,7 @@ Obj.# Case# Test# Description
|
||||
01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX
|
||||
01 65 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX
|
||||
01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -209,7 +222,7 @@ Obj.# Case# Test# Description
|
||||
01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
|
||||
01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 70 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -218,7 +231,7 @@ Obj.# Case# Test# Description
|
||||
01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
|
||||
01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 75 lte-softmodem + RRU (NGFI IF4P5, RAW) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -226,7 +239,21 @@ Obj.# Case# Test# Description
|
||||
01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 76 lte-softmodem + RRU (NGFI IF4P5, UDP) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 76 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 76 06 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 76 07 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 76 08 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 76 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 76 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 76 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
|
||||
01 80 lte-softmodem + RRU (NGFI) tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -234,7 +261,7 @@ Obj.# Case# Test# Description
|
||||
01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 85 lte-softmodem + RRU (NGFI) tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
|
||||
01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
@@ -242,6 +269,32 @@ Obj.# Case# Test# Description
|
||||
01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
01 86 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Huawei e3276 COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2)
|
||||
01 86 00 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 01 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 02 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 03 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 04 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 05 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
01 86 06 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 07 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 08 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 09 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 10 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 11 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 12 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 13 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 14 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 15 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 16 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 17 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
|
||||
01 86 18 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 19 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 20 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 21 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 22 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
01 86 23 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
|
||||
02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for 1TX/1RX and 2TX/2RX (TM2)
|
||||
02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
|
||||
@@ -268,6 +321,15 @@ Obj.# Case# Test# Description
|
||||
02 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
02 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2)
|
||||
|
||||
02 57 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ OAI UE
|
||||
02 57 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
02 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
|
||||
|
||||
|
||||
01 64 lte-softmodem-noS1 tests
|
||||
|
||||
02 Functional test case
|
||||
|
||||
@@ -75,7 +75,7 @@ class openair(core):
|
||||
return (stdout, stderr)
|
||||
|
||||
def connect(self, username, password, prompt='PEXPECT_OAI'):
|
||||
max_retries=100
|
||||
max_retries=10
|
||||
i=0
|
||||
while i <= max_retries:
|
||||
self.prompt1 = prompt
|
||||
@@ -97,9 +97,9 @@ class openair(core):
|
||||
# need to look for twice the string of the prompt
|
||||
self.oai.prompt()
|
||||
self.oai.prompt()
|
||||
self.oai.sendline('uptime')
|
||||
self.oai.prompt()
|
||||
print self.oai.before
|
||||
# self.oai.sendline('uptime')
|
||||
# self.oai.prompt()
|
||||
# print self.oai.before
|
||||
break
|
||||
except Exception, e:
|
||||
error=''
|
||||
@@ -171,7 +171,7 @@ class openair(core):
|
||||
sys.exit(1)
|
||||
|
||||
def disconnect(self):
|
||||
print 'disconnecting the ssh connection to ' + self.address + '\n'
|
||||
# print 'disconnecting the ssh connection to ' + self.address + '\n'
|
||||
self.oai.send('exit')
|
||||
# self.cancel()
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
87
cmake_targets/autotests/templates/index.html
Normal file
87
cmake_targets/autotests/templates/index.html
Normal file
@@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OAI5G UE Autotest Report</title>
|
||||
<script type="text/javascript">
|
||||
function showhide(id) {
|
||||
var e = document.getElementById(id);
|
||||
e.style.display = (e.style.display == 'block') ? 'none' : 'block';
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<style>
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
padding: 5px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<center>
|
||||
<h2>OAI5G UE Autotest Report</h2>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
<table border>
|
||||
<caption>Test session configuration</caption>
|
||||
<tr><td>Start time</td><td>{{test_session_start_time}}</td></tr>
|
||||
<tr><td>Stop time</td><td>{{test_session_stop_time}}</td></tr>
|
||||
<tr><td>Duration</td><td>{{test_session_duration}}</td></tr>
|
||||
<tr><td>MTC host</td><td>{{mtc_host}}</td></tr>
|
||||
<tr><td>User</td><td>{{user}}</td></tr>
|
||||
<tr><td>Password</td><td>{{password}}</td></tr>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Test Setup</h3>
|
||||
To be complete
|
||||
|
||||
<br></br>
|
||||
<h3>UE phy-test performances tests results</h3>
|
||||
<h4>Objectives</h4>
|
||||
<p>Checks that OAI UE can achieve at least 75 percent of the theoretical throughput.</p>
|
||||
<p>Tests are done for all MCS (0 to 28) for 5MHz and 10MHz bandwidth.</p>
|
||||
<h4>Results</h4>
|
||||
|
||||
<table>
|
||||
<TR><TH>ID</TH><TH>TAG</TH><TH>VERDICT</TH><TH>NB RUNS</TH><TH>PASS</TH><TH>FAILED</TH><TH>INCON</TH><TH>SKIPPED</TH><TH>SEG FAULT</TH><TH>TC Timeout</TH><TH>Start</TH><TH>Stop</TH><TH>Duration</TH><TH>Details</TH></TR>
|
||||
{% for result in test_results|sort(attribute='testcase_name') %}
|
||||
<TR>
|
||||
<TD >{{result.testcase_name}}</TD>
|
||||
<TD align="right">{{result.tags}}</TD>
|
||||
{% if result.testcase_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{result.testcase_verdict}}</TD>
|
||||
{% elif result.testcase_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{result.testcase_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{result.testcase_verdict}}</TD>
|
||||
{% endif %}
|
||||
<TD align='center'>{{result.nruns}}</TD>
|
||||
<TD align='center'>{{result.nb_run_pass}}</TD>
|
||||
<TD align='center'>{{result.nb_run_failed}}</TD>
|
||||
<TD align='center'>{{result.nb_run_inc}}</TD>
|
||||
<TD align='center'>{{result.nb_run_skip}}</TD>
|
||||
<TD align='center'>{{result.nb_seg_fault}}</TD>
|
||||
<TD >{{result.testcase_timeout}}</TD>
|
||||
<TD >{{result.testcase_time_start.strftime('%Y-%m-%d %H:%M:%S')}}</TD>
|
||||
<TD >{{result.testcase_time_stop.strftime('%Y-%m-%d %H:%M:%S')}}</TD>
|
||||
<TD >{{result.testcase_duration}}</TD>
|
||||
<TD ><a href="{{ result.testcase_name }}/{{ result.testcase_name }}_report.html">{{ result.testcase_name }}_report.html</a></TD>
|
||||
</TR>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
|
||||
<br></br>
|
||||
<h3>UE phy-test stability tests results</h3>
|
||||
<h4>Objectives</h4>
|
||||
<p>To be complete</p>
|
||||
<h4>Results</h4>
|
||||
To be complete
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
142
cmake_targets/autotests/templates/testcase_report.html
Normal file
142
cmake_targets/autotests/templates/testcase_report.html
Normal file
@@ -0,0 +1,142 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>OAI5G UE test case report</title>
|
||||
<script type="text/javascript">
|
||||
function showhide(id) {
|
||||
var e = document.getElementById(id);
|
||||
e.style.display = (e.style.display == 'block') ? 'none' : 'block';
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<style>
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
padding: 5px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<center>
|
||||
<h2>OAI5G UE test case report details</h2>
|
||||
</center>
|
||||
|
||||
<h3>Test Case description</h3>
|
||||
<p>
|
||||
<table border>
|
||||
|
||||
<tr><td>ID</td><td>{{testcase_name}}</td></tr>
|
||||
<tr><td>TAG</td><td>{{tags}}</td></tr>
|
||||
<tr><td>class</td><td>{{testcaseclass}}</td></tr>
|
||||
<tr><td>description</td><td></td></tr>
|
||||
<tr><td>timeout</td><td>{{testcase_timeout}}</td></tr>
|
||||
<tr><td>number of runs</td><td>{{nruns}}</td></tr>
|
||||
<tr><td>eNB machine</td><td>{{testcase_eNBMachine}}</td></tr>
|
||||
<tr><td>UE machine</td><td>{{testcase_UEMachine}}</td></tr>
|
||||
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Test Case execution</h3>
|
||||
<p>
|
||||
<table border>
|
||||
|
||||
<tr><td>testcase_time_start</td><td>{{testcase_time_start}}</td></tr>
|
||||
<tr><td>testcase_time_stop</td><td>{{testcase_time_stop}}</td></tr>
|
||||
<tr><td>testcase_duration</td><td>{{testcase_duration}}</td></tr>
|
||||
<tr><td>Nb runs</td><td>{{nruns}}</td></tr>
|
||||
<tr><td>Nb PASS</td><td>{{nb_run_pass}}</td></tr>
|
||||
<tr><td>Nb FAILED</td><td>{{nb_run_failed}}</td></tr>
|
||||
<tr><td>Nb INCONCLUSIVE</td><td>{{nb_run_inc}}</td></tr>
|
||||
<tr>
|
||||
<td>testcase_verdict</td>
|
||||
{% if testcase_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{testcase_verdict}}</TD>
|
||||
{% elif testcase_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{testcase_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{testcase_verdict}}</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
<tr><td>Nb Seg Fault</td><td>{{nb_seg_fault}}</td></tr>
|
||||
|
||||
</table>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<h3>Test Case runs results</h3>
|
||||
|
||||
{% for run_results in runs_results|sort(attribute='run_id') %}
|
||||
<h4>RUN {{run_results.run_id}} </h4>
|
||||
<table border>
|
||||
<tr><td>run_start_time </td><td>{{run_results.run_start_time}}</td></tr>
|
||||
<tr><td>run_stop_time</td><td>{{run_results.run_stop_time}}</td></tr>
|
||||
<tr><td>run_duration</td><td>{{run_results.run_duration}}</td></tr>
|
||||
<tr>
|
||||
<td>run_verdict</td>
|
||||
{% if run_results.run_verdict == "PASS" %}
|
||||
<TD align="center" style="background-color:green">{{run_results.run_verdict}}</TD>
|
||||
{% elif run_results.run_verdict == "FAIL" %}
|
||||
<TD align="center" style="background-color:red">{{run_results.run_verdict}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">{{run_results.run_verdict}}</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
<tr><td>Seg Fault Satus</td>
|
||||
{% if run_results.ue_seg_fault_status == "NO_SEG_FAULT" %}
|
||||
<TD align="center" style="background-color:green">{{run_results.ue_seg_fault_status}}</TD>
|
||||
{% elif run_results.ue_seg_fault_status == "SEG_FAULT" %}
|
||||
<TD align="center" style="background-color:red">{{run_results.ue_seg_fault_status}}</TD>
|
||||
{% else %}
|
||||
<TD align="center" style="background-color:orange">unknown</TD>
|
||||
{% endif %}
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
{% for run_metrics in run_results.runs_metrics %}
|
||||
<br></br>
|
||||
<table border>
|
||||
<tr><td>metric_id</td><td>{{run_metrics.metric_id}}</td></tr>
|
||||
<tr><td>Description</td><td>{{run_metrics.metric_desc}}</td></tr>
|
||||
<tr><td>Unit of measure</td><td>{{run_metrics.metric_uom}}</td></tr>
|
||||
<tr><td>metric_min</td><td>{{run_metrics.metric_min}}</td></tr>
|
||||
<tr><td>metric_max</td><td>{{run_metrics.metric_max}}</td></tr>
|
||||
<tr><td>metric_mean</td><td>{{run_metrics.metric_mean}}</td></tr>
|
||||
<tr><td>metric_median</td><td>{{run_metrics.metric_median}}</td></tr>
|
||||
<tr><td colspan="2"></td></tr>
|
||||
{% if run_metrics.pass_fail_stat is defined %}
|
||||
<tr><td>Pass/fail stat</td><td>{{run_metrics.pass_fail_stat}}</td></tr>
|
||||
{% endif %}
|
||||
{% if run_metrics.pass_fail_min_limit is defined %}
|
||||
<tr><td>Pass/fail min limit</td><td>{{run_metrics.pass_fail_min_limit}}</td></tr>
|
||||
{% endif %}
|
||||
{% if run_metrics.pass_fail_max_limit is defined %}
|
||||
<tr><td>Pass/fail max limit</td><td>{{run_metrics.pass_fail_max_limit}}</td></tr>
|
||||
{% endif %}
|
||||
<tr><td colspan="2"></td></tr>
|
||||
<tr><td>metric_fig</td><td><IMG src={{run_metrics.metric_fig}}></td></tr>
|
||||
</table>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% if run_results.run_traffic.traffic_count != 0 %}
|
||||
<br></br>
|
||||
<table border>
|
||||
<TR><TH>Iperf metric</TH><TH>min</TH><TH>max</TH><TH>mean</TH><TH>median</TH><TR>
|
||||
<TR><td>Bandwidth </td><td>{{run_results.run_traffic.bw_min}}</td><td>{{run_results.run_traffic.bw_max}}</td><td>{{run_results.run_traffic.bw_mean}}</td><td>{{run_results.run_traffic.bw_median}}</td><TR>
|
||||
<TR><td>Jitter</td><td>{{run_results.run_traffic.jitter_min}}</td><td>{{run_results.run_traffic.jitter_max}}</td><td>{{run_results.run_traffic.jitter_mean}}</td><td>{{run_results.run_traffic.jitter_median}}</td><TR>
|
||||
<TR><td>Loss rate</td><td>{{run_results.run_traffic.rl_min}}</td><td>{{run_results.run_traffic.rl_max}}</td><td>{{run_results.run_traffic.rl_mean}}</td><td>{{run_results.run_traffic.rl_median}}</td><TR>
|
||||
<TR><td colspan="5"></td></TR>
|
||||
<TR><td>Iperf duration</td><td>{{run_results.run_traffic.iperf_duration}}</td><td></td><td>Pass/Fail criteria (min duration)</td><td>{{run_results.run_traffic.dur_pass_fail_crit}}</td><TR>
|
||||
<TR><td colspan="5"></td></TR>
|
||||
<tr><td>traffic_fig</td><td colspan="4"><IMG src={{run_results.run_traffic.traffic_fig}}></td></tr>
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
3524
cmake_targets/autotests/testsuite_ue_noS1.xml
Normal file
3524
cmake_targets/autotests/testsuite_ue_noS1.xml
Normal file
File diff suppressed because it is too large
Load Diff
3812
cmake_targets/autotests/testsuite_ue_noS1_TCL.xml
Normal file
3812
cmake_targets/autotests/testsuite_ue_noS1_TCL.xml
Normal file
File diff suppressed because it is too large
Load Diff
174
cmake_targets/autotests/tools/autotest_analyser.py
Executable file
174
cmake_targets/autotests/tools/autotest_analyser.py
Executable file
@@ -0,0 +1,174 @@
|
||||
#! /usr/bin/python
|
||||
#******************************************************************************
|
||||
#
|
||||
# \file autotest_analyser.py
|
||||
#
|
||||
# \par Informations
|
||||
# - \b Project : UED Autotest Framework
|
||||
# - \b Software :
|
||||
#
|
||||
# \date 16 september 2016
|
||||
#
|
||||
# \version 0.1
|
||||
#
|
||||
# \brief helper to test lib_autotest_analyser.py
|
||||
#
|
||||
# \author Benoit ROBERT (benoit.robert@syrtem.com)
|
||||
#
|
||||
# \par Statement of Ownership
|
||||
# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L
|
||||
# This software is furnished under license and may be used and copied
|
||||
# only in accordance with the terms of such license and with the inclusion
|
||||
# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof
|
||||
# may not be provided or otherwise made available to any other person.
|
||||
# No title to and ownership of the SOFTWARE is hereby transferred.
|
||||
#
|
||||
# The information in this SOFTWARE is subject to change without notice
|
||||
# and should not be constructed as a commitment by SYRTEM.
|
||||
# SYRTEM assumes no responsibility for the use or reliability of its
|
||||
# SOFTWARE on equipment or platform not explicitly validated by SYRTEM.
|
||||
#
|
||||
# *******************************************************************************
|
||||
|
||||
import os
|
||||
import getopt
|
||||
import sys
|
||||
from subprocess import call
|
||||
|
||||
import encoder
|
||||
|
||||
sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
|
||||
|
||||
|
||||
#test_cases = ('030001', '030901', '031001', '031601', '031701', '031801', '031901', '032001', '032101', '032201', '032301', '032501', '032601', '032801')
|
||||
test_cases = ('032800' , '032730' )
|
||||
|
||||
nb_run = 2
|
||||
|
||||
def error_opt(msg):
|
||||
print("Option error: " + msg)
|
||||
|
||||
|
||||
def main(args):
|
||||
try:
|
||||
analyser = __import__("lib_autotest_analyser")
|
||||
except ImportError as err:
|
||||
print('Import error: ' + str(err))
|
||||
exit(0)
|
||||
|
||||
|
||||
log_path = 'log_save_2016-08-14/log/'
|
||||
|
||||
|
||||
|
||||
# metric = {}
|
||||
# metric['id'] = 'UE_DLSCH_BITRATE'
|
||||
# metric['description'] = 'UE downlink physical throughput'
|
||||
# metric['regex'] = '(UE_DLSCH_BITRATE) =\s+(\d+\.\d+) kbps.+frame = (\d+)\)'
|
||||
# metric['unit_of_meas'] = 'kbps'
|
||||
# metric['min_limit'] = 14668.8
|
||||
|
||||
|
||||
#AUTOTEST Metric : RRC Measurments RSRP[0]=-97.60 dBm/RE, RSSI=-72.83 dBm, RSRQ[0] 9.03 dB, N0 -125 dBm/RE, NF 7.2 dB (frame = 4490)
|
||||
|
||||
metric = {}
|
||||
metric['id'] = 'UE_DL_RRC_MEAS'
|
||||
metric['description'] = 'UE downlink RRC Measurments'
|
||||
metric['nb_metric'] = 5
|
||||
# metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+),\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+),,\s+(N0)=(-?\d+\.?\d*)\s+(.+),,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\) '
|
||||
metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(RSSI)=(-?\d+\.?\d*)\s+(.+)\,\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(N0)=(-?\d+\.?\d*)\s+(.+)\,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\)'
|
||||
metric['unit_of_meas'] = 'kbps'
|
||||
metric['min_limit'] = 14668.8
|
||||
|
||||
|
||||
|
||||
#report_path = log_path+'/report/'
|
||||
|
||||
#os.system(' mkdir -p ' + report_path)
|
||||
|
||||
#analyser.create_report_html(report_path)
|
||||
|
||||
#return(0)
|
||||
|
||||
test_results = []
|
||||
|
||||
for test_case in test_cases:
|
||||
|
||||
for i in range(0, nb_run):
|
||||
fname = '..//log//'+test_case+'/run_'+str(i)+'/UE_exec_'+str(i)+'_.log'
|
||||
args = {'metric' : metric,
|
||||
'file' : fname }
|
||||
|
||||
# cell_synch_status = analyser.check_cell_synchro(fname)
|
||||
# if cell_synch_status == 'CELL_SYNCH':
|
||||
# print '!!!!!!!!!!!!!! Cell synchronized !!!!!!!!!!!'
|
||||
# metric_checks_flag = 0
|
||||
# else :
|
||||
# print '!!!!!!!!!!!!!! Cell NOT NOT synchronized !!!!!!!!!!!'
|
||||
|
||||
# metrics_extracted = analyser.do_extract_metrics_new(args)
|
||||
|
||||
|
||||
# de-xmlfy test report
|
||||
xml_file = '..//log//'+test_case+'/test.'+test_case+'_ng.xml'
|
||||
print xml_file
|
||||
|
||||
# test_result =
|
||||
|
||||
|
||||
# test_results.append(test_result)
|
||||
|
||||
# xmlFile = logdir_local_testcase + '/test.' + testcasename + '.xml'
|
||||
# xml="\n<testcase classname=\'"+ testcaseclass + "\' name=\'" + testcasename + "."+tags + "\' Run_result=\'" + test_result_string + "\' time=\'" + str(duration) + " s \' RESULT=\'" + testcase_verdict + "\'></testcase> \n"
|
||||
# write_file(xmlFile, xml, mode="w")
|
||||
|
||||
# xmlFile_ng = logdir_local_testcase + '/test.' + testcasename + '_ng.xml'
|
||||
# xml_ng = xmlify(test_result, wrap=testcasename, indent=" ")
|
||||
# write_file(xmlFile_ng, xml_ng, mode="w")
|
||||
|
||||
|
||||
|
||||
|
||||
# print "min = "+ str( metric_extracted['metric_min'] )
|
||||
# print "min_index = "+ str( metric_extracted['metric_min_index'] )
|
||||
# print "max = "+ str( metric_extracted['metric_max'] )
|
||||
# print "max_index = "+ str( metric_extracted['metric_max_index'] )
|
||||
# print "mean = "+ str( metric_extracted['metric_mean'] )
|
||||
# print "median = "+ str( metric_extracted['metric_median'] )
|
||||
|
||||
# verdict = analyser.do_check_verdict(metric, metric_extracted)
|
||||
# print verdict
|
||||
|
||||
# fname= 'report/2016-9-8_toto/'+test_case+'/UE_metric_UE_DLSCH_BITRATE_'+str(i)+'_.png'
|
||||
# fname= 'report/UE_metric_UE_DLSCH_BITRATE_'+test_case+'_'+str(i)+'.png'
|
||||
|
||||
# print fname
|
||||
# analyser.do_img_metrics(metric, metric_extracted, fname)
|
||||
|
||||
# fname = 'log//'+test_case+'/run_'+str(i)+'/UE_traffic_'+str(i)+'_.log'
|
||||
|
||||
# args = {'file' : fname }
|
||||
|
||||
# traffic_metrics = analyser.do_extract_traffic_metrics(args)
|
||||
|
||||
# fname= 'report/iperf_'+test_case+'_'+str(i)+'.png'
|
||||
|
||||
# print fname
|
||||
# analyser.do_img_traffic(traffic_metrics, fname)
|
||||
|
||||
|
||||
for test_result in test_results:
|
||||
cmd = 'mkdir -p ' + report_dir + '/'+ test_result['testcase_name']
|
||||
result = os.system(cmd)
|
||||
|
||||
report_file = report_dir + '/'+ test_result['testcase_name'] + '/'+ test_result['testcase_name']+ '_report.html'
|
||||
|
||||
analyser.create_test_report_detailed_html(test_result, report_file )
|
||||
|
||||
print test_result
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
|
||||
544
cmake_targets/autotests/tools/lib_autotest_analyser.py
Normal file
544
cmake_targets/autotests/tools/lib_autotest_analyser.py
Normal file
@@ -0,0 +1,544 @@
|
||||
#******************************************************************************
|
||||
#
|
||||
# \file lib_autotest_analyser.py
|
||||
#
|
||||
# \par Informations
|
||||
# - \b Project : UED Autotest Framework
|
||||
# - \b Software :
|
||||
#
|
||||
# \date 16 september 2016
|
||||
#
|
||||
# \version 0.1
|
||||
#
|
||||
# \brief library to extract metrics from autotest logs and assign a verdict
|
||||
#
|
||||
# \author Benoit ROBERT (benoit.robert@syrtem.com)
|
||||
#
|
||||
# \par Statement of Ownership
|
||||
# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L
|
||||
# This software is furnished under license and may be used and copied
|
||||
# only in accordance with the terms of such license and with the inclusion
|
||||
# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof
|
||||
# may not be provided or otherwise made available to any other person.
|
||||
# No title to and ownership of the SOFTWARE is hereby transferred.
|
||||
#
|
||||
# The information in this SOFTWARE is subject to change without notice
|
||||
# and should not be constructed as a commitment by SYRTEM.
|
||||
# SYRTEM assumes no responsibility for the use or reliability of its
|
||||
# SOFTWARE on equipment or platform not explicitly validated by SYRTEM.
|
||||
#
|
||||
# *******************************************************************************
|
||||
|
||||
|
||||
import re
|
||||
from pylab import *
|
||||
from matplotlib.font_manager import FontProperties
|
||||
|
||||
import os
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
|
||||
PATH = os.path.dirname(os.path.abspath(__file__))
|
||||
TEMPLATE_ENVIRONMENT = Environment(
|
||||
autoescape=False,
|
||||
loader=FileSystemLoader(os.path.join(PATH, '../templates')),
|
||||
trim_blocks=False)
|
||||
|
||||
|
||||
def render_template(template_filename, context):
|
||||
return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context)
|
||||
|
||||
|
||||
|
||||
def init(args = None):
|
||||
return
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
def do_extract_metrics(args):
|
||||
|
||||
# print ""
|
||||
# print "do_extract_metrics ... "
|
||||
|
||||
fname = args['file']
|
||||
metric = args['metric']
|
||||
# print(fname)
|
||||
# print 'metric id = ' + metric['id']
|
||||
# print 'metric regex = ' + metric['regex']
|
||||
|
||||
count = 0
|
||||
mmin = 0
|
||||
mmin_index = 0
|
||||
mmax = 0
|
||||
mmax_index = 0
|
||||
mean = 0
|
||||
median = 0
|
||||
|
||||
|
||||
output = np.fromregex(fname,metric['regex'], [('id', 'S20'), ('metric', np.float), ('frame', np.int)] )
|
||||
# print 'T0T0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
|
||||
# print output
|
||||
count = output['metric'].size
|
||||
# print count
|
||||
if count > 0:
|
||||
mmin = np.amin(output['metric']);
|
||||
mmin_index = np.argmin(output['metric']);
|
||||
mmax = np.amax(output['metric']);
|
||||
mmax_index = np.argmax(output['metric']);
|
||||
mean = np.mean(output['metric']);
|
||||
median = np.median(output['metric']);
|
||||
|
||||
# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 )
|
||||
|
||||
ret = { 'metric_count' : count,
|
||||
'metric_buf' : output,
|
||||
'metric_min' : mmin,
|
||||
'metric_min_index' : mmin_index,
|
||||
'metric_max' : mmax,
|
||||
'metric_max_index' : mmax_index,
|
||||
'metric_mean' : mean,
|
||||
'metric_median' : median,
|
||||
}
|
||||
return(ret)
|
||||
|
||||
|
||||
def do_extract_metrics_new(args):
|
||||
|
||||
# print ""
|
||||
# print "do_extract_metrics ... "
|
||||
|
||||
fname = args['file']
|
||||
metric = args['metric']
|
||||
print(fname)
|
||||
print 'metric id = ' + metric['id']
|
||||
print 'metric regex = ' + metric['regex']
|
||||
|
||||
|
||||
|
||||
count = 0
|
||||
mmin = 0
|
||||
mmin_index = 0
|
||||
mmax = 0
|
||||
mmax_index = 0
|
||||
mean = 0
|
||||
median = 0
|
||||
|
||||
toto = [('id', 'S20'), ('metric', np.float), ('frame', np.int)]
|
||||
print toto
|
||||
|
||||
|
||||
np_format = []
|
||||
|
||||
for x in range(0, metric['nb_metric']):
|
||||
np_format.append( ('id'+str(x), 'S20') )
|
||||
np_format.append( ('metric'+str(x), np.float) )
|
||||
np_format.append( ('uom'+str(x), 'S20') )
|
||||
np_format.append( ('frame', np.int))
|
||||
|
||||
print np_format
|
||||
|
||||
output = np.fromregex(fname,metric['regex'], np_format)
|
||||
print output
|
||||
count = output['frame'].size
|
||||
print count
|
||||
if count > 0:
|
||||
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
fig = plt.figure(1)
|
||||
plt.figure(figsize=(10,10))
|
||||
|
||||
plot_xmax = np.amax(output['frame'])+np.amin(output['frame'])
|
||||
|
||||
for x in range(0, metric['nb_metric']):
|
||||
|
||||
metric_name = output['id'+str(x)][0]
|
||||
metric_uom = output['uom'+str(x)][0]
|
||||
|
||||
mmin = np.amin(output['metric'+str(x)])
|
||||
mmax = np.amax(output['metric'+str(x)])
|
||||
mmean = np.mean(output['metric'+str(x)])
|
||||
mmedian = np.median(output['metric'+str(x)])
|
||||
|
||||
plot_loc = 100*metric['nb_metric']+10+x+1
|
||||
|
||||
sbplt = plt.subplot(plot_loc)
|
||||
sbplt.plot(output['frame'], output['metric'+str(x)], color='b' )
|
||||
sbplt.set_title( metric_name+' ('+metric_uom+')')
|
||||
if mmin < 0:
|
||||
sbplot_ymin=mmin+mmin/10
|
||||
else:
|
||||
sbplot_ymin=0
|
||||
sbplt.set_ylim(ymin=sbplot_ymin)
|
||||
if mmax > 0:
|
||||
sbplot_ymax=mmax+mmax/10
|
||||
else:
|
||||
sbplot_ymax=0
|
||||
sbplt.set_ylim(ymax=sbplot_ymax)
|
||||
|
||||
sbplt.set_xlim(xmax=plot_xmax)
|
||||
sbplt.set_xlim(xmin=0)
|
||||
text='min: '+str(mmin)+'\nmax: '+str(mmax)+'\nmean: '+str(mmean)+'\nmedian: '+str(mmedian)
|
||||
sbplt.text( plot_xmax+10,sbplot_ymin,text)
|
||||
sbplt.set_xlabel('frame')
|
||||
sbplt.set_ylabel(metric_name)
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
fname = "toto.png"
|
||||
|
||||
# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
mmin = np.amin(output['metric']);
|
||||
mmin_index = np.argmin(output['metric']);
|
||||
mmax = np.amax(output['metric']);
|
||||
mmax_index = np.argmax(output['metric']);
|
||||
mean = np.mean(output['metric']);
|
||||
median = np.median(output['metric']);
|
||||
|
||||
# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 )
|
||||
|
||||
ret = { 'metric_count' : count,
|
||||
'metric_buf' : output,
|
||||
|
||||
|
||||
'metric_min' : mmin,
|
||||
'metric_min_index' : mmin_index,
|
||||
'metric_max' : mmax,
|
||||
'metric_max_index' : mmax_index,
|
||||
'metric_mean' : mean,
|
||||
'metric_median' : median,
|
||||
}
|
||||
return(ret)
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
def do_check_verdict(metric_def, metric_data):
|
||||
verdict = 'INCON'
|
||||
|
||||
pass_fail_stat = metric_def['pass_fail_stat']
|
||||
|
||||
if pass_fail_stat == 'max_value':
|
||||
metric_stat = metric_data['metric_max']
|
||||
elif pass_fail_stat == 'min_value':
|
||||
metric_stat = metric_data['metric_min']
|
||||
elif pass_fail_stat == 'mean_value':
|
||||
metric_stat = metric_data['metric_mean']
|
||||
elif pass_fail_stat == 'median_value':
|
||||
metric_stat = metric_data['metric_median']
|
||||
else :
|
||||
print "do_check_verdict -> undef metric stat (pass_fail_stat in xml file)"
|
||||
return verdict
|
||||
|
||||
if 'max_limit' in metric_def:
|
||||
if metric_stat > metric_def['max_limit']:
|
||||
verdict = 'FAIL'
|
||||
else:
|
||||
verdict = 'PASS'
|
||||
|
||||
if 'min_limit' in metric_def:
|
||||
if metric_stat < metric_def['min_limit']:
|
||||
verdict = 'FAIL'
|
||||
else:
|
||||
verdict = 'PASS'
|
||||
return verdict
|
||||
|
||||
|
||||
def do_print_metrics(metric_def, metric_data):
|
||||
|
||||
|
||||
if metric_data['metric_count'] > 0 :
|
||||
|
||||
# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)])
|
||||
output = metric_data['metric_buf']
|
||||
# print output
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 )
|
||||
plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2) # Red straight line
|
||||
|
||||
plt.title('Physical throughput ')
|
||||
plt.xlabel('frame')
|
||||
plt.ylabel(metric_def['id'])
|
||||
plt.legend(prop=fontP)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.show()
|
||||
|
||||
def do_img_metrics(metric_def, metric_data, fname):
|
||||
|
||||
|
||||
if metric_data['metric_count'] > 0 :
|
||||
|
||||
# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)])
|
||||
output = metric_data['metric_buf']
|
||||
# print 'TITI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
|
||||
# print output
|
||||
|
||||
# print metric_def['min_limit']
|
||||
# print metric_data['metric_count']
|
||||
# print output['frame'][metric_data['metric_count']-1]
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
plt.figure()
|
||||
|
||||
# print output['frame'].size
|
||||
# print output['metric'].size
|
||||
|
||||
plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 , label=metric_def['id'])
|
||||
|
||||
if 'min_limit' in metric_def:
|
||||
plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2, label='min limit') # Red straight line
|
||||
|
||||
plt.title(metric_def['id'] +' ('+metric_def['unit_of_meas']+')')
|
||||
plt.xlabel('frame')
|
||||
plt.ylabel(metric_def['id'])
|
||||
|
||||
# Set graphic minimum Y axis
|
||||
# -------------------------
|
||||
if metric_data['metric_min'] < 0:
|
||||
plt.ylim(ymin=metric_data['metric_min']+metric_data['metric_min']/10)
|
||||
else :
|
||||
plt.ylim(ymin=0)
|
||||
|
||||
y_axis_max = 0
|
||||
if 'min_limit' in metric_def:
|
||||
if metric_data['metric_max'] > metric_def['min_limit']:
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
else:
|
||||
y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10
|
||||
else:
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
|
||||
|
||||
plt.ylim(ymax=y_axis_max)
|
||||
|
||||
lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_extra_artists=(lgd,), bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
# with open(fname, 'r') as f:
|
||||
# for line in f:
|
||||
# m = re.search(metric['regex'], line)
|
||||
# if m :
|
||||
# print m.group(1) + " -> "+m.group(2)
|
||||
|
||||
|
||||
|
||||
|
||||
def do_extract_traffic_metrics(args):
|
||||
|
||||
fname = args['file']
|
||||
|
||||
# print(fname)
|
||||
# print 'metric id = ' + metric['id']
|
||||
|
||||
#[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
|
||||
#[ 3] 0.0- 1.0 sec 238 KBytes 1.95 Mbits/sec 0.980 ms 2/ 174 (1.1%)
|
||||
# [ 3] 0.0- 1.0 sec 63.2 KBytes 517 Kbits/sec 0.146 ms 1/ 45 (2.2%)
|
||||
|
||||
# iperf_regex = '[\s*(\d+)]\s+\d+\.\d+-\s*(\d+\.\d+)\s+sec\s+(\d+).+(\d+\.\d+).+(\d+\.\d+).+(\d+)\/\s*(\d+)\s+\((\d+\.\d+)\%\)'
|
||||
# ID 0.0 1.0 63.2 KByte 517 Kbits/s 0.146
|
||||
iperf_regex = '\[\s*(\d+)\]\s+(\d+\.*\d*)-\s*(\d+\.*\d*)\s+sec\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+ms\s+(\d+)\/\s*(\d+)\s+\((\d+\.*\d*)\%\)'
|
||||
# print 'iperf regex = ' + iperf_regex
|
||||
|
||||
count = 0
|
||||
bw_min = 0
|
||||
bw_max = 0
|
||||
bw_mean = 0
|
||||
bw_median = 0
|
||||
jitter_min = 0
|
||||
jitter_max = 0
|
||||
jitter_mean = 0
|
||||
jitter_median = 0
|
||||
|
||||
rl_min = 0
|
||||
rl_max = 0
|
||||
rl_mean = 0
|
||||
rl_median = 0
|
||||
|
||||
interval_stop_max = 0
|
||||
|
||||
output = np.fromregex(fname,iperf_regex, [('id', np.int) , ('interval_start', np.float), ('interval_stop', np.float), ('transfer', np.float), ('transfer_uom', 'S20') ,('bandwidth', np.float), ('bandwidth_uom', 'S20') ,('jitter', np.float), ('lost', np.int) , ('total', np.int), ('rate_lost', np.float) ] )
|
||||
|
||||
count = output['id'].size -1
|
||||
# remove last line that is an iperf result resume
|
||||
|
||||
if count > 0:
|
||||
|
||||
output= np.delete(output, (count), axis=0 )
|
||||
# print output
|
||||
|
||||
bw_min = np.amin(output['bandwidth']);
|
||||
bw_max = np.amax(output['bandwidth']);
|
||||
bw_mean = np.mean(output['bandwidth']);
|
||||
bw_median = np.median(output['bandwidth']);
|
||||
|
||||
jitter_min = np.amin(output['jitter']);
|
||||
jitter_max = np.amax(output['jitter']);
|
||||
jitter_mean = np.mean(output['jitter']);
|
||||
jitter_median = np.median(output['jitter']);
|
||||
|
||||
rl_min = np.amin(output['rate_lost']);
|
||||
rl_max = np.amax(output['rate_lost']);
|
||||
rl_mean = np.mean(output['rate_lost']);
|
||||
rl_median = np.median(output['rate_lost']);
|
||||
|
||||
interval_stop_max = np.amax(output['interval_stop']);
|
||||
|
||||
else :
|
||||
count = 0
|
||||
|
||||
|
||||
ret = { 'traffic_count' : count,
|
||||
'traffic_buf' : output,
|
||||
'bw_min' : bw_min,
|
||||
'bw_max' : bw_max,
|
||||
'bw_mean' : bw_mean,
|
||||
'bw_median' : bw_median,
|
||||
'jitter_min' : jitter_min,
|
||||
'jitter_max' : jitter_max,
|
||||
'jitter_mean' : jitter_mean,
|
||||
'jitter_median' : jitter_median,
|
||||
'rl_min' : rl_min,
|
||||
'rl_max' : rl_max,
|
||||
'rl_mean' : rl_mean,
|
||||
'rl_median' : rl_median,
|
||||
'interval_stop_max' : interval_stop_max
|
||||
}
|
||||
return(ret)
|
||||
|
||||
|
||||
|
||||
|
||||
def do_img_traffic(traffic_data, fname):
|
||||
|
||||
|
||||
if traffic_data['traffic_count'] > 0 :
|
||||
|
||||
output = traffic_data['traffic_buf']
|
||||
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
|
||||
fig = plt.figure(1)
|
||||
|
||||
ax1= plt.subplot(311)
|
||||
plt.plot(output['interval_stop'], output['bandwidth'], color='b' )
|
||||
ax1.set_title('Bandwidth (Mbits/s)')
|
||||
ax1.set_ylim(ymin=-1)
|
||||
ax1.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
text='min: '+str(traffic_data['bw_min'])+'\nmax: '+str(traffic_data['bw_max'])+'\nmean: '+str(traffic_data['bw_mean'])+'\nmedian: '+str(traffic_data['bw_median'])
|
||||
ax1.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax1.set_xlabel('time (s)')
|
||||
ax1.set_ylabel(' ')
|
||||
|
||||
ax2=plt.subplot(312)
|
||||
plt.plot(output['interval_stop'], output['jitter'], color='b' )
|
||||
ax2.set_title('Jitter (ms)')
|
||||
ax2.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
ax2.set_ylim(ymin=-1)
|
||||
text='min: '+str(traffic_data['jitter_min'])+'\nmax: '+str(traffic_data['jitter_max'])+'\nmean: '+str(traffic_data['jitter_mean'])+'\nmedian: '+str(traffic_data['jitter_median'])
|
||||
ax2.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax2.set_xlabel('time (s)')
|
||||
ax2.set_ylabel(' ')
|
||||
|
||||
ax3=plt.subplot(313)
|
||||
plt.plot(output['interval_stop'], output['rate_lost'], color='b')
|
||||
ax3.set_title('Loss rate %')
|
||||
ax3.set_xlim(xmax=np.amax(output['interval_stop']))
|
||||
ax3.set_ylim(ymin=-1)
|
||||
text='min: '+str(traffic_data['rl_min'])+'\nmax: '+str(traffic_data['rl_max'])+'\nmean: '+str(traffic_data['rl_mean'])+'\nmedian: '+str(traffic_data['rl_median'])
|
||||
ax3.text( np.amax(output['interval_stop'])+10,0,text)
|
||||
ax3.set_xlabel('time (s)')
|
||||
ax3.set_ylabel(' ')
|
||||
|
||||
# plt.title('Physical throughput ('+metric_def['unit_of_meas']+')')
|
||||
# plt.xlabel('time (s)')
|
||||
# plt.ylabel(metric_def['id'])
|
||||
|
||||
# Set graphic minimum Y axis
|
||||
# -------------------------
|
||||
# if traffic_data['bw_min'] == 0 :
|
||||
# plt.ylim(ymin=-metric_def['min_limit']/10)
|
||||
# else :
|
||||
# plt.ylim(ymin=0)
|
||||
|
||||
# y_axis_max = 0
|
||||
# if traffic_data['metric_max'] > metric_def['min_limit']:
|
||||
# y_axis_max =traffic_data['metric_max']+traffic_data['metric_max']/10
|
||||
# else:
|
||||
# y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10
|
||||
#
|
||||
# plt.ylim(ymax=y_axis_max)
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
mng = plt.get_current_fig_manager()
|
||||
plt.savefig(fname, bbox_inches='tight')
|
||||
plt.close()
|
||||
|
||||
|
||||
|
||||
|
||||
def create_report_html(context):
|
||||
fname = context['report_path']+"/index.html"
|
||||
|
||||
#
|
||||
with open(fname, 'w') as f:
|
||||
html = render_template('index.html', context)
|
||||
f.write(html)
|
||||
|
||||
|
||||
def create_test_report_detailed_html(context, fname ):
|
||||
with open(fname, 'w') as f:
|
||||
html = render_template('testcase_report.html', context)
|
||||
f.write(html)
|
||||
|
||||
|
||||
def check_cell_synchro(fname):
|
||||
|
||||
with open(fname, 'r') as f:
|
||||
for line in f:
|
||||
|
||||
m = re.search('AUTOTEST Cell Sync \:', line)
|
||||
if m :
|
||||
#print line
|
||||
return 'CELL_SYNCH'
|
||||
|
||||
return 'CELL_NOT_SYNCH'
|
||||
|
||||
|
||||
def check_exec_seg_fault(fname):
|
||||
|
||||
with open(fname, 'r') as f:
|
||||
for line in f:
|
||||
m = re.search('Segmentation fault', line)
|
||||
if m :
|
||||
#print line
|
||||
return 'SEG_FAULT'
|
||||
|
||||
return 'NO_SEG_FAULT'
|
||||
|
||||
2
cmake_targets/autotests/v2/actions/alu_epc.bash
Normal file
2
cmake_targets/autotests/v2/actions/alu_epc.bash
Normal file
@@ -0,0 +1,2 @@
|
||||
sudo /opt/ltebox/tools/stop_ltebox || true
|
||||
sudo /opt/ltebox/tools/start_ltebox
|
||||
1
cmake_targets/autotests/v2/actions/alu_epc_stop.bash
Normal file
1
cmake_targets/autotests/v2/actions/alu_epc_stop.bash
Normal file
@@ -0,0 +1 @@
|
||||
sudo /opt/ltebox/tools/stop_ltebox
|
||||
5
cmake_targets/autotests/v2/actions/alu_hss.bash
Normal file
5
cmake_targets/autotests/v2/actions/alu_hss.bash
Normal file
@@ -0,0 +1,5 @@
|
||||
sudo rmmod nasmesh || true
|
||||
sudo rmmod ue_ip || true
|
||||
sudo /opt/ltebox/tools/stop_ltebox || true
|
||||
sudo killall -9 hss_sim || true
|
||||
sudo /opt/hss_sim0609/starthss_real
|
||||
136
cmake_targets/autotests/v2/actions/bandrich.txt
Normal file
136
cmake_targets/autotests/v2/actions/bandrich.txt
Normal file
@@ -0,0 +1,136 @@
|
||||
The configuration for the bandrich in the test setup is a bit hackish.
|
||||
|
||||
Here come some notes explaining what we do here.
|
||||
|
||||
To get /dev/bandrich.data and /dev/bandrich.control (so that you don't need
|
||||
to look for which /dev/ttyUSBx are used by your dongle, and always use
|
||||
the same files, no matter what), add a udev file:
|
||||
|
||||
/etc/udev/rules.d/bandrich.rules
|
||||
|
||||
containing lines:
|
||||
|
||||
SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="1a8d", ENV{ID_MODEL_ID}=="100d", ENV{ID_SERIAL_SHORT}=="357473040068155", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="bandrich.data", MODE="0666"
|
||||
SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="1a8d", ENV{ID_MODEL_ID}=="100d", ENV{ID_SERIAL_SHORT}=="357473040068155", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="bandrich.control", MODE="0666"
|
||||
|
||||
Change vendor_id/model_id/serial/interface num to match yours.
|
||||
Use lsusb -v to find values.
|
||||
|
||||
At first we used /dev/ttyUSB2 linked to /dev/bandrich for both data (in
|
||||
the wvdial configuration file) and control (in the python code, opening
|
||||
/dev/bandrich the standard unix way and read and write into it, with no
|
||||
special libusb commands).
|
||||
|
||||
But it turned out that using /dev/ttyUSB2 for data gives bad throughput
|
||||
results. We tested downlink UDP at 15Mb/s but the maximum throughput for
|
||||
a 5MHz cell was around 13, and we had a lot of packets lost at the iperf's
|
||||
UDP level. Radio was looking fine (all packets acked correctly), so it was
|
||||
not a radio problem. The dongle in a windows machine was working fine,
|
||||
15Mbs/s. Using the wvdial configuration file from test setup v1 gave also
|
||||
good results. The only difference was the use of /dev/ttyUSB0 instead of
|
||||
/dev/ttyUSB2. Using /dev/ttyUSB0 solved the throughput issue.
|
||||
|
||||
But using /dev/ttyUSB0 for control in the pyton code did not work. The
|
||||
output was incorrect.
|
||||
|
||||
So we decided to have /dev/bandrich.data linked to /dev/ttyUSB0 for data
|
||||
(wvdial) and /dev/bandrich.control linked to /dev/ttyUSB2 for control
|
||||
(in python code).
|
||||
|
||||
It may not be the correct way to go, but it seems to do the trick so far.
|
||||
|
||||
Your device may need some other solution.
|
||||
|
||||
Here, we get, as result of lsusb -v:
|
||||
|
||||
[SNIP]
|
||||
Bus 003 Device 009: ID 1a8d:100d BandRich, Inc. 4G LTE adapter
|
||||
Device Descriptor:
|
||||
bLength 18
|
||||
bDescriptorType 1
|
||||
bcdUSB 2.00
|
||||
bDeviceClass 0 (Defined at Interface level)
|
||||
bDeviceSubClass 0
|
||||
bDeviceProtocol 0
|
||||
bMaxPacketSize0 64
|
||||
idVendor 0x1a8d BandRich, Inc.
|
||||
idProduct 0x100d 4G LTE adapter
|
||||
bcdDevice 0.00
|
||||
iManufacturer 10 BandRich, Inc.
|
||||
iProduct 9 BandLuxe HSPA-LTE Adapter
|
||||
iSerial 11 357473040068155
|
||||
[SNIP]
|
||||
|
||||
You can also run:
|
||||
|
||||
udevadm monitor
|
||||
|
||||
and unplug/replug the dongle. It will print some information.
|
||||
|
||||
The command:
|
||||
|
||||
udevadm info --export-db
|
||||
|
||||
is also important to get the right identifier to put in ENV{}. (It also
|
||||
gives the correct value.)
|
||||
|
||||
Here is extracted what we have for our dongle:
|
||||
|
||||
P: /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2/3-1.2:1.2/ttyUSB2/tty/ttyUSB2
|
||||
N: ttyUSB2
|
||||
S: bandrich
|
||||
S: serial/by-id/usb-BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155-if02-port0
|
||||
S: serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.2-port0
|
||||
E: DEVLINKS=/dev/bandrich /dev/serial/by-id/usb-BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155-if02-port0 /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.2-port0
|
||||
E: DEVNAME=/dev/ttyUSB2
|
||||
E: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2/3-1.2:1.2/ttyUSB2/tty/ttyUSB2
|
||||
E: ID_BUS=usb
|
||||
E: ID_MM_CANDIDATE=1
|
||||
E: ID_MODEL=BandLuxe_HSPA-LTE_Adapter
|
||||
E: ID_MODEL_ENC=BandLuxe\x20HSPA-LTE\x20Adapter
|
||||
E: ID_MODEL_FROM_DATABASE=4G LTE adapter
|
||||
E: ID_MODEL_ID=100d
|
||||
E: ID_PATH=pci-0000:00:1a.0-usb-0:1.2:1.2
|
||||
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_2_1_2
|
||||
E: ID_REVISION=0000
|
||||
E: ID_SERIAL=BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155
|
||||
E: ID_SERIAL_SHORT=357473040068155
|
||||
E: ID_TYPE=generic
|
||||
E: ID_USB_DRIVER=option
|
||||
E: ID_USB_INTERFACES=:ffffff:020600:0a0000:080650:
|
||||
E: ID_USB_INTERFACE_NUM=02
|
||||
E: ID_VENDOR=BandRich__Inc.
|
||||
E: ID_VENDOR_ENC=BandRich\x2c\x20Inc.
|
||||
E: ID_VENDOR_FROM_DATABASE=BandRich, Inc.
|
||||
E: ID_VENDOR_ID=1a8d
|
||||
E: MAJOR=188
|
||||
E: MINOR=2
|
||||
E: SUBSYSTEM=tty
|
||||
E: USEC_INITIALIZED=672068596
|
||||
|
||||
You can also run:
|
||||
|
||||
udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0
|
||||
udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB2
|
||||
|
||||
Note: after creating the udev files, you need to unplug/replug your
|
||||
dongle for /dev/bandrich.data and /dev/bandrich.control to appear.
|
||||
|
||||
Note: the mode 0666 is for everyone to access the dongle (no need for
|
||||
root privileges). If you prefer you can set it to 0600 (only root)
|
||||
or 0660 (root and group).
|
||||
|
||||
Then you need to configure pppd, to get correct 'route' information when
|
||||
you run wvdial.
|
||||
|
||||
The file /etc/ppp/peers/wvdial should have the following content:
|
||||
|
||||
noauth
|
||||
name wvdial
|
||||
usepeerdns
|
||||
defaultroute
|
||||
replacedefaultroute
|
||||
|
||||
The file wvdial.bandrich.conf has been created by copying some information
|
||||
found on the Internet. Its content may not be fully correct. Adapt to your
|
||||
situation. It seems to work here.
|
||||
2
cmake_targets/autotests/v2/actions/client_tcp.bash
Normal file
2
cmake_targets/autotests/v2/actions/client_tcp.bash
Normal file
@@ -0,0 +1,2 @@
|
||||
echo $SERVER_IP
|
||||
timeout -s 9 20s iperf -c $SERVER_IP -i1
|
||||
3
cmake_targets/autotests/v2/actions/client_udp.bash
Normal file
3
cmake_targets/autotests/v2/actions/client_udp.bash
Normal file
@@ -0,0 +1,3 @@
|
||||
echo $SERVER_IP
|
||||
echo $UDP_BANDWIDTH
|
||||
timeout -s 9 20s iperf -c $SERVER_IP -i1 -u -b $UDP_BANDWIDTH
|
||||
6
cmake_targets/autotests/v2/actions/clone_repository.bash
Normal file
6
cmake_targets/autotests/v2/actions/clone_repository.bash
Normal file
@@ -0,0 +1,6 @@
|
||||
sudo rm -rf /tmp/oai_test_setup
|
||||
mkdir /tmp/oai_test_setup
|
||||
cd /tmp/oai_test_setup
|
||||
git clone $REPOSITORY_URL oai
|
||||
cd oai
|
||||
git checkout $COMMIT_ID
|
||||
9
cmake_targets/autotests/v2/actions/compilation.bash
Normal file
9
cmake_targets/autotests/v2/actions/compilation.bash
Normal file
@@ -0,0 +1,9 @@
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
cd cmake_targets
|
||||
rm -rf log
|
||||
mkdir -p log
|
||||
echo $BUILD_ARGUMENTS
|
||||
./build_oai $BUILD_ARGUMENTS
|
||||
echo $BUILD_OUTPUT
|
||||
ls $BUILD_OUTPUT
|
||||
4
cmake_targets/autotests/v2/actions/execution.bash
Normal file
4
cmake_targets/autotests/v2/actions/execution.bash
Normal file
@@ -0,0 +1,4 @@
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
echo $EXEC $EXEC_ARGS
|
||||
$EXEC $EXEC_ARGS
|
||||
13
cmake_targets/autotests/v2/actions/execution_compile.bash
Normal file
13
cmake_targets/autotests/v2/actions/execution_compile.bash
Normal file
@@ -0,0 +1,13 @@
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
sudo rmmod nasmesh || true
|
||||
sudo rmmod ue_ip || true
|
||||
cd cmake_targets
|
||||
rm -rf log
|
||||
mkdir -p log
|
||||
echo $PRE_BUILD
|
||||
bash -c "$PRE_BUILD"
|
||||
echo $BUILD_PROG $BUILD_ARGUMENTS
|
||||
$BUILD_PROG $BUILD_ARGUMENTS
|
||||
echo $PRE_EXEC
|
||||
bash -c "$PRE_EXEC"
|
||||
103
cmake_targets/autotests/v2/actions/modem.py
Normal file
103
cmake_targets/autotests/v2/actions/modem.py
Normal file
@@ -0,0 +1,103 @@
|
||||
import sys, os, select, re, time
|
||||
|
||||
def quit(r):
|
||||
sys.stdout.flush()
|
||||
os._exit(r)
|
||||
|
||||
class ModemResponse:
|
||||
def __init__(self, retcode, retstring):
|
||||
self.ret = retcode
|
||||
self.data = retstring
|
||||
|
||||
class Modem:
|
||||
def open(self):
|
||||
self.i = os.open(self.devname, os.O_RDONLY)
|
||||
self.o = os.open(self.devname, os.O_WRONLY)
|
||||
#clear output of modem, if any is pending (not sure of this)
|
||||
while True:
|
||||
(ri, ro, re) = select.select([self.i], [], [self.i], 0)
|
||||
if len(ri) == 0:
|
||||
break
|
||||
l = os.read(self.i, 65536)
|
||||
print "WARNING: modem had unread data: '" + \
|
||||
l.replace('\r', '\\r') + "'"
|
||||
|
||||
def __init__(self, devname):
|
||||
self.devname = devname
|
||||
self.i = -1
|
||||
self.o = -1
|
||||
self.open()
|
||||
|
||||
def send(self, s):
|
||||
print "DEBUG: SEND TO MODEM: '" + s + "'"
|
||||
os.write(self.o, s+"\r")
|
||||
|
||||
def recv(self):
|
||||
return os.read(self.i, 65536)
|
||||
|
||||
def wait(self):
|
||||
ok = '\r\nOK\r\n'
|
||||
error = '\r\nERROR\r\n'
|
||||
cme_error = '\r\nCME ERROR:[^\r]*\r\n'
|
||||
no_carrier = '\r\nNO CARRIER\r\n'
|
||||
l = ''
|
||||
while True:
|
||||
l = l + self.recv()
|
||||
print "DEBUG: CURRENT MODEM RESPONSE: '" + \
|
||||
l.replace('\r','\\r').replace('\n','\\n') + "'"
|
||||
|
||||
#AT returned 'things' are "\r\nXXXX\r\n", look for that.
|
||||
#Check if last one matches 'ok', 'error' or 'cme_error'.
|
||||
#(Hopefully this is enough and no other reply is possible.)
|
||||
#This code accepts invalid responses from modem, ie. all
|
||||
#that does not fit in the 'findall' is thrashed away, maybe
|
||||
#we want to do something in this case?
|
||||
|
||||
res = re.findall('\r\n[^\r]*\r\n', l)
|
||||
if len(res) == 0:
|
||||
print "DEBUG: NO MATCH: wait for more input from modem"
|
||||
continue
|
||||
last_res = res[len(res)-1]
|
||||
print "DEBUG: CURRENT LAST LINE: '" + \
|
||||
last_res.replace('\r','\\r').replace('\n','\\n')+"'"
|
||||
if re.match(ok, last_res) != None:
|
||||
return ModemResponse(True, l)
|
||||
if ( re.match(error, last_res) != None or
|
||||
re.match(cme_error, last_res) != None or
|
||||
re.match(no_carrier, last_res) != None):
|
||||
return ModemResponse(False, l)
|
||||
#TODO purge?
|
||||
#re.purge()
|
||||
|
||||
def modem_reset_cycle(self):
|
||||
#close all
|
||||
os.close(self.i)
|
||||
os.close(self.o)
|
||||
self.i = -1
|
||||
self.o = -1
|
||||
|
||||
print "DEBUG: RESET CYCLE: wait for modem to go away"
|
||||
#wait for file descriptor to go away
|
||||
while True:
|
||||
try:
|
||||
test = os.open(self.devname, os.O_RDONLY)
|
||||
os.close(test)
|
||||
time.sleep(0.1)
|
||||
except BaseException, e:
|
||||
break
|
||||
print "DEBUG: RESET CYCLE: modem has gone away"
|
||||
|
||||
print "DEBUG: RESET CYCLE: wait for modem to come back"
|
||||
#wait for file descriptor to be back, try to open it over and over
|
||||
#TODO: use inotify here? (it's not in basic python as it seems)
|
||||
while True:
|
||||
try:
|
||||
test = os.open(self.devname, os.O_RDONLY)
|
||||
os.close(test)
|
||||
break
|
||||
except BaseException, e:
|
||||
time.sleep(0.1)
|
||||
print "DEBUG: RESET CYCLE: modem is back"
|
||||
|
||||
#back to business
|
||||
self.open()
|
||||
12
cmake_targets/autotests/v2/actions/run_enb.bash
Normal file
12
cmake_targets/autotests/v2/actions/run_enb.bash
Normal file
@@ -0,0 +1,12 @@
|
||||
#enable control+C reception (to be refined if it does not work)
|
||||
stty isig intr ^C
|
||||
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
sudo rmmod nasmesh || true
|
||||
sudo rmmod ue_ip || true
|
||||
cd cmake_targets/lte_build_oai/build
|
||||
ulimit -c unlimited
|
||||
sudo rm -f core
|
||||
#sudo -E ./lte-softmodem -O $OPENAIR_DIR/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.conf
|
||||
sudo -E ./lte-softmodem -O /tmp/enb.conf
|
||||
4
cmake_targets/autotests/v2/actions/server_tcp.bash
Normal file
4
cmake_targets/autotests/v2/actions/server_tcp.bash
Normal file
@@ -0,0 +1,4 @@
|
||||
stty isig intr ^C
|
||||
|
||||
#timeout -s 9 20s iperf -s -i1
|
||||
iperf -s -i1
|
||||
4
cmake_targets/autotests/v2/actions/server_udp.bash
Normal file
4
cmake_targets/autotests/v2/actions/server_udp.bash
Normal file
@@ -0,0 +1,4 @@
|
||||
stty isig intr ^C
|
||||
|
||||
#timeout -s 9 20s iperf -s -i1 -u
|
||||
iperf -s -i1 -u
|
||||
13
cmake_targets/autotests/v2/actions/start_3276.bash
Normal file
13
cmake_targets/autotests/v2/actions/start_3276.bash
Normal file
@@ -0,0 +1,13 @@
|
||||
#enable control+C reception (to be refined if it does not work)
|
||||
stty isig intr ^C
|
||||
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
sudo rmmod nasmesh || true
|
||||
sudo rmmod ue_ip || true
|
||||
cd cmake_targets/autotests/v2/actions
|
||||
sudo python start_3276.py
|
||||
|
||||
sudo wvdial -C wvdial.3276.conf || true
|
||||
|
||||
sudo python stop_3276.py
|
||||
59
cmake_targets/autotests/v2/actions/start_3276.py
Normal file
59
cmake_targets/autotests/v2/actions/start_3276.py
Normal file
@@ -0,0 +1,59 @@
|
||||
import time
|
||||
|
||||
from modem import quit, Modem
|
||||
|
||||
try:
|
||||
modem = Modem("/dev/ttyUSB0")
|
||||
|
||||
#test that modem is there
|
||||
print "INFO: check modem's presence"
|
||||
modem.send('AT')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: no modem?"
|
||||
quit(1)
|
||||
|
||||
#first deactivate
|
||||
print "INFO: deactivate the modem"
|
||||
modem.send('AT+CFUN=0')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: failed deactivating the modem"
|
||||
quit(1)
|
||||
|
||||
#activate the modem
|
||||
print "INFO: activate the modem"
|
||||
modem.send('AT+CFUN=1')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: failed asking modem for activation"
|
||||
quit(1)
|
||||
|
||||
#wait for modem to be connected
|
||||
#timeout after one minute
|
||||
print "INFO: wait for modem to be connected (timeout: one minute)"
|
||||
start_time = time.time()
|
||||
while True:
|
||||
modem.send('AT+CGATT?')
|
||||
r = modem.wait()
|
||||
if r.ret != True:
|
||||
print "ERROR: failed checking attachment status of modem"
|
||||
quit(1)
|
||||
if "+CGATT: 1" in r.data:
|
||||
break
|
||||
if not "CGATT: 0" in r.data:
|
||||
print "ERROR: bad data when checking attachment status of modem"
|
||||
quit(1)
|
||||
time.sleep(0.1)
|
||||
if time.time() > start_time + 60:
|
||||
print "ERROR: modem not connected after one minute, close modem"
|
||||
modem.send('AT+CFUN=0')
|
||||
r = modem.wait()
|
||||
if r.ret != True:
|
||||
print "ERROR: closing modem failed"
|
||||
quit(1)
|
||||
|
||||
print "INFO: modem is connected"
|
||||
|
||||
except BaseException, e:
|
||||
print "ERROR: " + str(e)
|
||||
quit(1)
|
||||
|
||||
quit(0)
|
||||
26
cmake_targets/autotests/v2/actions/start_bandrich.bash
Normal file
26
cmake_targets/autotests/v2/actions/start_bandrich.bash
Normal file
@@ -0,0 +1,26 @@
|
||||
#enable control+C reception (to be refined if it does not work)
|
||||
stty isig intr ^C
|
||||
|
||||
#If /dev/bandrich is not present when we start the test, what to do?
|
||||
#The following commented lines are an attempt at solving this.
|
||||
#This is not satisfying, so we rather do nothing.
|
||||
|
||||
##the UE got stuck once, I had to run usb_modeswitch by hand.
|
||||
##So at this point, if /dev/bandrich does not exist, maybe the UE is
|
||||
##stuck for whatever reason. Let's forcefully run usb_modeswitch.
|
||||
#if [ ! -e /dev/bandrich ]; then sudo usb_modeswitch -v 1a8d -p 1000 -I -W -K; true; fi
|
||||
#
|
||||
##wait for /dev/bandrich (TODO: use inotify?)
|
||||
##may fail if the bandrich is in a bad state
|
||||
#while [ ! -e /dev/bandrich ]; do sleep 1; done
|
||||
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
sudo rmmod nasmesh || true
|
||||
sudo rmmod ue_ip || true
|
||||
cd cmake_targets/autotests/v2/actions
|
||||
python start_bandrich.py
|
||||
|
||||
sudo wvdial -C wvdial.bandrich.conf || true
|
||||
|
||||
python stop_bandrich.py
|
||||
55
cmake_targets/autotests/v2/actions/start_bandrich.py
Normal file
55
cmake_targets/autotests/v2/actions/start_bandrich.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import time
|
||||
|
||||
from modem import quit, Modem
|
||||
|
||||
try:
|
||||
modem = Modem("/dev/bandrich.control")
|
||||
|
||||
#test that modem is there
|
||||
print "INFO: check modem's presence"
|
||||
modem.send('AT')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: no modem?"
|
||||
quit(1)
|
||||
|
||||
#activate the modem, be brutal and reset it too!
|
||||
print "INFO: reset and activate the modem"
|
||||
modem.send('AT+CFUN=1,1')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: failed asking modem for activation"
|
||||
quit(1)
|
||||
|
||||
#modem has gone! wait for it to pop up again
|
||||
modem.modem_reset_cycle()
|
||||
|
||||
#wait for modem to be connected
|
||||
#timeout after one minute
|
||||
print "INFO: wait for modem to be connected (timeout: one minute)"
|
||||
start_time = time.time()
|
||||
while True:
|
||||
modem.send('AT+CGATT?')
|
||||
r = modem.wait()
|
||||
if r.ret != True:
|
||||
print "ERROR: failed checking attachment status of modem"
|
||||
quit(1)
|
||||
if "+CGATT: 1" in r.data:
|
||||
break
|
||||
if not "CGATT: 0" in r.data:
|
||||
print "ERROR: bad data when checking attachment status of modem"
|
||||
quit(1)
|
||||
time.sleep(0.1)
|
||||
if time.time() > start_time + 60:
|
||||
print "ERROR: modem not connected after one minute, close modem"
|
||||
modem.send('AT+CFUN=4')
|
||||
r = modem.wait()
|
||||
if r.ret != True:
|
||||
print "ERROR: closing modem failed"
|
||||
quit(1)
|
||||
|
||||
print "INFO: modem is connected"
|
||||
|
||||
except BaseException, e:
|
||||
print "ERROR: " + str(e)
|
||||
quit(1)
|
||||
|
||||
quit(0)
|
||||
29
cmake_targets/autotests/v2/actions/stop_3276.py
Normal file
29
cmake_targets/autotests/v2/actions/stop_3276.py
Normal file
@@ -0,0 +1,29 @@
|
||||
import time
|
||||
|
||||
from modem import quit, Modem
|
||||
|
||||
try:
|
||||
modem = Modem("/dev/ttyUSB0")
|
||||
|
||||
#test that modem is there
|
||||
print "INFO: check modem's presence"
|
||||
modem.send('AT')
|
||||
r = modem.wait()
|
||||
if r.ret != True and "NO CARRIER" not in r.data:
|
||||
print "ERROR: no modem?"
|
||||
quit(1)
|
||||
if "NO CARRIER" in r.data:
|
||||
print "WARNING: 'NO CARRIER' detected, not sure if handled correctly"
|
||||
|
||||
#deactivate the modem
|
||||
print "INFO: deactivate the modem"
|
||||
modem.send('AT+CFUN=0')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: failed asking modem for deactivation"
|
||||
quit(1)
|
||||
|
||||
except BaseException, e:
|
||||
print "ERROR: " + str(e)
|
||||
quit(1)
|
||||
|
||||
quit(0)
|
||||
29
cmake_targets/autotests/v2/actions/stop_bandrich.py
Normal file
29
cmake_targets/autotests/v2/actions/stop_bandrich.py
Normal file
@@ -0,0 +1,29 @@
|
||||
import time
|
||||
|
||||
from modem import quit, Modem
|
||||
|
||||
try:
|
||||
modem = Modem("/dev/bandrich.control")
|
||||
|
||||
#test that modem is there
|
||||
print "INFO: check modem's presence"
|
||||
modem.send('AT')
|
||||
r = modem.wait()
|
||||
if r.ret != True and "NO CARRIER" not in r.data:
|
||||
print "ERROR: no modem?"
|
||||
quit(1)
|
||||
if "NO CARRIER" in r.data:
|
||||
print "WARNING: 'NO CARRIER' detected, not sure if handled correctly"
|
||||
|
||||
#deactivate the modem
|
||||
print "INFO: deactivate the modem"
|
||||
modem.send('AT+CFUN=4')
|
||||
if modem.wait().ret != True:
|
||||
print "ERROR: failed asking modem for deactivation"
|
||||
quit(1)
|
||||
|
||||
except BaseException, e:
|
||||
print "ERROR: " + str(e)
|
||||
quit(1)
|
||||
|
||||
quit(0)
|
||||
27
cmake_targets/autotests/v2/actions/wvdial.3276.conf
Normal file
27
cmake_targets/autotests/v2/actions/wvdial.3276.conf
Normal file
@@ -0,0 +1,27 @@
|
||||
[Dialer Defaults]
|
||||
Modem = /dev/ttyUSB0
|
||||
ISDN = off
|
||||
Modem Type = Analog Modem
|
||||
Baud = 9600
|
||||
Init1 = ATZ
|
||||
Init2 = AT&F &D2 &C1
|
||||
Init3 = AT+CGDCONT=1,"IP","oai.ipv4"
|
||||
Phone = *99#
|
||||
Phone1 =
|
||||
Phone2 =
|
||||
Phone3 =
|
||||
Phone4 =
|
||||
Ask Password = off
|
||||
Password = ''
|
||||
Username = ImaginLab
|
||||
Auto Reconnect = off
|
||||
Abort on Busy = off
|
||||
Carrier Check = on
|
||||
Check Def Route = on
|
||||
Abort on No Dialtone = on
|
||||
Stupid Mode = on
|
||||
Idle Seconds = 0
|
||||
Auto DNS = on
|
||||
;Minimize = off
|
||||
;Dock = off
|
||||
;Do NOT edit this file by hand!
|
||||
36
cmake_targets/autotests/v2/actions/wvdial.bandrich.conf
Normal file
36
cmake_targets/autotests/v2/actions/wvdial.bandrich.conf
Normal file
@@ -0,0 +1,36 @@
|
||||
[Dialer Defaults]
|
||||
Modem = /dev/bandrich.data
|
||||
ISDN = off
|
||||
Modem Type = Analog Modem
|
||||
Baud = 9600
|
||||
Init = ATZ
|
||||
Init2 = AT+CPIN?
|
||||
Init3 = AT+CGREG?
|
||||
Init4 = AT+COPS?
|
||||
Init5 = AT+CSQ
|
||||
Init6 =
|
||||
Init7 = AT+CGATT=1
|
||||
Init8 =
|
||||
Init9 =
|
||||
Phone = *99***1#
|
||||
Phone1 =
|
||||
Phone2 =
|
||||
Phone3 =
|
||||
Phone4 =
|
||||
Dial Prefix =
|
||||
Dial Attempts = 1
|
||||
Dial Command = ATM1L3DT
|
||||
Ask Password = off
|
||||
Password = ''
|
||||
Username = ImaginLab
|
||||
Auto Reconnect = off
|
||||
Abort on Busy = off
|
||||
Carrier Check = on
|
||||
Check Def Route = on
|
||||
Abort on No Dialtone = on
|
||||
Stupid Mode = on
|
||||
Idle Seconds = 0
|
||||
Auto DNS = on
|
||||
;Minimize = off
|
||||
;Dock = off
|
||||
;Do NOT edit this file by hand!
|
||||
551
cmake_targets/autotests/v2/alu_test.py
Normal file
551
cmake_targets/autotests/v2/alu_test.py
Normal file
@@ -0,0 +1,551 @@
|
||||
import threading, os, re
|
||||
|
||||
from utils import quickshell, log, TestFailed, do_tests
|
||||
from task import Task, WAITLOG_SUCCESS
|
||||
|
||||
class alu_test:
|
||||
def __init__(self,
|
||||
epc, enb, ue,
|
||||
openair,
|
||||
user, password,
|
||||
log_subdir,
|
||||
env,
|
||||
enb_rru = "",
|
||||
enb_rcc = ""):
|
||||
self.epc_machine = epc
|
||||
self.enb_machine = enb
|
||||
self.ue_machine = ue
|
||||
self.openair_dir = openair
|
||||
self.oai_user = user
|
||||
self.oai_password = password
|
||||
self.env = env
|
||||
self.enb_rru_machine = enb_rru
|
||||
self.enb_rcc_machine = enb_rcc
|
||||
|
||||
self.task_hss = None
|
||||
self.task_enb = None
|
||||
self.task_ue = None
|
||||
self.task_rru_enb = None
|
||||
self.task_rcc_enb = None
|
||||
|
||||
self.logdir = openair + '/cmake_targets/autotests/log/' + log_subdir
|
||||
quickshell('mkdir -p ' + self.logdir)
|
||||
|
||||
#event object used to wait for several tasks at once
|
||||
self.event = threading.Event()
|
||||
|
||||
##########################################################################
|
||||
# finish
|
||||
##########################################################################
|
||||
def finish(self):
|
||||
#brutally kill tasks still running
|
||||
#TODO: call 'wait', some processes may still be there as zombies
|
||||
if self.task_hss != None and self.task_hss.alive():
|
||||
self.task_hss.kill()
|
||||
if self.task_enb != None and self.task_enb.alive():
|
||||
self.task_enb.kill()
|
||||
if self.task_ue != None and self.task_ue.alive():
|
||||
self.task_ue.kill()
|
||||
if self.task_rru_enb != None and self.task_rru_enb.alive():
|
||||
self.task_rru_enb.kill()
|
||||
if self.task_rcc_enb != None and self.task_rcc_enb.alive():
|
||||
self.task_rcc_enb.kill()
|
||||
|
||||
##########################################################################
|
||||
# start_epc
|
||||
##########################################################################
|
||||
def start_epc(self):
|
||||
#launch HSS, wait for prompt
|
||||
log("INFO: ALU test: run HSS")
|
||||
self.task_hss = Task("actions/alu_hss.bash",
|
||||
"alu_hss",
|
||||
self.epc_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/alu_hss." + self.epc_machine,
|
||||
event=self.event)
|
||||
self.task_hss.waitlog('S6AS_SIM-> ')
|
||||
|
||||
#then launch EPC, wait for connection on HSS side
|
||||
log("INFO: ALU test: run EPC")
|
||||
task_epc = Task("actions/alu_epc.bash",
|
||||
"ALU EPC",
|
||||
self.epc_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/alu_epc." + self.epc_machine)
|
||||
ret = task_epc.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: EPC start failure");
|
||||
raise TestFailed()
|
||||
self.task_hss.waitlog('Connected\n')
|
||||
|
||||
##########################################################################
|
||||
# stop_epc
|
||||
##########################################################################
|
||||
def stop_epc(self):
|
||||
#stop EPC, wait for disconnection on HSS side
|
||||
log("INFO: ALU test: stop EPC")
|
||||
task_epc = Task("actions/alu_epc_stop.bash",
|
||||
"alu_epc_stop",
|
||||
self.epc_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/alu_epc_stop." + self.epc_machine)
|
||||
ret = task_epc.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: ALU EPC stop failed")
|
||||
raise TestFailed()
|
||||
self.task_hss.waitlog('Disconnected\n')
|
||||
|
||||
log("INFO: ALU test: stop HSS")
|
||||
self.task_hss.sendnow("exit\n")
|
||||
ret = self.task_hss.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: ALU HSS failed")
|
||||
raise TestFailed()
|
||||
|
||||
##########################################################################
|
||||
# compile_enb
|
||||
##########################################################################
|
||||
def compile_enb(self, build_arguments, log_suffix=""):
|
||||
log("INFO: ALU test: compile softmodem on " + self.enb_machine)
|
||||
envcomp = list(self.env)
|
||||
envcomp.append('BUILD_ARGUMENTS="' + build_arguments + '"')
|
||||
#we don't care about BUILD_OUTPUT but required (TODO: change that)
|
||||
envcomp.append('BUILD_OUTPUT=/')
|
||||
logdir = self.logdir + "/compile_log"
|
||||
remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'"
|
||||
post_action = "mkdir -p "+ logdir + \
|
||||
" && sshpass -p " + self.oai_password + \
|
||||
" scp -r " + self.oai_user + \
|
||||
"@" + self.enb_machine + ":" + remote_files + " " + logdir + \
|
||||
" || true"
|
||||
task = Task("actions/compilation.bash",
|
||||
"compile_softmodem",
|
||||
self.enb_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
envcomp,
|
||||
self.logdir + "/compile_softmodem." + log_suffix + \
|
||||
self.enb_machine,
|
||||
post_action=post_action)
|
||||
ret = task.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: softmodem compilation failure");
|
||||
raise TestFailed()
|
||||
task.postaction()
|
||||
|
||||
##########################################################################
|
||||
# start_enb
|
||||
##########################################################################
|
||||
def start_enb(self, config_file):
|
||||
#copy wanted configuration file
|
||||
quickshell("sshpass -p " + self.oai_password +
|
||||
" scp config/" + config_file + " " +
|
||||
self.oai_user + "@" + self.enb_machine + ":/tmp/enb.conf")
|
||||
|
||||
#run softmodem
|
||||
log("INFO: ALU test: run softmodem with configuration file " +
|
||||
config_file)
|
||||
self.task_enb = Task("actions/run_enb.bash",
|
||||
"run_softmodem",
|
||||
self.enb_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/run_softmodem." + self.enb_machine,
|
||||
event=self.event)
|
||||
self.task_enb.waitlog('got sync')
|
||||
|
||||
##########################################################################
|
||||
# stop_enb
|
||||
##########################################################################
|
||||
def stop_enb(self):
|
||||
log("INFO: ALU test: stop softmodem")
|
||||
self.task_enb.sendnow("%c" % 3)
|
||||
ret = self.task_enb.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: softmodem failed")
|
||||
#not sure if we have to quit here or not
|
||||
#os._exit(1)
|
||||
|
||||
##########################################################################
|
||||
# start_enb_rru_rcc
|
||||
##########################################################################
|
||||
def start_enb_rru_rcc(self, rru_config_file, rcc_config_file):
|
||||
#copy wanted configuration files
|
||||
quickshell("sshpass -p " + self.oai_password +
|
||||
" scp config/" + rru_config_file + " " +
|
||||
self.oai_user + "@" + self.enb_rru_machine+":/tmp/enb.conf")
|
||||
quickshell("sshpass -p " + self.oai_password +
|
||||
" scp config/" + rcc_config_file + " " +
|
||||
self.oai_user + "@" + self.enb_rcc_machine+":/tmp/enb.conf")
|
||||
|
||||
#run RRU/RCC softmodem
|
||||
log("INFO: ALU test: run RRU softmodem with configuration file " +
|
||||
rru_config_file)
|
||||
self.task_rru_enb = Task("actions/run_enb.bash",
|
||||
"run_RRU_softmodem",
|
||||
self.enb_rru_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/run_softmodem." + self.enb_rru_machine,
|
||||
event=self.event)
|
||||
self.task_rru_enb.waitlog('[RRH] binding to')
|
||||
log("INFO: ALU test: run RCC softmodem with configuration file " +
|
||||
rcc_config_file)
|
||||
self.task_rcc_enb = Task("actions/run_enb.bash",
|
||||
"run_RCC_softmodem",
|
||||
self.enb_rcc_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/run_softmodem." + self.enb_rcc_machine,
|
||||
event=self.event)
|
||||
self.task_rcc_enb.waitlog('[BBU] local ip addr')
|
||||
#wait for RRU and RCC to be connected
|
||||
self.task_rru_enb.waitlog('devices ok (eNB_thread_asynch_rx)')
|
||||
|
||||
##########################################################################
|
||||
# stop_enb_rru_rcc
|
||||
##########################################################################
|
||||
def stop_enb_rru_rcc(self):
|
||||
log("INFO: ALU test: stop RRU/RCC softmodem")
|
||||
self.task_rru_enb.sendnow("%c" % 3)
|
||||
ret = self.task_rru_enb.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: RRU softmodem failed")
|
||||
#not sure if we have to quit here or not
|
||||
#os._exit(1)
|
||||
self.task_rcc_enb.sendnow("%c" % 3)
|
||||
ret = self.task_rcc_enb.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: RCC softmodem failed")
|
||||
#not sure if we have to quit here or not
|
||||
#os._exit(1)
|
||||
|
||||
##########################################################################
|
||||
# start_ue
|
||||
##########################################################################
|
||||
def start_ue(self, ue):
|
||||
log("INFO: ALU test: start " + ue + " UE")
|
||||
self.task_ue = Task("actions/start_" + ue + ".bash",
|
||||
"start_" + ue,
|
||||
self.ue_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/start_" + ue + "." + self.ue_machine,
|
||||
event=self.event)
|
||||
self.task_ue.waitlog("local IP address", event=self.event)
|
||||
self.event.wait()
|
||||
|
||||
#at this point one task has died or we have the line in the log
|
||||
if self.task_ue.waitlog_state != WAITLOG_SUCCESS:
|
||||
log("ERROR: ALU test: " + ue + " UE did not connect")
|
||||
raise TestFailed()
|
||||
|
||||
self.event.clear()
|
||||
|
||||
if ( (self.task_enb != None and not self.task_enb.alive()) or
|
||||
(self.task_rru_enb!=None and not self.task_rru_enb.alive()) or
|
||||
(self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or
|
||||
not self.task_hss.alive() or
|
||||
not self.task_ue.alive()):
|
||||
log("ERROR: ALU test: eNB, HSS or UE task died")
|
||||
raise TestFailed()
|
||||
|
||||
#get UE IP
|
||||
l = open(self.task_ue.logfile, "r").read()
|
||||
self.ue_ip = re.search("local IP address (.*)\n", l) \
|
||||
.groups()[0]
|
||||
log("INFO: ALU test: " + ue + " UE IP address: " + self.ue_ip)
|
||||
|
||||
##########################################################################
|
||||
# stop_ue
|
||||
##########################################################################
|
||||
def stop_ue(self, ue):
|
||||
log("INFO: ALU test: stop " + ue + " UE")
|
||||
self.task_ue.sendnow("%c" % 3)
|
||||
ret = self.task_ue.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: task " + ue + " UE failed")
|
||||
#not sure if we have to quit here or not
|
||||
#os._exit(1)
|
||||
|
||||
##########################################################################
|
||||
# _do_traffic (internal function, do not call out of the class)
|
||||
##########################################################################
|
||||
def _do_traffic(self, name,
|
||||
server_code, server_machine, server_ip,
|
||||
client_code, client_machine,
|
||||
waitlog,
|
||||
server_logfile, client_logfile,
|
||||
udp_bandwidth=None):
|
||||
log("INFO: ALU test: run traffic: " + name)
|
||||
|
||||
log("INFO: ALU test: launch server")
|
||||
task_traffic_server = Task("actions/" + server_code + ".bash",
|
||||
server_logfile,
|
||||
server_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/" + server_logfile + "." + server_machine,
|
||||
event=self.event)
|
||||
task_traffic_server.waitlog(waitlog)
|
||||
|
||||
env = list(self.env)
|
||||
if udp_bandwidth != None:
|
||||
env.append("UDP_BANDWIDTH=" + udp_bandwidth)
|
||||
env.append("SERVER_IP=" + server_ip)
|
||||
|
||||
log("INFO: ALU test: launch client")
|
||||
task_traffic_client = Task("actions/" + client_code + ".bash",
|
||||
client_logfile,
|
||||
client_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
env,
|
||||
self.logdir + "/" + client_logfile + "." + client_machine,
|
||||
event=self.event)
|
||||
log("INFO: ALU test: wait for client to finish (or some error)")
|
||||
|
||||
self.event.wait()
|
||||
log("DEBUG: event.wait() done")
|
||||
|
||||
if ( (self.task_enb != None and not self.task_enb.alive()) or
|
||||
(self.task_rru_enb!=None and not self.task_rru_enb.alive()) or
|
||||
(self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or
|
||||
not self.task_hss.alive() or
|
||||
not self.task_ue.alive()):
|
||||
log("ERROR: unexpected task exited, test failed, kill all")
|
||||
if task_traffic_client.alive():
|
||||
task_traffic_client.kill()
|
||||
if (self.task_enb != None and self.task_enb.alive()):
|
||||
self.task_enb.kill()
|
||||
if (self.task_rru_enb != None and self.task_rru_enb.alive()):
|
||||
self.task_rru_enb.kill()
|
||||
if (self.task_rcc_enb != None and self.task_rcc_enb.alive()):
|
||||
self.task_rcc_enb.kill()
|
||||
if self.task_ue.alive():
|
||||
self.task_ue.kill()
|
||||
|
||||
ret = task_traffic_client.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: downlink traffic failed")
|
||||
#not sure if we have to quit here or not
|
||||
#os._exit(1)
|
||||
|
||||
#stop downlink server
|
||||
#log("INFO: ALU test: stop server (kill ssh connection)")
|
||||
#task_traffic_server.kill()
|
||||
log("INFO: ALU test: stop server (ctrl+z then kill -9 %1)")
|
||||
task_traffic_server.sendnow("%ckill -9 %%1 || true\n" % 26)
|
||||
log("INFO: ALU test: wait for server to quit")
|
||||
task_traffic_server.wait()
|
||||
|
||||
self.event.clear()
|
||||
|
||||
if ( (self.task_enb != None and not self.task_enb.alive()) or
|
||||
(self.task_rru_enb!=None and not self.task_rru_enb.alive()) or
|
||||
(self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or
|
||||
not self.task_hss.alive() or
|
||||
not self.task_ue.alive()):
|
||||
log("ERROR: ALU test: eNB, HSS or UE task died")
|
||||
raise TestFailed()
|
||||
|
||||
##########################################################################
|
||||
# dl_tcp
|
||||
##########################################################################
|
||||
def dl_tcp(self, ue):
|
||||
self._do_traffic(ue + " downlink TCP",
|
||||
"server_tcp", self.ue_machine, self.ue_ip,
|
||||
"client_tcp", self.epc_machine,
|
||||
"Server listening on TCP port 5001",
|
||||
ue + "_downlink_tcp_server",
|
||||
ue + "_downlink_tcp_client")
|
||||
|
||||
##########################################################################
|
||||
# ul_tcp
|
||||
##########################################################################
|
||||
def ul_tcp(self, ue):
|
||||
self._do_traffic(ue + " uplink TCP",
|
||||
"server_tcp", self.epc_machine, "192.172.0.1",
|
||||
"client_tcp", self.ue_machine,
|
||||
"Server listening on TCP port 5001",
|
||||
ue + "_uplink_tcp_server",
|
||||
ue + "_uplink_tcp_client")
|
||||
|
||||
##########################################################################
|
||||
# dl_udp
|
||||
##########################################################################
|
||||
def dl_udp(self, ue, bandwidth):
|
||||
self._do_traffic(ue + " downlink UDP",
|
||||
"server_udp", self.ue_machine, self.ue_ip,
|
||||
"client_udp", self.epc_machine,
|
||||
"Server listening on UDP port 5001",
|
||||
ue + "_downlink_udp_server",
|
||||
ue + "_downlink_udp_client",
|
||||
udp_bandwidth=bandwidth)
|
||||
|
||||
##########################################################################
|
||||
# ul_udp
|
||||
##########################################################################
|
||||
def ul_udp(self, ue, bandwidth):
|
||||
self._do_traffic(ue + " uplink UDP",
|
||||
"server_udp", self.epc_machine, "192.172.0.1",
|
||||
"client_udp", self.ue_machine,
|
||||
"Server listening on UDP port 5001",
|
||||
ue + "_uplink_udp_server",
|
||||
ue + "_uplink_udp_client",
|
||||
udp_bandwidth=bandwidth)
|
||||
|
||||
##############################################################################
|
||||
# run_b210_alu
|
||||
##############################################################################
|
||||
|
||||
def run_b210_alu(tests, openair_dir, oai_user, oai_password, env):
|
||||
|
||||
#compile eNB (two cases: one for FDD and one for TDD)
|
||||
|
||||
if do_tests(tests['b210']['alu']['fdd']):
|
||||
alu = alu_test(epc='amerique', enb='hutch', ue='stevens',
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/b210_alu/compile_enb_fdd',
|
||||
env=env)
|
||||
|
||||
try:
|
||||
alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity")
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: eNB compilation failed: " + str(e))
|
||||
return
|
||||
|
||||
if do_tests(tests['b210']['alu']['tdd']):
|
||||
alu = alu_test(epc='amerique', enb='calisson', ue='mozart',
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/b210_alu/compile_enb_tdd',
|
||||
env=env)
|
||||
|
||||
try:
|
||||
alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity")
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: eNB compilation failed: " + str(e))
|
||||
return
|
||||
|
||||
#compile RRU/RCC eNB
|
||||
|
||||
if do_tests(tests['remote b210']['alu']['fdd']):
|
||||
#RRU
|
||||
alu = alu_test(epc='amerique', ue='stevens',
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/remote_b210_alu/compile_enb_rru',
|
||||
env=env,
|
||||
#hack: set 'enb' to reuse 'compile_enb'
|
||||
enb = 'superserver',
|
||||
enb_rru = 'superserver', enb_rcc = 'starsky')
|
||||
|
||||
try:
|
||||
alu.compile_enb("--eNB -x -c -w USRP -t ETHERNET",
|
||||
log_suffix='rru.')
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: RRU eNB compilation failed: "+str(e))
|
||||
return
|
||||
|
||||
#RCC
|
||||
alu = alu_test(epc='amerique', ue='stevens',
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/remote_b210_alu/compile_enb_rcc',
|
||||
env=env,
|
||||
#hack: set 'enb' to reuse 'compile_enb'
|
||||
enb = 'starsky',
|
||||
enb_rru = 'superserver', enb_rcc = 'starsky')
|
||||
|
||||
try:
|
||||
alu.compile_enb("--eNB -w None -t ETHERNET",
|
||||
log_suffix='rcc.')
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: RCC eNB compilation failed: "+str(e))
|
||||
return
|
||||
|
||||
|
||||
#run tests
|
||||
|
||||
udp_dl_bandwidth = { "5" : "15M",
|
||||
"10" : "30M",
|
||||
"20" : "60M" }
|
||||
|
||||
udp_ul_bandwidth = { "5" : "7M",
|
||||
"10" : "15M",
|
||||
"20" : "15M" }
|
||||
|
||||
ue_machine = { "fdd" : "stevens",
|
||||
"tdd" : "mozart" }
|
||||
|
||||
enb_machine = { "fdd" : "hutch",
|
||||
"tdd" : "calisson" }
|
||||
|
||||
band = { "fdd" : "7",
|
||||
"tdd" : "38" }
|
||||
|
||||
for mode in ('fdd', 'tdd'):
|
||||
for bw in ('5', '10', '20'):
|
||||
if do_tests(tests['b210']['alu'][mode][bw]):
|
||||
log("INFO: ALU test: run tests for bandwidth " + bw + " MHz")
|
||||
ctest = tests['b210']['alu'][mode][bw]
|
||||
alu = alu_test(epc='amerique', enb=enb_machine[mode], ue=ue_machine[mode],
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/b210_alu/' + mode + "/" + bw,
|
||||
env=env)
|
||||
try:
|
||||
alu.start_epc()
|
||||
alu.start_enb("enb.band" + band[mode] + ".tm1.usrpb210." + mode + "." + bw + "MHz.conf")
|
||||
for ue in ('bandrich', '3276'):
|
||||
if ue in ctest and do_tests(ctest[ue]):
|
||||
alu.start_ue(ue)
|
||||
if do_tests(ctest[ue]['tcp']['dl']): alu.dl_tcp(ue)
|
||||
if do_tests(ctest[ue]['tcp']['ul']): alu.ul_tcp(ue)
|
||||
if do_tests(ctest[ue]['udp']['dl']): alu.dl_udp(ue, udp_dl_bandwidth[bw])
|
||||
if do_tests(ctest[ue]['udp']['ul']): alu.ul_udp(ue, udp_ul_bandwidth[bw])
|
||||
alu.stop_ue(ue)
|
||||
alu.stop_enb()
|
||||
alu.stop_epc()
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: " + str(e))
|
||||
alu.finish()
|
||||
if do_tests(tests['remote b210']['alu'][mode][bw]):
|
||||
log("INFO: ALU test: run RRU/RCC tests for bandwidth " + bw + " MHz")
|
||||
ctest = tests['remote b210']['alu'][mode][bw]
|
||||
alu = alu_test(epc='amerique', enb='', ue=ue_machine[mode],
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/remote_b210_alu/' + bw,
|
||||
env=env,
|
||||
enb_rru='superserver', enb_rcc='starsky')
|
||||
try:
|
||||
alu.start_epc()
|
||||
alu.start_enb_rru_rcc("rru.band7.tm1.if4p5." + bw + "MHz.udp.usrpb210.conf",
|
||||
"rcc.band7.tm1.if4p5." + bw + "MHz.conf")
|
||||
for ue in ('bandrich', '3276'):
|
||||
if ue in ctest and do_tests(ctest[ue]):
|
||||
alu.start_ue(ue)
|
||||
if do_tests(ctest[ue]['tcp']['dl']): alu.dl_tcp(ue)
|
||||
if do_tests(ctest[ue]['tcp']['ul']): alu.ul_tcp(ue)
|
||||
if do_tests(ctest[ue]['udp']['dl']): alu.dl_udp(ue, udp_dl_bandwidth[bw])
|
||||
if do_tests(ctest[ue]['udp']['ul']): alu.ul_udp(ue, udp_ul_bandwidth[bw])
|
||||
alu.stop_ue(ue)
|
||||
alu.stop_enb_rru_rcc()
|
||||
alu.stop_epc()
|
||||
except BaseException, e:
|
||||
log("ERROR: ALU test failed: " + str(e))
|
||||
alu.finish()
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "TDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 38;
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -90;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -96;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "TDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 38;
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 100;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -90;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -96;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "TDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 38;
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -90;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -96;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -103;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 100;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -103;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,175 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "eNodeB_3GPP";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -24;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -103;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
Normal file
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
Normal file
@@ -0,0 +1,192 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RCC_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth1";
|
||||
remote_address = "10.10.10.157";
|
||||
local_address = "10.10.10.18";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
Normal file
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
Normal file
@@ -0,0 +1,192 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RCC_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 100;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth1";
|
||||
remote_address = "10.10.10.157";
|
||||
local_address = "10.10.10.18";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
Normal file
192
cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
Normal file
@@ -0,0 +1,192 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RCC_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -108;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
ue_TransmissionMode = 1;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth1";
|
||||
remote_address = "10.10.10.157";
|
||||
local_address = "10.10.10.18";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,194 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RRU_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth3";
|
||||
remote_address = "10.10.10.18";
|
||||
local_address = "10.10.10.157";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,194 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RRU_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 100;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth3";
|
||||
remote_address = "10.10.10.18";
|
||||
local_address = "10.10.10.157";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,194 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RRU_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "FDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 90;
|
||||
rx_gain = 125;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 0;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -96;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth3";
|
||||
remote_address = "10.10.10.18";
|
||||
local_address = "10.10.10.157";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
if_compression = "alaw";
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
104
cmake_targets/autotests/v2/connection.py
Normal file
104
cmake_targets/autotests/v2/connection.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import os, subprocess, time, fcntl, termios, tty, signal, thread
|
||||
|
||||
from utils import log
|
||||
|
||||
class connection:
|
||||
def __init__(self, description, host, user, password):
|
||||
self.description = description
|
||||
self.host = host
|
||||
self.user = user
|
||||
self.password = password
|
||||
self.sendlock = thread.allocate_lock()
|
||||
|
||||
try:
|
||||
(pid, fd) = os.forkpty()
|
||||
except BaseException, e:
|
||||
log("ERROR: forkpty for '" + description + "': " + e)
|
||||
(pid, fd) = (-1, -1)
|
||||
|
||||
if pid == -1:
|
||||
log("ERROR: creating connection for '" + description + "'")
|
||||
os._exit(1)
|
||||
|
||||
# child process, run ssh
|
||||
if pid == 0:
|
||||
try:
|
||||
os.execvp('sshpass', ['sshpass', '-p', password,
|
||||
'ssh', user + '@' + host])
|
||||
except BaseException, e:
|
||||
log("ERROR: execvp for '" + description + "': " + e)
|
||||
log("ERROR: execvp failed for '" + description + "'")
|
||||
os._exit(1)
|
||||
|
||||
# parent process
|
||||
# make the TTY raw to avoid getting input printed and no ^M
|
||||
try:
|
||||
tty.setraw(fd, termios.TCSANOW)
|
||||
except BaseException, e:
|
||||
log("ERROR: failed configuring TTY: " + str(e))
|
||||
os._exit(1)
|
||||
|
||||
# try:
|
||||
# fcntl.fcntl(fd, fcntl.F_SETFL,
|
||||
# fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK)
|
||||
# except:
|
||||
# log("ERROR: fcntl failed for '" + description + "'")
|
||||
# os._exit(1)
|
||||
|
||||
self.pid = pid
|
||||
self.fd = fd
|
||||
self.active = True
|
||||
self.retcode = -1
|
||||
|
||||
def send(self, string):
|
||||
if self.active == False:
|
||||
log("ERROR: send: child is dead for '" + self.description + "'")
|
||||
return -1
|
||||
|
||||
try:
|
||||
(pid, out) = os.waitpid(self.pid, os.WNOHANG)
|
||||
except BaseException, e:
|
||||
log("ERROR: send: waitpid failed for '" + self.description +
|
||||
"': " + str(e))
|
||||
(pid, out) = (self.pid, 1)
|
||||
if pid != 0:
|
||||
log("ERROR: send: child process dead for '" +
|
||||
self.description + "'")
|
||||
try:
|
||||
os.close(self.fd)
|
||||
except BaseException, e:
|
||||
#we don't care about errors at this point
|
||||
pass
|
||||
self.active = False
|
||||
self.retcode = out
|
||||
return -1
|
||||
|
||||
self.sendlock.acquire()
|
||||
|
||||
length = len(string)
|
||||
while length != 0:
|
||||
try:
|
||||
ret = os.write(self.fd, string)
|
||||
except BaseException, e:
|
||||
log("ERROR: send fails for '" + self.description + "': " +
|
||||
str(e))
|
||||
os._exit(1)
|
||||
|
||||
if ret == 0:
|
||||
log("ERROR: send: write returns 0 for '" +
|
||||
self.description + "'")
|
||||
os._exit(1)
|
||||
|
||||
length = length - ret
|
||||
string = string[ret:]
|
||||
|
||||
self.sendlock.release()
|
||||
|
||||
return 0
|
||||
|
||||
def kill(self, signal=signal.SIGTERM):
|
||||
log("INFO: kill connection '" + self.description + "'")
|
||||
try:
|
||||
os.kill(self.pid, signal)
|
||||
except BaseException, e:
|
||||
log("ERROR: connection.kill: " + str(e))
|
||||
79
cmake_targets/autotests/v2/machine_list.py
Normal file
79
cmake_targets/autotests/v2/machine_list.py
Normal file
@@ -0,0 +1,79 @@
|
||||
import threading, os
|
||||
|
||||
from utils import log
|
||||
|
||||
class MachineWaiterThread(threading.Thread):
|
||||
def __init__(self, machine, tasks):
|
||||
threading.Thread.__init__(self)
|
||||
self.machine = machine
|
||||
self.tasks = tasks
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
for task in self.tasks:
|
||||
ret = task.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: task '" + task.description + "' failed " +
|
||||
"on machine " + self.machine.name)
|
||||
task.postaction()
|
||||
self.machine.unbusy()
|
||||
except BaseException, e:
|
||||
log("ERROR: MachineWaiterThread: " + str(e))
|
||||
os._exit(1)
|
||||
|
||||
class Machine():
|
||||
def __init__(self, machine, cond):
|
||||
self.name = machine
|
||||
self.free = True
|
||||
self.cond = cond
|
||||
def busy(self, tasks):
|
||||
waiter = MachineWaiterThread(self, tasks)
|
||||
waiter.start()
|
||||
def unbusy(self):
|
||||
self.cond.acquire()
|
||||
self.free = True
|
||||
self.cond.notify()
|
||||
self.cond.release()
|
||||
|
||||
class MachineList():
|
||||
def __init__(self, list):
|
||||
self.list = []
|
||||
self.cond = threading.Condition()
|
||||
for m in list:
|
||||
self.list.append(Machine(m, self.cond))
|
||||
|
||||
def get_free_machine(self):
|
||||
try:
|
||||
self.cond.acquire()
|
||||
while True:
|
||||
free_machine = None
|
||||
for m in self.list:
|
||||
if m.free == True:
|
||||
free_machine = m
|
||||
break
|
||||
if free_machine != None:
|
||||
break
|
||||
self.cond.wait()
|
||||
free_machine.free = False
|
||||
self.cond.release()
|
||||
except BaseException, e:
|
||||
log("ERROR: machine_list: " + str(e))
|
||||
os._exit(1)
|
||||
return free_machine
|
||||
|
||||
def wait_all_free(self):
|
||||
try:
|
||||
self.cond.acquire()
|
||||
while True:
|
||||
all_free = True
|
||||
for m in self.list:
|
||||
if m.free == False:
|
||||
all_free = False
|
||||
break
|
||||
if all_free == True:
|
||||
break
|
||||
self.cond.wait()
|
||||
self.cond.release()
|
||||
except BaseException, e:
|
||||
log("ERROR: machine_list: " + str(e))
|
||||
os._exit(1)
|
||||
705
cmake_targets/autotests/v2/main.py
Normal file
705
cmake_targets/autotests/v2/main.py
Normal file
@@ -0,0 +1,705 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os, re, sys, time, threading, thread
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from utils import test_in_list, quickshell, log
|
||||
from task import Task, WAITLOG_SUCCESS, WAITLOG_FAILURE
|
||||
from machine_list import MachineList
|
||||
|
||||
oai_user = os.environ.get('OAI_USER')
|
||||
oai_password = os.environ.get('OAI_PASS')
|
||||
requested_tests = os.environ.get('OAI_TEST_CASE_GROUP')
|
||||
machines = os.environ.get('MACHINELIST')
|
||||
generic_machines = os.environ.get('MACHINELISTGENERIC')
|
||||
result_dir = os.environ.get('RESULT_DIR')
|
||||
nruns_softmodem = os.environ.get('NRUNS_LTE_SOFTMODEM')
|
||||
openair_dir = os.environ.get('OPENAIR_DIR')
|
||||
|
||||
some_undef = False
|
||||
if (oai_user == None) :
|
||||
log("variable OAI_USER is not defined")
|
||||
some_undef = True
|
||||
if (oai_password == None) :
|
||||
log("variable OAI_PASS is not defined")
|
||||
some_undef = True
|
||||
if (requested_tests == None) :
|
||||
log("variable OAI_TEST_CASE_GROUP is not defined")
|
||||
some_undef = True
|
||||
if (machines == None) :
|
||||
log("variable MACHINELIST is not defined")
|
||||
some_undef = True
|
||||
if (generic_machines == None) :
|
||||
log("variable MACHINELISTGENERIC is not defined")
|
||||
some_undef = True
|
||||
if (result_dir == None) :
|
||||
log("variable RESULT_DIR is not defined")
|
||||
some_undef = True
|
||||
if (nruns_softmodem == None) :
|
||||
log("variable NRUNS_LTE_SOFTMODEM is not defined")
|
||||
some_undef = True
|
||||
if (openair_dir == None) :
|
||||
log("variable OPENAIR_DIR is not defined")
|
||||
some_undef = True
|
||||
if (some_undef == True):
|
||||
os._exit(1)
|
||||
|
||||
requested_tests = requested_tests .replace('"','')
|
||||
machines = machines .replace('"','')
|
||||
generic_machines = generic_machines .replace('"','')
|
||||
|
||||
xml_test_file = os.environ.get('OPENAIR_DIR') + \
|
||||
"/cmake_targets/autotests/test_case_list.xml"
|
||||
|
||||
xmlTree = ET.parse(xml_test_file)
|
||||
xmlRoot = xmlTree.getroot()
|
||||
|
||||
exclusion_tests=xmlRoot.findtext('TestCaseExclusionList',default='')
|
||||
all_tests=xmlRoot.findall('testCase')
|
||||
|
||||
exclusion_tests=exclusion_tests.split()
|
||||
requested_tests=requested_tests.split()
|
||||
|
||||
#check that exclusion tests are well formatted
|
||||
#(6 digits or less than 6 digits followed by +)
|
||||
for test in exclusion_tests:
|
||||
if (not re.match('^[0-9]{6}$', test) and
|
||||
not re.match('^[0-9]{1,5}\+$', test)):
|
||||
log("ERROR: exclusion test is invalidly formatted: " + test)
|
||||
os._exit(1)
|
||||
|
||||
#check that requested tests are well formatted
|
||||
#(6 digits or less than 6 digits followed by +)
|
||||
#be verbose
|
||||
for test in requested_tests:
|
||||
if (re.match('^[0-9]{6}$', test) or
|
||||
re.match('^[0-9]{1,5}\+$', test)):
|
||||
log("INFO: test group/case requested: " + test)
|
||||
else:
|
||||
log("ERROR: requested test is invalidly formatted: " + test)
|
||||
os._exit(1)
|
||||
|
||||
#get the list of tests to be done
|
||||
todo_tests=[]
|
||||
for test in all_tests:
|
||||
if (test_in_list(test.get('id'), requested_tests) and
|
||||
not test_in_list(test.get('id'), exclusion_tests)):
|
||||
log("INFO: test will be run: " + test.get('id'))
|
||||
todo_tests.append(test)
|
||||
else:
|
||||
log("INFO: test will be skipped: " + test.get('id'))
|
||||
|
||||
#get commit ID to use
|
||||
commit_id = quickshell("git rev-parse --verify HEAD").replace('\n','')
|
||||
if (len(commit_id) != 20*2):
|
||||
log("ERROR: bad commit '" + commit_id + "'")
|
||||
log("INFO: test for commit " + commit_id)
|
||||
|
||||
#get repository URL
|
||||
repository_url = quickshell("git config remote.origin.url").replace('\n','')
|
||||
log("INFO: repository URL: " + repository_url)
|
||||
|
||||
#prepare environment for tasks
|
||||
env = []
|
||||
env.append("REPOSITORY_URL=" + repository_url)
|
||||
env.append("COMMIT_ID=" + commit_id)
|
||||
|
||||
#clone repository on all machines in the test setup
|
||||
tasks=[]
|
||||
for machine in machines.split():
|
||||
tasks.append(Task("actions/clone_repository.bash",
|
||||
"clone repository on " + machine,
|
||||
machine,
|
||||
oai_user,
|
||||
oai_password,
|
||||
env,
|
||||
openair_dir + "/cmake_targets/autotests/log/clone." \
|
||||
+ machine))
|
||||
for task in tasks:
|
||||
log("INFO: wait for task: " + task.description)
|
||||
ret = task.wait()
|
||||
if ret != 0 or not "TEST_SETUP_SUCCESS" in open(task.logfile).read():
|
||||
log("ERROR: task failed: " + task.description)
|
||||
os._exit(1)
|
||||
|
||||
##############################################################################
|
||||
# run compilation tests #
|
||||
##############################################################################
|
||||
|
||||
machine_list = MachineList(generic_machines.split())
|
||||
|
||||
for test in todo_tests:
|
||||
action = test.findtext('class')
|
||||
if action != 'compilation':
|
||||
continue
|
||||
id = test.get('id')
|
||||
machine = machine_list.get_free_machine()
|
||||
log("INFO: start " + action + " test " + id + " on machine " +
|
||||
machine.name)
|
||||
tasks = []
|
||||
runenv = list(env)
|
||||
runenv.append('OPENAIR_DIR=/tmp/oai_test_setup/oai')
|
||||
runenv.append('BUILD_ARGUMENTS="'
|
||||
+ test.findtext('compile_prog_args')
|
||||
+ '"')
|
||||
runenv.append('BUILD_OUTPUT="'
|
||||
+ test.findtext('compile_prog_out')
|
||||
.replace('\n','')
|
||||
+ '"')
|
||||
logdir = openair_dir +"/cmake_targets/autotests/log/"+ id +"/compile_log"
|
||||
remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'"
|
||||
post_action = "mkdir -p "+ logdir + \
|
||||
" && sshpass -p " + oai_password + " scp -r " + oai_user + \
|
||||
"@" + machine.name + ":" + remote_files + " " + logdir + \
|
||||
" || true"
|
||||
tasks.append(Task("actions/" + action + ".bash",
|
||||
action + " of test " + id + " on " + machine.name,
|
||||
machine.name,
|
||||
oai_user,
|
||||
oai_password,
|
||||
runenv,
|
||||
openair_dir + "/cmake_targets/autotests/log/"
|
||||
+ id + "."
|
||||
+ machine.name,
|
||||
post_action=post_action))
|
||||
machine.busy(tasks)
|
||||
|
||||
##############################################################################
|
||||
# run execution tests #
|
||||
##############################################################################
|
||||
|
||||
class ExecutionThread(threading.Thread):
|
||||
def __init__(self, id, machine, test):
|
||||
threading.Thread.__init__(self)
|
||||
self.machine = machine
|
||||
self.id = id
|
||||
self.test = test
|
||||
|
||||
def run(self):
|
||||
id = self.id
|
||||
machine = self.machine
|
||||
test = self.test
|
||||
|
||||
# step 1: compile
|
||||
|
||||
log("INFO: start compilation of test " + id + " on machine " +
|
||||
machine.name)
|
||||
tasks = []
|
||||
runenv = list(env)
|
||||
runenv.append('OPENAIR_DIR=/tmp/oai_test_setup/oai')
|
||||
runenv.append('PRE_BUILD="'
|
||||
+ test.findtext('pre_compile_prog')
|
||||
+ '"')
|
||||
runenv.append('BUILD_PROG="'
|
||||
+ test.findtext('compile_prog')
|
||||
+ '"')
|
||||
runenv.append('BUILD_ARGUMENTS="'
|
||||
+ test.findtext('compile_prog_args')
|
||||
+ '"')
|
||||
runenv.append('PRE_EXEC="'
|
||||
+ test.findtext('pre_exec') + " "
|
||||
+ test.findtext('pre_exec_args')
|
||||
+ '"')
|
||||
logdir = openair_dir +"/cmake_targets/autotests/log/"+ id + \
|
||||
"/compile_log"
|
||||
remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'"
|
||||
post_action = "mkdir -p "+ logdir + \
|
||||
" && sshpass -p " + oai_password + \
|
||||
" scp -r " + oai_user + "@" + machine.name + ":" + \
|
||||
remote_files + " " + logdir + \
|
||||
" || true"
|
||||
task = Task("actions/execution_compile.bash",
|
||||
"compilation of test " + id + " on " + machine.name,
|
||||
machine.name,
|
||||
oai_user,
|
||||
oai_password,
|
||||
runenv,
|
||||
openair_dir + "/cmake_targets/autotests/log/"
|
||||
+ id + "_compile."
|
||||
+ machine.name,
|
||||
post_action=post_action)
|
||||
ret = task.wait()
|
||||
task.postaction()
|
||||
if ret != 0:
|
||||
log("ERROR: compilation of test " + id + " failed: " + str(ret))
|
||||
machine.unbusy()
|
||||
return
|
||||
|
||||
#step 2: run all tests
|
||||
|
||||
nruns = test.findtext('nruns')
|
||||
args = test.findtext('main_exec_args')
|
||||
i = 0
|
||||
for arg in args.splitlines():
|
||||
i = i+1
|
||||
runenv2 = list(runenv)
|
||||
runenv2.append('OPENAIR_TARGETS=/tmp/oai_test_setup/oai/targets')
|
||||
runenv2.append('EXEC="'
|
||||
+ test.findtext('main_exec')
|
||||
+ '"')
|
||||
runenv2.append('EXEC_ARGS="' + arg + '"')
|
||||
for run in range(int(nruns)):
|
||||
log("INFO: start execution of test " + id + " case " +
|
||||
str(i) + " run " + str(run) + " on machine " +
|
||||
machine.name)
|
||||
task =Task("actions/execution.bash",
|
||||
"execution of test " + id + " on " + machine.name,
|
||||
machine.name,
|
||||
oai_user,
|
||||
oai_password,
|
||||
runenv2,
|
||||
openair_dir + "/cmake_targets/autotests/log/"
|
||||
+ id + "_case_" + str(i) + "_run_" + str(run)
|
||||
+ "." + machine.name)
|
||||
ret = task.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: execution of test " +id+ " failed: " +
|
||||
str(ret))
|
||||
|
||||
machine.unbusy()
|
||||
|
||||
for test in todo_tests:
|
||||
action = test.findtext('class')
|
||||
if action != 'execution':
|
||||
continue
|
||||
id = test.get('id')
|
||||
machine = machine_list.get_free_machine()
|
||||
ExecutionThread(id, machine, test).start()
|
||||
|
||||
#wait for compilation/execution tests to be finished
|
||||
#log only if some compilation/execution tests are actually done
|
||||
for test in todo_tests:
|
||||
action = test.findtext('class')
|
||||
if action == 'execution' or action == 'compilation':
|
||||
log("INFO: requested compilation/execution tests " +
|
||||
"have been launched, waiting for completion")
|
||||
break
|
||||
machine_list.wait_all_free()
|
||||
|
||||
##############################################################################
|
||||
# run eNB softmodem tests #
|
||||
##############################################################################
|
||||
|
||||
tests = {}
|
||||
for a in { 'b210', 'remote b210', 'x310', 'exmimo2' }:
|
||||
tests[a] = {}
|
||||
for b in { 'alu', 'openair-cn' }:
|
||||
tests[a][b] = {}
|
||||
for c in { 'fdd', 'tdd' }:
|
||||
tests[a][b][c] = {}
|
||||
for d in { '5', '10', '20' }:
|
||||
tests[a][b][c][d] = {}
|
||||
for e in { 'bandrich', 'sony', '3276' }:
|
||||
tests[a][b][c][d][e] = {}
|
||||
for f in { 'tcp', 'udp' }:
|
||||
tests[a][b][c][d][e][f] = {}
|
||||
for g in { 'dl', 'ul' }:
|
||||
tests[a][b][c][d][e][f][g] = False
|
||||
|
||||
todo_tests_ids = []
|
||||
for test in todo_tests:
|
||||
todo_tests_ids.append(test.get('id'))
|
||||
|
||||
for test in todo_tests_ids:
|
||||
if test=='015500':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['ul']=True
|
||||
if test=='015501':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['ul']=True
|
||||
if test=='015502':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['ul']=True
|
||||
if test=='015503':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['dl']=True
|
||||
if test=='015504':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['dl']=True
|
||||
if test=='015505':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['dl']=True
|
||||
if test=='015506':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015507':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015508':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015509':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015510':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015511':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015512':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['ul']=True
|
||||
if test=='015513':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['ul']=True
|
||||
if test=='015514':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['ul']=True
|
||||
if test=='015515':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['dl']=True
|
||||
if test=='015516':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['dl']=True
|
||||
if test=='015517':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['dl']=True
|
||||
if test=='015518':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015519':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015520':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015521':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015522':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015523':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='015600':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015601':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015602':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015603':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015604':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015605':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='015700':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015701':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015702':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015703':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015704':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015705':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='015800':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015801':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015802':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015803':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015804':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015805':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015806':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015807':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015808':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015809':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015810':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015811':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015812':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015813':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015814':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015815':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015816':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015817':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015818':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015819':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015820':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015821':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015822':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='015823':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='016000':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016001':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016002':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016003':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016004':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016005':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='016100':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016101':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016102':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016103':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016104':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016105':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='016300':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016301':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016302':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016303':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016304':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016305':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='016500':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016501':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016502':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016503':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016504':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='016505':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='017000':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017001':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017002':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017003':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017004':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017005':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='017500':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017501':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017502':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017503':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017504':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='017505':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='017600':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['udp']['ul']=True
|
||||
if test=='017601':tests['remote b210']['alu']['fdd']['10']['bandrich']['udp']['ul']=True
|
||||
if test=='017602':tests['remote b210']['alu']['fdd']['20']['bandrich']['udp']['ul']=True
|
||||
if test=='017603':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['udp']['dl']=True
|
||||
if test=='017604':tests['remote b210']['alu']['fdd']['10']['bandrich']['udp']['dl']=True
|
||||
if test=='017605':tests['remote b210']['alu']['fdd']['20']['bandrich']['udp']['dl']=True
|
||||
if test=='017606':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['tcp']['ul']=True
|
||||
if test=='017607':tests['remote b210']['alu']['fdd']['10']['bandrich']['tcp']['ul']=True
|
||||
if test=='017608':tests['remote b210']['alu']['fdd']['20']['bandrich']['tcp']['ul']=True
|
||||
if test=='017609':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['tcp']['dl']=True
|
||||
if test=='017610':tests['remote b210']['alu']['fdd']['10']['bandrich']['tcp']['dl']=True
|
||||
if test=='017611':tests['remote b210']['alu']['fdd']['20']['bandrich']['tcp']['dl']=True
|
||||
|
||||
if test=='018000':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018001':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018002':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018003':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018004':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018005':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='018500':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018501':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018502':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018503':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018504':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018505':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='018600':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['ul']=True
|
||||
if test=='018601':tests['b210']['alu']['tdd']['10']['3276']['udp']['ul']=True
|
||||
if test=='018602':tests['b210']['alu']['tdd']['20']['3276']['udp']['ul']=True
|
||||
if test=='018603':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['dl']=True
|
||||
if test=='018604':tests['b210']['alu']['tdd']['10']['3276']['udp']['dl']=True
|
||||
if test=='018605':tests['b210']['alu']['tdd']['20']['3276']['udp']['dl']=True
|
||||
if test=='018606':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018607':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018608':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018609':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018610':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018611':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018612':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['ul']=True
|
||||
if test=='018613':tests['b210']['alu']['tdd']['10']['3276']['tcp']['ul']=True
|
||||
if test=='018614':tests['b210']['alu']['tdd']['20']['3276']['tcp']['ul']=True
|
||||
if test=='018615':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['dl']=True
|
||||
if test=='018616':tests['b210']['alu']['tdd']['10']['3276']['tcp']['dl']=True
|
||||
if test=='018617':tests['b210']['alu']['tdd']['20']['3276']['tcp']['dl']=True
|
||||
if test=='018618':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018619':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018620':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018621':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018622':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='018623':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='025500':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025501':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025502':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025503':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025504':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025505':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025506':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025507':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025508':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025509':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025510':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025511':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025512':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025513':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025514':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025515':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025516':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025517':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025518':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025519':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025520':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025521':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025522':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025523':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
if test=='025700':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025701':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025702':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025703':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025704':log('WARNING: skip test ' + test) #TODO
|
||||
if test=='025705':log('WARNING: skip test ' + test) #TODO
|
||||
|
||||
from alu_test import run_b210_alu
|
||||
|
||||
#B210 ALU tests
|
||||
|
||||
run_b210_alu(tests, openair_dir, oai_user, oai_password, env)
|
||||
|
||||
#for test in todo_tests:
|
||||
# action = test.findtext('class')
|
||||
# if action != 'lte-softmodem':
|
||||
# continue
|
||||
# if not "start_ltebox" in test.findtext('EPC_main_exec'):
|
||||
# continue
|
||||
# id = test.get('id')
|
||||
# log("INFO: Running ALU test " + id)
|
||||
# logdir = openair_dir + "/cmake_targets/autotests/log/" + id
|
||||
# quickshell("mkdir -p " + logdir)
|
||||
# epc_machine = test.findtext('EPC')
|
||||
# enb_machine = test.findtext('eNB')
|
||||
# ue_machine = test.findtext('UE')
|
||||
#
|
||||
# #event object used to wait for several tasks at once
|
||||
# event = threading.Event()
|
||||
#
|
||||
# #launch HSS, wait for prompt
|
||||
# log("INFO: " + id + ": run HSS")
|
||||
# task_hss = Task("actions/alu_hss.bash",
|
||||
# "ALU HSS",
|
||||
# epc_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/alu_hss." + epc_machine, event=event)
|
||||
# task_hss.waitlog('S6AS_SIM-> ')
|
||||
#
|
||||
# #then launch EPC, wait for connection on HSS side
|
||||
# log("INFO: " + id + ": run EPC")
|
||||
# task = Task("actions/alu_epc.bash",
|
||||
# "ALU EPC",
|
||||
# epc_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/alu_epc." + epc_machine)
|
||||
# ret = task.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: EPC start failure");
|
||||
# os._exit(1)
|
||||
# task_hss.waitlog('Connected\n')
|
||||
#
|
||||
# #compile softmodem
|
||||
# log("INFO: " + id + ": compile softmodem")
|
||||
# envcomp = list(env)
|
||||
# envcomp.append('BUILD_ARGUMENTS="' +
|
||||
# test.findtext('eNB_compile_prog_args') + '"')
|
||||
# #we don't care about BUILD_OUTPUT but it's required (TODO: change that)
|
||||
# envcomp.append('BUILD_OUTPUT=/')
|
||||
# task = Task("actions/compilation.bash",
|
||||
# "compile softmodem",
|
||||
# enb_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# envcomp,
|
||||
# logdir + "/compile_softmodem." + enb_machine)
|
||||
# ret = task.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: softmodem compilation failure");
|
||||
# os._exit(1)
|
||||
#
|
||||
## #copy wanted configuration file
|
||||
## quickshell("sshpass -p " + oai_password +
|
||||
## " scp config/enb.band7.tm1.usrpb210.conf " +
|
||||
## oai_user + "@" + enb_machine + ":/tmp/enb.conf")
|
||||
#
|
||||
# #run softmodem
|
||||
# log("INFO: " + id + ": run softmodem")
|
||||
# task_enb = Task("actions/run_enb.bash",
|
||||
# "run softmodem",
|
||||
# enb_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/run_softmodem." + enb_machine, event=event)
|
||||
# task_enb.waitlog('got sync')
|
||||
#
|
||||
# #start UE
|
||||
# log("INFO: " + id + ": start bandrich UE")
|
||||
# task_ue = Task("actions/start_bandrich.bash",
|
||||
# "start bandrich UE",
|
||||
# ue_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/start_bandrich." + ue_machine, event=event)
|
||||
# task_ue.waitlog("local IP address", event=event)
|
||||
#
|
||||
# event.wait()
|
||||
#
|
||||
# #at this point one task has died or we have the line in the log
|
||||
# if task_ue.waitlog_state != WAITLOG_SUCCESS:
|
||||
# log("ERROR: " + id + ": bandrich UE did not connect")
|
||||
# os._exit(1)
|
||||
#
|
||||
# event.clear()
|
||||
#
|
||||
# if ( not task_enb.alive() or
|
||||
# not task_hss.alive() or
|
||||
# not task_ue.alive()):
|
||||
# log("ERROR: " + id + ": eNB or UE tasks died")
|
||||
# os._exit(1)
|
||||
#
|
||||
# #get bandrich UE IP
|
||||
# l = open(task_ue.logfile, "r").read()
|
||||
# ue_ip = re.search("local IP address (.*)\n", l).groups()[0]
|
||||
# log("INFO: " + id + ": bandrich UE IP address: " + ue_ip)
|
||||
#
|
||||
# #run traffic
|
||||
# log("INFO: " + id + ": run downlink TCP traffic")
|
||||
#
|
||||
# log("INFO: " + id + ": launch server")
|
||||
# task_traffic_ue = Task("actions/downlink_bandrich.bash",
|
||||
# "start iperf on bandrich UE as server",
|
||||
# ue_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/downlink_bandrich." + ue_machine,
|
||||
# event=event)
|
||||
# task_traffic_ue.waitlog("Server listening on TCP port 5001")
|
||||
#
|
||||
# log("INFO: " + id + ": launch client")
|
||||
# envepc = list(env)
|
||||
# envepc.append("UE_IP=" + ue_ip)
|
||||
# task = Task("actions/downlink_epc.bash",
|
||||
# "start iperf on EPC as client",
|
||||
# epc_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# envepc,
|
||||
# logdir + "/downlink_epc." + epc_machine, event=event)
|
||||
# log("INFO: " + id + ": wait for client (or some error)")
|
||||
#
|
||||
# event.wait()
|
||||
# log("DEBUG: event.wait() done")
|
||||
#
|
||||
# if ( not task_enb.alive() or
|
||||
# not task_hss.alive() or
|
||||
# not task_ue.alive()):
|
||||
# log("ERROR: unexpected task exited, test failed, kill all")
|
||||
# if task.alive():
|
||||
# task.kill()
|
||||
# if task_enb.alive():
|
||||
# task_enb.kill()
|
||||
# if task_ue.alive():
|
||||
# task_ue.kill()
|
||||
#
|
||||
# ret = task.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: " + id + ": downlink traffic failed")
|
||||
# #not sure if we have to quit here or not
|
||||
# #os._exit(1)
|
||||
#
|
||||
# #stop downlink server
|
||||
# log("INFO: " + id + ": stop server (kill ssh connection)")
|
||||
# task_traffic_ue.kill()
|
||||
# log("INFO: " + id + ": wait for server to quit")
|
||||
# task_traffic_ue.wait()
|
||||
#
|
||||
# #stop UE
|
||||
# log("INFO: " + id + ": stop bandrich UE")
|
||||
# task_ue.sendnow("%c" % 3)
|
||||
# ret = task_ue.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: " + id + ": task bandrich UE failed")
|
||||
# #not sure if we have to quit here or not
|
||||
# #os._exit(1)
|
||||
#
|
||||
# #stop softmodem
|
||||
# log("INFO: " + id + ": stop softmodem")
|
||||
# task_enb.sendnow("%c" % 3)
|
||||
# ret = task_enb.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: " + id + ": softmodem failed")
|
||||
# #not sure if we have to quit here or not
|
||||
# #os._exit(1)
|
||||
#
|
||||
# #stop EPC, wait for disconnection on HSS side
|
||||
# log("INFO: " + id + ": stop EPC")
|
||||
# task = Task("actions/alu_epc_stop.bash",
|
||||
# "ALU EPC stop",
|
||||
# epc_machine,
|
||||
# oai_user,
|
||||
# oai_password,
|
||||
# env,
|
||||
# logdir + "/alu_epc_stop." + epc_machine)
|
||||
# ret = task.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: " + id + ": ALU EPC stop failed")
|
||||
# os._exit(1)
|
||||
# task_hss.waitlog('Disconnected\n')
|
||||
#
|
||||
# log("INFO: " + id + ": stop HSS")
|
||||
# task_hss.sendnow("exit\n")
|
||||
# ret = task_hss.wait()
|
||||
# if ret != 0:
|
||||
# log("ERROR: " + id + ": ALU HSS failed")
|
||||
# os._exit(1)
|
||||
|
||||
import utils
|
||||
log(utils.GREEN + "GOODBYE" + utils.RESET)
|
||||
#os._exit(0)
|
||||
|
||||
#run lte softmodem tests
|
||||
370
cmake_targets/autotests/v2/task.py
Normal file
370
cmake_targets/autotests/v2/task.py
Normal file
@@ -0,0 +1,370 @@
|
||||
import os, time, threading, sys, os, errno, select
|
||||
from connection import connection
|
||||
|
||||
import utils
|
||||
from utils import log
|
||||
|
||||
#this class is to communicate between reader and sender threads
|
||||
#the reader increments a count each time it receives the prompt
|
||||
#and wakes up the sender
|
||||
#it also indicates when it exits so the sender can exit too
|
||||
#the sender (calling get) waits for the count to be greated than passed
|
||||
#argument or if reader exited
|
||||
#it returns argument+1 if things okay, -1 if reader exited
|
||||
class Counter:
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.cond = threading.Condition()
|
||||
|
||||
def inc(self):
|
||||
self.cond.acquire()
|
||||
self.count = self.count + 1
|
||||
self.cond.notify()
|
||||
self.cond.release()
|
||||
|
||||
def set(self, value):
|
||||
self.cond.acquire()
|
||||
self.count = value
|
||||
self.cond.notify()
|
||||
self.cond.release()
|
||||
|
||||
def get(self, current):
|
||||
self.cond.acquire()
|
||||
while True:
|
||||
if self.count == -1:
|
||||
ret = -1
|
||||
break
|
||||
if self.count >= current + 1:
|
||||
ret = current + 1
|
||||
break
|
||||
self.cond.wait()
|
||||
self.cond.release()
|
||||
return ret
|
||||
|
||||
#this class is used for the main application to wait for some specific
|
||||
#output from the remote program (typically the ALU HSS prompt, indicating
|
||||
#it is ready and we can proceed further)
|
||||
#(too much classes...)
|
||||
class ProducerConsumer:
|
||||
def __init__(self):
|
||||
self.count = 0
|
||||
self.cond = threading.Condition()
|
||||
|
||||
def add(self, v):
|
||||
self.cond.acquire()
|
||||
self.count = self.count + v
|
||||
self.cond.notify()
|
||||
self.cond.release()
|
||||
|
||||
def set(self, v):
|
||||
self.cond.acquire()
|
||||
self.count = v
|
||||
self.cond.notify()
|
||||
self.cond.release()
|
||||
|
||||
def get(self, old):
|
||||
self.cond.acquire()
|
||||
while True:
|
||||
if self.count == -1:
|
||||
ret = -1
|
||||
break
|
||||
if self.count > old:
|
||||
ret = self.count
|
||||
break
|
||||
self.cond.wait()
|
||||
self.cond.release()
|
||||
return ret
|
||||
|
||||
#this thread gets input from the child process of the task
|
||||
#it removes the prompts it gets (be carefully to use a prompt
|
||||
#that will not be output of any command otherwise you dead)
|
||||
class ReaderThread(threading.Thread):
|
||||
def __init__(self, fdin, logfile, prompt, prompt_counter, producer):
|
||||
threading.Thread.__init__(self)
|
||||
self.fdin = fdin
|
||||
self.logfile = logfile
|
||||
self.prompt_counter = prompt_counter
|
||||
self.prompt = prompt
|
||||
self.promptsize = len(prompt)
|
||||
self.stack = ""
|
||||
self.stacksize = 0
|
||||
self.producer = producer
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
outfile = open(self.logfile, "w")
|
||||
except BaseException, e:
|
||||
log("ERROR: ReaderThread: " + self.logfile + ": " + str(e))
|
||||
os._exit(1)
|
||||
while True:
|
||||
try:
|
||||
(a, b, c) = select.select([ self.fdin ], [], [ self.fdin ])
|
||||
except BaseException, e:
|
||||
log("ERROR: ReaderThread: " + self.logfile +
|
||||
": select failed: " + str(e))
|
||||
os._exit(1)
|
||||
try:
|
||||
z = os.read(self.fdin, 1024)
|
||||
except OSError, e:
|
||||
if e.errno == errno.EIO:
|
||||
#pipe has died, quit the thread
|
||||
break
|
||||
else:
|
||||
log("ERROR: ReaderThread: " + self.logfile +
|
||||
": unhandled error: " + str(e))
|
||||
except BaseException, e:
|
||||
log("ERROR: ReaderThread: " + self.logfile +
|
||||
": unhandled error: " + str(e))
|
||||
break
|
||||
try:
|
||||
produced = 0
|
||||
#this part is to remove the prompt
|
||||
for x in z:
|
||||
if x == self.prompt[self.stacksize]:
|
||||
self.stack = self.stack + x
|
||||
self.stacksize = self.stacksize + 1
|
||||
if self.stacksize == self.promptsize:
|
||||
self.prompt_counter.inc()
|
||||
self.stack = ""
|
||||
self.stacksize = 0
|
||||
else:
|
||||
outfile.write(self.stack)
|
||||
outfile.write(x)
|
||||
produced = produced + len(self.stack) + len(x)
|
||||
self.stack = ""
|
||||
self.stacksize = 0
|
||||
outfile.flush()
|
||||
self.producer.add(produced)
|
||||
except BaseException, e:
|
||||
log("ERROR: ReaderThread: " + self.logfile + ": " + str(e))
|
||||
os._exit(1)
|
||||
try:
|
||||
outfile.close()
|
||||
except BaseException, e:
|
||||
log("ERROR: ReaderThread: " + self.logfile + ": " + str(e))
|
||||
os._exit(1)
|
||||
#close the pipe, don't care about errors
|
||||
try:
|
||||
os.close(self.fdin)
|
||||
except:
|
||||
pass
|
||||
#signal sender to quit
|
||||
self.prompt_counter.set(-1)
|
||||
self.producer.set(-1)
|
||||
|
||||
class SenderQuit(Exception):
|
||||
pass
|
||||
|
||||
#this thread sends commands to the child process of the task
|
||||
#it waits for the prompt between each command
|
||||
#'event' is used for the main thread to wait for one of several tasks
|
||||
#to quit, meaning error or end-of-test
|
||||
class SenderThread(threading.Thread):
|
||||
def __init__(self, fdout, prompt_counter, connection, env, action,
|
||||
description, prompt, event=None):
|
||||
threading.Thread.__init__(self)
|
||||
self.fdin = fdout
|
||||
self.prompt_counter = prompt_counter
|
||||
self.connection = connection
|
||||
self.env = env
|
||||
self.action = action
|
||||
self.description = description
|
||||
self.prompt = prompt
|
||||
self.count = 0
|
||||
self.event = event
|
||||
self.alive = True
|
||||
|
||||
def wait_prompt(self):
|
||||
self.count = self.prompt_counter.get(self.count)
|
||||
if self.count == -1:
|
||||
raise SenderQuit()
|
||||
|
||||
def _run(self):
|
||||
self.connection.send('export PS1=' + self.prompt + '\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send('set +o emacs\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send('echo\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send('echo\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send("echo -e '" + utils.GREEN +
|
||||
'---------------------------------------------'
|
||||
+ utils.RESET + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send('echo\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send("echo -n -e '" + utils.YELLOW +
|
||||
"COMMANDS START: " +
|
||||
utils.RESET + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send('date\n')
|
||||
self.wait_prompt()
|
||||
|
||||
for l in self.env:
|
||||
self.connection.send('export ' + l + '\n')
|
||||
self.wait_prompt()
|
||||
|
||||
with open(self.action) as f:
|
||||
for line in f:
|
||||
self.connection.send("echo -n -e '" + utils.GREEN +
|
||||
"RUNNING: " + utils.RESET + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send("echo '" +
|
||||
line.replace('\n','')
|
||||
.replace("'", "'\\''") + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send(line)
|
||||
self.wait_prompt()
|
||||
self.connection.send("if [ $? != 0 ]; then " +
|
||||
"echo -e '" + utils.RED +
|
||||
"TEST_SETUP_ERROR: " + utils.RESET +
|
||||
"last command failed, exiting'; " +
|
||||
"date; exit 1; fi\n")
|
||||
self.wait_prompt()
|
||||
|
||||
self.connection.send("echo -n -e '" + utils.YELLOW +
|
||||
"COMMANDS DONE: " +
|
||||
utils.RESET + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send('date\n')
|
||||
self.wait_prompt()
|
||||
self.connection.send("echo -e '" + utils.GREEN +
|
||||
"TEST_SETUP_SUCCESS" + utils.RESET + "'\n")
|
||||
self.wait_prompt()
|
||||
self.connection.send('exit\n')
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
self._run()
|
||||
except SenderQuit:
|
||||
log("WARNING: '" + self.description + "' exits too early?")
|
||||
pass
|
||||
except BaseException, e:
|
||||
log("ERROR: task failed: " + str(e))
|
||||
log("ERROR: action is: " + self.action)
|
||||
log("ERROR: description is: " + self.description)
|
||||
os._exit(1)
|
||||
|
||||
self.alive = False
|
||||
|
||||
if self.event != None:
|
||||
self.event.set()
|
||||
|
||||
WAITLOG_RUNNING = 0
|
||||
WAITLOG_SUCCESS = 1
|
||||
WAITLOG_FAILURE = 2
|
||||
|
||||
class WaitlogFailed(Exception):
|
||||
pass
|
||||
|
||||
#'event' is used by main thread to wait for any of several threads to quit.
|
||||
#'Task' passes it the 'SenderThread' above, which sets it when it finishes.
|
||||
class Task:
|
||||
def __init__(self, action, description, machine, user, password, env,
|
||||
logfile, post_action = None, event=None):
|
||||
self.action = action
|
||||
self.description = description
|
||||
self.machine = machine
|
||||
self.user = user
|
||||
self.password = password
|
||||
self.post_action = post_action
|
||||
self.producer = ProducerConsumer()
|
||||
self.logfile = logfile
|
||||
|
||||
prompt = "__OAI_TEST_SETUP_PROMPT__:"
|
||||
prompt_counter = Counter()
|
||||
|
||||
self.connection = connection(description, machine, user, password)
|
||||
|
||||
self.reader = ReaderThread(self.connection.fd, logfile, prompt,
|
||||
prompt_counter, self.producer)
|
||||
self.reader.start()
|
||||
|
||||
self.sender = SenderThread(self.connection.fd, prompt_counter,
|
||||
self.connection, env, action, description,
|
||||
prompt, event)
|
||||
self.sender.start()
|
||||
|
||||
def wait(self, timeout=-1):
|
||||
if self.connection.active == False:
|
||||
return self.connection.retcode
|
||||
try:
|
||||
(pid, ret) = os.waitpid(self.connection.pid, 0)
|
||||
except KeyboardInterrupt, e:
|
||||
log("ERROR: ctrl+c catched! " + str(e))
|
||||
os._exit(1)
|
||||
except BaseException, e:
|
||||
log("ERROR: " + str(e))
|
||||
os._exit(1)
|
||||
self.sender.join()
|
||||
self.reader.join()
|
||||
return ret
|
||||
|
||||
#this function should not be called, it is used internally by 'waitlog'
|
||||
#in mode 'background thread'
|
||||
#TODO: join() the thread at some point
|
||||
def _waitlog_thread(self, task, s):
|
||||
consumed = 0
|
||||
while True:
|
||||
consumed = task.producer.get(consumed)
|
||||
if consumed == -1:
|
||||
log("ERROR: string '" + s + "' not found in logfile " +
|
||||
task.logfile)
|
||||
task.waitlog_state = WAITLOG_FAILURE
|
||||
task.waitlog_event.set()
|
||||
return
|
||||
if s in open(task.logfile).read():
|
||||
task.waitlog_state = WAITLOG_SUCCESS
|
||||
task.waitlog_event.set()
|
||||
return
|
||||
|
||||
#two ways to wait for a string in the log file:
|
||||
# - blocking way
|
||||
# - background thread, using an Event to signal success/failure
|
||||
def waitlog(self, s, event=None):
|
||||
if event != None:
|
||||
self.waitlog_state = WAITLOG_RUNNING
|
||||
self.waitlog_event = event
|
||||
self.waitlog_thread = \
|
||||
threading.Thread(target=self._waitlog_thread,
|
||||
args=(self, s))
|
||||
self.waitlog_thread.start()
|
||||
return
|
||||
|
||||
#TODO: optimize, do not process all the file at each wakeup
|
||||
consumed = 0
|
||||
while True:
|
||||
consumed = self.producer.get(consumed)
|
||||
if consumed == -1:
|
||||
log("ERROR: string '" + s + "' not found in logfile " +
|
||||
self.logfile)
|
||||
raise WaitlogFailed()
|
||||
if s in open(self.logfile).read():
|
||||
return
|
||||
|
||||
def sendnow(self, x):
|
||||
self.connection.send(x)
|
||||
|
||||
def alive(self):
|
||||
return self.sender.alive
|
||||
|
||||
def kill(self):
|
||||
self.connection.kill()
|
||||
#put some error log in logfile, for verbosity
|
||||
try:
|
||||
f = open(self.logfile, "a+")
|
||||
f.write("\n\n" + utils.RED + "TEST_SETUP_ERROR: " + utils.RESET +
|
||||
"task killed by test setup\n\n");
|
||||
close(f)
|
||||
except BaseException, e:
|
||||
pass
|
||||
|
||||
def postaction(self):
|
||||
if self.post_action != None:
|
||||
out = utils.quickshell(self.post_action)
|
||||
if len(out):
|
||||
log("INFO: task '" + self.description +
|
||||
"' post_action '" + self.post_action + "' says: ")
|
||||
for l in out.splitlines():
|
||||
log("INFO: " + l)
|
||||
84
cmake_targets/autotests/v2/utils.py
Normal file
84
cmake_targets/autotests/v2/utils.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import subprocess, os, thread, sys, time
|
||||
|
||||
#logging facitiliy
|
||||
#TODO: simplify (a first version redefined stdout, then we replaced 'print'
|
||||
#instead, keeping stuff as is)
|
||||
class Logger:
|
||||
def __init__(self, stream):
|
||||
self.stream = stream
|
||||
self.start_of_line = True
|
||||
self.lock = thread.allocate_lock()
|
||||
openair_dir = os.environ.get('OPENAIR_DIR')
|
||||
if openair_dir == None:
|
||||
print "FATAL: no OPENAIR_DIR"
|
||||
os._exit(1)
|
||||
try:
|
||||
self.logfile = open(openair_dir +
|
||||
"/cmake_targets/autotests/log/python.stdout", "w")
|
||||
except BaseException, e:
|
||||
print "FATAL: cannot create log file"
|
||||
print e
|
||||
os._exit(1)
|
||||
def put(self, data):
|
||||
self.stream.write(data)
|
||||
self.logfile.write(data)
|
||||
def write(self, data):
|
||||
self.lock.acquire()
|
||||
for c in data:
|
||||
if self.start_of_line:
|
||||
self.start_of_line = False
|
||||
t = time.strftime("%H:%M:%S", time.localtime()) + ": "
|
||||
self.stream.write(t)
|
||||
self.logfile.write(t)
|
||||
self.put(c)
|
||||
if c == '\n':
|
||||
self.start_of_line = True
|
||||
self.stream.flush()
|
||||
self.logfile.flush()
|
||||
self.lock.release()
|
||||
logger = Logger(sys.stdout)
|
||||
def log(x):
|
||||
logger.write(x + "\n")
|
||||
|
||||
#check if given test is in list
|
||||
#it is in list if one of the strings in 'list' is at the beginning of 'test'
|
||||
def test_in_list(test, list):
|
||||
for check in list:
|
||||
check=check.replace('+','')
|
||||
if (test.startswith(check)):
|
||||
return True
|
||||
return False
|
||||
|
||||
#run a local command in a shell
|
||||
def quickshell(command):
|
||||
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT)
|
||||
(retout, reterr) = process.communicate()
|
||||
if (process.returncode != 0):
|
||||
log("ERROR: shell command failed: " + command)
|
||||
if len(retout):
|
||||
log("ERROR: command says: ")
|
||||
for l in retout.splitlines():
|
||||
log("ERROR: " + l)
|
||||
os._exit(1)
|
||||
return retout
|
||||
|
||||
RED="\x1b[31m"
|
||||
GREEN="\x1b[32m"
|
||||
YELLOW="\x1b[33m"
|
||||
RESET="\x1b[m"
|
||||
|
||||
#an exception raised when a test fails
|
||||
class TestFailed(Exception):
|
||||
pass
|
||||
|
||||
#this function returns True if a test in 'x' is set to True
|
||||
#to be used as: if do_tests(tests['b210']['alu']) ...
|
||||
def do_tests(x):
|
||||
if type(x) == list:
|
||||
for v in x:
|
||||
if do_tests(v): return True
|
||||
return False
|
||||
if type(x) == dict: return do_tests(x.values())
|
||||
if x == True: return True
|
||||
return False
|
||||
@@ -33,14 +33,22 @@ ORIGIN_PATH=$PWD
|
||||
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
|
||||
source $THIS_SCRIPT_PATH/tools/build_helper
|
||||
|
||||
# set environment variables (OPENAIR_HOME, ...)
|
||||
set_openair_env
|
||||
|
||||
#variables for UE data generation
|
||||
gen_nvram_path=$OPENAIR_DIR/targets/bin
|
||||
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
||||
|
||||
MSC_GEN="False"
|
||||
XFORMS="True"
|
||||
FLEXRAN_AGENT_SB_IF="True"
|
||||
PRINT_STATS="False"
|
||||
VCD_TIMING="False"
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
FORCE_DEADLINE_SCHEDULER_FLAG_USER=""
|
||||
CPU_AFFINITY_FLAG_USER="False" #Only valid when lowlatecy flag is set to False
|
||||
REL="Rel10"
|
||||
REL="Rel14"
|
||||
HW="None"
|
||||
TP="None"
|
||||
NOS1=0
|
||||
@@ -53,19 +61,25 @@ BUILD_DOXYGEN=0
|
||||
T_TRACER="False"
|
||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||
CMAKE_BUILD_TYPE=""
|
||||
CMAKE_CMD="$CMAKE"
|
||||
UE_AUTOTEST_TRACE="False"
|
||||
UE_DEBUG_TRACE="False"
|
||||
UE_TIMING_TRACE="False"
|
||||
DISABLE_LOG_X="False"
|
||||
BUILD_ECLIPSE=0
|
||||
trap handle_ctrl_c INT
|
||||
|
||||
function print_help() {
|
||||
echo_info '
|
||||
echo_info "
|
||||
This program installs OpenAirInterface Software
|
||||
You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14
|
||||
Options
|
||||
-h
|
||||
This help
|
||||
-c | --clean
|
||||
Erase all files to make a rebuild from start"
|
||||
Erase all files to make a rebuild from start
|
||||
-C | --clean-all
|
||||
Erase all files made by previous compilations, installations"
|
||||
Erase all files made by previous compilations, installations
|
||||
--clean-kernel
|
||||
Erase previously installed features in kernel: iptables, drivers, ...
|
||||
-I | --install-external-packages
|
||||
@@ -80,12 +94,19 @@ Options
|
||||
--eNB
|
||||
Makes the LTE softmodem
|
||||
--UE
|
||||
Makes the UE specific parts (ue_ip, usim, nvram)
|
||||
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
||||
--UE-conf-nvram [configuration file]
|
||||
Specify conf_nvram_path (default \"$conf_nvram_path\")
|
||||
--UE-gen-nvram [output path]
|
||||
Specify gen_nvram_path (default \"$gen_nvram_path\")
|
||||
--RRH
|
||||
Makes the RRH
|
||||
-a | --agent
|
||||
Enables agent for software-defined control of the eNB
|
||||
-r | --3gpp-release
|
||||
default is Rel10,
|
||||
default is Rel14,
|
||||
Rel8 limits the implementation to 3GPP Release 8 version
|
||||
Rel10 limits the implementation to 3GPP Release 10 version
|
||||
-w | --hardware
|
||||
EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, None (Default)
|
||||
Adds this RF board support (in external packages installation and in compilation)
|
||||
@@ -93,7 +114,7 @@ Options
|
||||
ETHERNET , None
|
||||
Adds this trasport protocol support in compilation
|
||||
--oaisim
|
||||
Makes the oaisim simulator. Hardware will be defaulted to "None".
|
||||
Makes the oaisim simulator. Hardware will be defaulted to \"None\".
|
||||
--phy_simulators
|
||||
Makes the unitary tests Layer 1 simulators
|
||||
--core_simulators
|
||||
@@ -127,6 +148,16 @@ Options
|
||||
Enables the T tracer.
|
||||
--disable-hardware-dependency
|
||||
Disable HW dependency during installation
|
||||
--ue-autotest-trace
|
||||
Enable specific traces for UE autotest framework
|
||||
--ue-trace
|
||||
Enable traces for UE debugging
|
||||
--ue-timing
|
||||
Enable traces for timing
|
||||
--disable-log
|
||||
Disable all LOG_* macros
|
||||
--build-eclipse
|
||||
Build eclipse project files. Paths are auto corrected by fixprj.sh
|
||||
Usage (first build):
|
||||
oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files
|
||||
Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files
|
||||
@@ -134,11 +165,12 @@ Usage (first build):
|
||||
Usage (Regular):
|
||||
oaisim : ./build_oai --oaisim -x
|
||||
Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x
|
||||
NI/ETTUS B201 + OAI ENB : ./build_oai --eNB -x -w USRP'
|
||||
NI/ETTUS B201 + OAI ENB : ./build_oai --eNB -x -w USRP"
|
||||
}
|
||||
|
||||
|
||||
function main() {
|
||||
|
||||
until [ -z "$1" ]
|
||||
do
|
||||
case "$1" in
|
||||
@@ -164,15 +196,26 @@ function main() {
|
||||
GDB=1
|
||||
CMAKE_BUILD_TYPE="Debug"
|
||||
echo_info "Will Compile with gdb symbols and disable compiler optimization"
|
||||
CMAKE_CMD="$CMAKE_CMD -DCMAKE_BUILD_TYPE=Debug"
|
||||
shift;;
|
||||
--eNB)
|
||||
eNB=1
|
||||
echo_info "Will compile eNB"
|
||||
shift;;
|
||||
-a | --agent)
|
||||
FLEXRAN_AGENT=1
|
||||
echo_info "Will compile eNB with agent support"
|
||||
shift;;
|
||||
--UE)
|
||||
UE=1
|
||||
echo_info "Will compile UE"
|
||||
shift;;
|
||||
--UE-conf-nvram)
|
||||
conf_nvram_path=$(readlink -f "$1")
|
||||
shift 2;;
|
||||
--UE-gen-nvram)
|
||||
gen_nvram_path=$(readlink -f $2)
|
||||
shift 2;;
|
||||
--RRH)
|
||||
RRH=1
|
||||
echo_info "Will compile RRH"
|
||||
@@ -278,6 +321,31 @@ function main() {
|
||||
echo_info "Disabling hardware dependency for compiling software"
|
||||
DISABLE_HARDWARE_DEPENDENCY="True"
|
||||
shift 1;;
|
||||
--ue-autotest-trace)
|
||||
UE_AUTOTEST_TRACE="True"
|
||||
echo_info "Enabling autotest specific trace for UE"
|
||||
shift 1;;
|
||||
--ue-trace)
|
||||
UE_DEBUG_TRACE="True"
|
||||
echo_info "Enabling UE trace for debug"
|
||||
shift 1;;
|
||||
--ue-timing)
|
||||
UE_TIMING_TRACE="True"
|
||||
echo_info "Enabling UE timing trace"
|
||||
shift 1;;
|
||||
--disable-log)
|
||||
DISABLE_LOG_X="True"
|
||||
echo_info "Disabling all LOG_* traces"
|
||||
shift 1;;
|
||||
--uhd-images-dir)
|
||||
UHD_IMAGES_DIR=$2
|
||||
echo_info "Downloading UHD images in the indicated location"
|
||||
shift 2;;
|
||||
--build-eclipse)
|
||||
BUILD_ECLIPSE=1
|
||||
CMAKE_CMD="$CMAKE_CMD"' -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -G"Eclipse CDT4 - Unix Makefiles"'
|
||||
echo_info "Enabling build eclipse project support"
|
||||
shift 1;;
|
||||
-h | --help)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -288,6 +356,9 @@ function main() {
|
||||
esac
|
||||
done
|
||||
|
||||
CMAKE_CMD="$CMAKE_CMD .."
|
||||
echo_info "CMAKE_CMD=$CMAKE_CMD"
|
||||
|
||||
#########################################################
|
||||
# check validity of HW and TP parameters for RRH and eNB
|
||||
#########################################################
|
||||
@@ -321,7 +392,7 @@ function main() {
|
||||
#By default: EXMIMO: enable
|
||||
if [ "$FORCE_DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then
|
||||
if [ "$HW" = "EXMIMO" ] ; then
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
DEADLINE_SCHEDULER_FLAG_USER="True"
|
||||
elif [ "$HW" = "ETHERNET" ] ; then
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
elif [ "$HW" = "OAI_USRP" ] ; then
|
||||
@@ -348,13 +419,16 @@ function main() {
|
||||
echo_info "Flags for Deadline scheduler: $DEADLINE_SCHEDULER_FLAG_USER"
|
||||
echo_info "Flags for CPU Affinity: $CPU_AFFINITY_FLAG_USER"
|
||||
|
||||
if [ -n "$UHD_IMAGES_DIR" ] && [ -z "$INSTALL_EXTERNAL" ]; then
|
||||
echo_error "UHD images download settings will not be applied without -I present"
|
||||
exit
|
||||
fi
|
||||
############################################
|
||||
# setting and printing OAI envs, we should check here
|
||||
############################################
|
||||
|
||||
echo_info "2. Setting the OAI PATHS ..."
|
||||
|
||||
set_openair_env
|
||||
cecho "OPENAIR_DIR = $OPENAIR_DIR" $green
|
||||
|
||||
# for conf files copy in this bash script
|
||||
@@ -385,7 +459,7 @@ function main() {
|
||||
echo_info "installing packages for USRP support"
|
||||
check_install_usrp_uhd_driver
|
||||
if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
|
||||
install_usrp_uhd_driver
|
||||
install_usrp_uhd_driver $UHD_IMAGES_DIR
|
||||
fi
|
||||
fi
|
||||
if [ "$HW" == "OAI_BLADERF" ] ; then
|
||||
@@ -395,6 +469,11 @@ function main() {
|
||||
flash_firmware_bladerf
|
||||
fi
|
||||
fi
|
||||
if [ "$FLEXRAN_AGENT" == "1" ] ; then
|
||||
echo_info "installing protobuf/protobuf-c for flexran agent support"
|
||||
install_protobuf_from_source
|
||||
install_protobuf_c_from_source
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$INSTALL_OPTIONAL" = "1" ] ; then
|
||||
@@ -404,9 +483,9 @@ function main() {
|
||||
|
||||
if [ "$oaisim" = "1" ] ; then
|
||||
#to be discussed
|
||||
# there is no RF device and no transport protocol
|
||||
# there is no RF device transport protocol
|
||||
HW="None"
|
||||
TP="None"
|
||||
TP="ETHERNET"
|
||||
|
||||
if [ "$XFORMS" == "True" ] ; then
|
||||
PRINT_STATS="True"
|
||||
@@ -439,6 +518,9 @@ function main() {
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
||||
@@ -447,9 +529,18 @@ function main() {
|
||||
echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file
|
||||
echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file
|
||||
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
|
||||
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
|
||||
echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
|
||||
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
|
||||
echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
|
||||
if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then
|
||||
echo_info "Compiling UE S1 build : enabling Linux and NETLINK"
|
||||
echo "set (LINUX True )" >> $cmake_file
|
||||
echo "set (PDCP_USE_NETLINK True )" >> $cmake_file
|
||||
fi
|
||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||
cd $DIR/$lte_build_dir/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
fi
|
||||
|
||||
if [ "$eNB" = "1" -o "$UE" = "1" ] ; then
|
||||
@@ -478,7 +569,7 @@ function main() {
|
||||
|
||||
# mkdir -p $DIR/at_commands/build
|
||||
# cd $DIR/at_commands/build
|
||||
# cmake ..
|
||||
# eval $CMAKE_CMD
|
||||
# compilations \
|
||||
# at_commands at_nas_ue \
|
||||
# at_nas_ue $dbin/at_nas_ue
|
||||
@@ -487,22 +578,24 @@ function main() {
|
||||
mkdir -p $DIR/nas_sim_tools/build
|
||||
cd $DIR/nas_sim_tools/build
|
||||
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
compilations \
|
||||
nas_sim_tools usim \
|
||||
usim $dbin/usim
|
||||
compilations \
|
||||
nas_sim_tools nvram \
|
||||
nvram $dbin/nvram
|
||||
compilations \
|
||||
nas_sim_tools conf2uedata \
|
||||
conf2uedata $dbin/conf2uedata
|
||||
|
||||
# generate USIM data
|
||||
if [ -f $dbin/nvram ]; then
|
||||
install_nas_tools $dbin $dconf
|
||||
if [ -f $dbin/conf2uedata ]; then
|
||||
install_nas_tools $conf_nvram_path $gen_nvram_path
|
||||
echo_info "Copying UE specific part to $DIR/$lte_build_dir/build"
|
||||
cp -Rvf $dbin/.ue_emm.nvram $DIR/$lte_build_dir/build
|
||||
cp -Rvf $dbin/.ue.nvram $DIR/$lte_build_dir/build
|
||||
cp -Rvf $dbin/.usim.nvram $DIR/$lte_build_dir/build
|
||||
|
||||
cp -Rvf $dbin/.ue_emm.nvram0 $DIR/$lte_build_dir/build
|
||||
cp -Rvf $dbin/.ue.nvram0 $DIR/$lte_build_dir/build
|
||||
cp -Rvf $dbin/.usim.nvram0 $DIR/$lte_build_dir/build
|
||||
else
|
||||
echo_warning "not generated UE NAS files: binaries not found"
|
||||
fi
|
||||
@@ -514,13 +607,13 @@ function main() {
|
||||
mkdir -p build
|
||||
cd build
|
||||
rm -f *sim
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
fi
|
||||
|
||||
if [ "$SIMUS_PHY" = "1" ] ; then
|
||||
# lte unitary simulators compilation
|
||||
echo_info "Compiling unitary tests simulators"
|
||||
simlist="dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
|
||||
simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim"
|
||||
for f in $simlist ; do
|
||||
compilations \
|
||||
lte-simulators $f \
|
||||
@@ -581,6 +674,9 @@ function main() {
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
@@ -589,7 +685,7 @@ function main() {
|
||||
[ "$CLEAN" = "1" ] && rm -rf $DIR/$oaisim_build_dir/build
|
||||
mkdir -p $DIR/$oaisim_build_dir/build
|
||||
cd $DIR/$oaisim_build_dir/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
compilations \
|
||||
$oaisim_build_dir $oaisim_exec \
|
||||
$oaisim_exec $dbin/$oaisim_exec.$REL
|
||||
@@ -600,7 +696,7 @@ function main() {
|
||||
echo_info "Compiling at_nas_ue"
|
||||
mkdir -p $DIR/at_commands/build
|
||||
cd $DIR/at_commands/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
compilations \
|
||||
at_commands at_nas_ue \
|
||||
at_nas_ue $dbin/at_nas_ue
|
||||
@@ -614,17 +710,20 @@ function main() {
|
||||
[ "$CLEAN" = "1" ] && rm -rf $DIR/nas_sim_tools/build
|
||||
mkdir -p $DIR/nas_sim_tools/build
|
||||
cd $DIR/nas_sim_tools/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
compilations \
|
||||
nas_sim_tools usim \
|
||||
usim $dbin/usim
|
||||
compilations \
|
||||
nas_sim_tools nvram \
|
||||
nvram $dbin/nvram
|
||||
compilations \
|
||||
nas_sim_tools conf2uedata \
|
||||
conf2uedata $dbin/conf2uedata
|
||||
|
||||
# generate USIM data
|
||||
if [ -f $dbin/nvram ]; then
|
||||
install_nas_tools $dbin $dconf
|
||||
if [ -f $dbin/conf2uedata ]; then
|
||||
install_nas_tools $conf_nvram_path $gen_nvram_path
|
||||
else
|
||||
echo_warning "not generated UE NAS files: binaries not found"
|
||||
fi
|
||||
@@ -640,15 +739,27 @@ function main() {
|
||||
CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko
|
||||
|
||||
#oai_nw_drv
|
||||
compilations \
|
||||
$oaisim_build_dir oai_nw_drv \
|
||||
CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko
|
||||
#compilations \
|
||||
# $oaisim_build_dir oai_nw_drv \
|
||||
# CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko
|
||||
fi
|
||||
|
||||
if [ "$TP" == "ETHERNET" ] ; then
|
||||
compilations \
|
||||
$oaisim_build_dir oai_eth_transpro \
|
||||
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
|
||||
ln -sf liboai_eth_transpro.so liboai_transpro.so
|
||||
ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
||||
echo_info "liboai_transpro.so is linked with ETHERNET library"
|
||||
fi
|
||||
|
||||
cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt
|
||||
cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file
|
||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||
if [ "$FLEXRAN_AGENT" = "1" ] ; then
|
||||
echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file
|
||||
fi
|
||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
|
||||
@@ -656,7 +767,7 @@ function main() {
|
||||
#[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build
|
||||
#mkdir -p $DIR/oaisim_mme_build_oai/build
|
||||
#cd $DIR/oaisim_mme_build_oai/build
|
||||
#cmake ..
|
||||
#eval $CMAKE_CMD
|
||||
#compilations \
|
||||
# oaisim_mme_build_oai oaisim_mme \
|
||||
# oaisim_mme $dbin/oaisim_mme.$REL
|
||||
@@ -686,7 +797,7 @@ function main() {
|
||||
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
|
||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||
cd $DIR/$rrh_build_dir/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
compilations \
|
||||
rrh_gw rrh_gw \
|
||||
rrh_gw $dbin/rrh_gw
|
||||
@@ -695,28 +806,27 @@ function main() {
|
||||
|
||||
# build RF device and transport protocol libraries
|
||||
#####################################
|
||||
if [ "$eNB" = "1" -o "$RRH" = "1" ] ; then
|
||||
if [ "$eNB" = "1" -o "$UE" = "1" -o "$RRH" = "1" ] ; then
|
||||
|
||||
if [ "$eNB" = "1" ] ; then
|
||||
if [ "$eNB" = "1" -o "$UE" = "1" ] ; then
|
||||
build_dir=$lte_build_dir
|
||||
else
|
||||
build_dir=$rrh_build_dir
|
||||
fi
|
||||
|
||||
# build RF device libraries (currently EXMIMO is not complied with the rest of HW targets)
|
||||
# build RF device libraries
|
||||
if [ "$HW" != "None" ] ; then
|
||||
rm -f liboai_device.so
|
||||
rm -f $dbin/liboai_device.so
|
||||
|
||||
|
||||
# link liboai_device.so with the selected RF device library
|
||||
if [ "$HW" == "EXMIMO" ] ; then
|
||||
|
||||
#add exmimo compilation
|
||||
#TODO EXMIMO library support
|
||||
compilations \
|
||||
$build_dir oai_exmimodevif \
|
||||
liboai_exmimodevif.so $dbin/liboai_exmimodevif.so.$REL
|
||||
|
||||
ln -sf liboai_exmimodevif.so liboai_device.so
|
||||
ln -sf $dbin/liboai_exmimodevif.so.$REL $dbin/liboai_device.so
|
||||
echo_info "liboai_device.so is linked to EXMIMO device library"
|
||||
elif [ "$HW" == "OAI_USRP" ] ; then
|
||||
if [ -d "/usr/include/uhd" ] ; then
|
||||
@@ -725,8 +835,8 @@ function main() {
|
||||
liboai_usrpdevif.so $dbin/liboai_usrpdevif.so.$REL
|
||||
fi
|
||||
|
||||
ln -s liboai_usrpdevif.so liboai_device.so
|
||||
ln -s $dbin/liboai_usrpdevif.so.$REL $dbin/liboai_device.so
|
||||
ln -sf liboai_usrpdevif.so liboai_device.so
|
||||
ln -sf $dbin/liboai_usrpdevif.so.$REL $dbin/liboai_device.so
|
||||
echo_info "liboai_device.so is linked to USRP device library"
|
||||
elif [ "$HW" == "OAI_BLADERF" ] ; then
|
||||
if [ -f "/usr/include/libbladeRF.h" ] ; then
|
||||
@@ -735,8 +845,8 @@ function main() {
|
||||
liboai_bladerfdevif.so $dbin/liboai_bladerfdevif.so.$REL
|
||||
fi
|
||||
|
||||
ln -s liboai_bladerfdevif.so liboai_device.so
|
||||
ln -s $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so
|
||||
ln -sf liboai_bladerfdevif.so liboai_device.so
|
||||
ln -sf $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so
|
||||
echo_info "liboai_device.so is linked to BLADERF device library"
|
||||
elif [ "$HW" == "OAI_LMSSDR" ] ; then
|
||||
# if [ -f "/usr/include/libbladeRF.h" ] ; then
|
||||
@@ -745,8 +855,8 @@ function main() {
|
||||
liboai_lmssdrdevif.so $dbin/liboai_lmssdrdevif.so.$REL
|
||||
# fi
|
||||
|
||||
ln -s liboai_lmssdrdevif.so liboai_device.so
|
||||
ln -s $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
|
||||
ln -sf liboai_lmssdrdevif.so liboai_device.so
|
||||
ln -sf $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
|
||||
echo_info "liboai_device.so is linked to LMSSDR device library"
|
||||
else
|
||||
echo_info "liboai_device.so is not linked to any device library"
|
||||
@@ -762,8 +872,8 @@ function main() {
|
||||
compilations \
|
||||
$build_dir oai_eth_transpro \
|
||||
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
|
||||
ln -s liboai_eth_transpro.so liboai_transpro.so
|
||||
ln -s $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
||||
ln -sf liboai_eth_transpro.so liboai_transpro.so
|
||||
ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
||||
echo_info "liboai_transpro.so is linked with ETHERNET library"
|
||||
fi
|
||||
fi
|
||||
@@ -781,7 +891,7 @@ fi
|
||||
[ "$CLEAN" = "1" ] && rm -rf $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||
mkdir -p $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||
cd $OPENAIR_DIR/cmake_targets/doxygen/build
|
||||
cmake ..
|
||||
eval $CMAKE_CMD
|
||||
make doc
|
||||
) >& $doxygen_log
|
||||
fi
|
||||
|
||||
6
cmake_targets/build_ue
Normal file
6
cmake_targets/build_ue
Normal file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
#sudo ./build_oai -c -C -I --install-optional-packages --install-system-files --UE -w USRP -V
|
||||
#sudo ./build_oai -c -C -I --install-optional-packages --UE -w USRP -V
|
||||
#sudo ./build_oai -c -C --UE -w USRP -V
|
||||
sudo ./build_oai -c -C --UE -w USRP
|
||||
#sudo ./build_oai -c -C --UE -w USRP --build-eclipse
|
||||
@@ -3,12 +3,12 @@ set(PACKAGE_NAME "unitary_tests_simulators")
|
||||
set(PHYSIM True)
|
||||
set(RF_BOARD None)
|
||||
set(XFORMS True)
|
||||
|
||||
set(ENABLE_ITTI False)
|
||||
set(DEBUG_PHY False)
|
||||
set(MU_RECIEVER False)
|
||||
set(RANDOM_BF False)
|
||||
set(PBS_SIM False)
|
||||
set(PERFECT_CE False)
|
||||
set(PERFECT_CE True)
|
||||
set(NAS_UE False)
|
||||
set(MESSAGE_CHART_GENERATOR False)
|
||||
|
||||
|
||||
@@ -2,70 +2,89 @@ cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
project(NAS_SIM_TOOLS)
|
||||
|
||||
include(FindPkgConfig)
|
||||
pkg_search_module(CONFIG libconfig REQUIRED)
|
||||
include_directories(${CONFIG_INCLUDE_DIRS})
|
||||
add_definitions(-std=gnu99)
|
||||
|
||||
ENABLE_LANGUAGE(C)
|
||||
#Sends the -std=c99 flag to the gcc compiler
|
||||
add_definitions(-std=c99)
|
||||
add_definitions(-DNAS_UE)
|
||||
|
||||
set(CMAKE_C_FLAGS
|
||||
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -g")
|
||||
|
||||
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
|
||||
set(OPENAIR1_DIR $ENV{OPENAIR_DIR}/openair1)
|
||||
set(OPENAIR2_DIR $ENV{OPENAIR_DIR}/openair2)
|
||||
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
|
||||
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
|
||||
set(OPENAIR_TARGETS $ENV{OPENAIR_DIR}/targets)
|
||||
|
||||
#set(EXECUTABLE_OUTPUT_PATH ${OPENAIR_DIR}/targets/bin)
|
||||
|
||||
|
||||
# Add .h files for dependancies
|
||||
set(usim_SRC
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/usim_data.c
|
||||
set(CONF2UEDATA_LIB_SRC
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_data.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_usim.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_network.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_plmn.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_parser.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/fs.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/display.c
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.c
|
||||
${OPENAIR_DIR}/common/utils/utils.c
|
||||
)
|
||||
set(usim_HDR
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/network.h
|
||||
|
||||
set(conf2uedata_HDR
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf2uedata.h
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.h
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.h
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.h
|
||||
${OPENAIR_DIR}/common/utils/utils.h
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${OPENAIR_DIR}/common/utils
|
||||
${OPENAIR_DIR}/openair3/NAS/UE
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USER
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/EMM/
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/ESM/
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/IES/
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL
|
||||
)
|
||||
ADD_EXECUTABLE(usim ${usim_SRC} ${usim_HDR})
|
||||
|
||||
# conf2uedata binary
|
||||
|
||||
set(conf2uedata_SRC
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf2uedata.c
|
||||
${CONF2UEDATA_LIB_SRC}
|
||||
)
|
||||
|
||||
add_executable(conf2uedata ${conf2uedata_SRC} ${conf2uedata_HDR} )
|
||||
target_link_libraries(conf2uedata ${CONFIG_LIBRARIES})
|
||||
|
||||
# usim binary
|
||||
|
||||
set(usim_SRC
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/usim.c
|
||||
${CONF2UEDATA_LIB_SRC}
|
||||
)
|
||||
|
||||
|
||||
add_executable(usim ${usim_SRC} ${conf2uedata_HDR} )
|
||||
target_link_libraries(usim ${CONFIG_LIBRARIES})
|
||||
|
||||
# nvram binary
|
||||
|
||||
set(nvram_SRC
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/ue_data.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c
|
||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/nvram.c
|
||||
${CONF2UEDATA_LIB_SRC}
|
||||
)
|
||||
|
||||
set(nvram_HDR
|
||||
${OPENAIR_DIR}/openair3/NAS/UE/EMM/emmData.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.h
|
||||
${OPENAIR_DIR}/openair3/NAS/COMMON/userDef.h
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(nvram ${nvram_SRC} ${nvram_HDR})
|
||||
|
||||
#install (TARGETS usim DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
#install (TARGETS nvram DESTINATION ${EXECUTABLE_OUTPUT_PATH})
|
||||
|
||||
#install(CODE "EXECUTE_PROCESS (COMMAND ${OPENAIR_TARGETS}/bin/nvram --gen WORKING_DIRECTORY ${OPENAIR_TARGETS}/bin)")
|
||||
#install(CODE "EXECUTE_PROCESS (COMMAND ${OPENAIR_TARGETS}/bin/usim --gen WORKING_DIRECTORY ${OPENAIR_TARGETS}/bin)")
|
||||
add_executable(nvram ${nvram_SRC} ${conf2uedata_HDR} )
|
||||
target_link_libraries(nvram ${CONFIG_LIBRARIES})
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
|
||||
set ( ADDR_CONF False )
|
||||
set ( DEBUG_OMG False )
|
||||
set ( DISABLE_XER_PRINT False )
|
||||
@@ -48,7 +47,7 @@ set ( NEW_FFT True )
|
||||
set ( NO_RRM True )
|
||||
set ( OAI_EMU True )
|
||||
set ( OAISIM True )
|
||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET True )
|
||||
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
|
||||
set ( OAI_NW_DRIVER_USE_NETLINK True )
|
||||
set ( OPENAIR1 True )
|
||||
set ( OPENAIR2 True )
|
||||
|
||||
3
cmake_targets/snap_environment.sh
Executable file
3
cmake_targets/snap_environment.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
export UHD_IMAGES_DIR=$SNAP/uhd_images
|
||||
exec $@
|
||||
@@ -24,6 +24,22 @@
|
||||
# authors Laurent Thomas, Lionel GAUTHIER
|
||||
#
|
||||
#######################################
|
||||
if [ ! -f /etc/os-release ]; then
|
||||
echo "No /etc/os-release file found. You're likely on an unsupported distro."
|
||||
exit -1
|
||||
fi
|
||||
OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
|
||||
OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
|
||||
case "$OS_DISTRO" in
|
||||
fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
rhel) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;;
|
||||
centos) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;;
|
||||
debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
|
||||
ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
|
||||
esac
|
||||
KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
|
||||
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
|
||||
|
||||
SUDO='sudo -E'
|
||||
|
||||
###############################
|
||||
@@ -66,12 +82,11 @@ echo_info() { cecho "$*" $blue ;}
|
||||
# If we can't check the distribution, it returns "Unknown"
|
||||
# This function return always true as exit code by design
|
||||
# Examples:
|
||||
# Ubuntu16.04
|
||||
# Debian8.5
|
||||
# ubuntu16.04
|
||||
# debian8.5
|
||||
get_distribution_release() {
|
||||
local distributor
|
||||
if distributor=$(lsb_release -si 2>/dev/null) ; then
|
||||
echo $distributor$(lsb_release -sr)
|
||||
if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then
|
||||
echo "$OS_DISTRO$OS_RELEASE"
|
||||
else
|
||||
echo Unknown
|
||||
fi
|
||||
@@ -80,8 +95,11 @@ get_distribution_release() {
|
||||
check_supported_distribution() {
|
||||
local distribution=$(get_distribution_release)
|
||||
case "$distribution" in
|
||||
"Ubuntu16.04") return 0 ;;
|
||||
"Ubuntu14.04") return 0 ;;
|
||||
"ubuntu16.04") return 0 ;;
|
||||
"ubuntu14.04") return 0 ;;
|
||||
"fedora24") return 0 ;;
|
||||
"rhel7") return 0 ;;
|
||||
"centos7") return 0 ;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
@@ -136,6 +154,20 @@ clean_all_files() {
|
||||
# Compilers
|
||||
###################################
|
||||
|
||||
#check_warnings:
|
||||
# print error message if the compilation had warnings
|
||||
#argument:
|
||||
# $1: log file
|
||||
check_warnings() {
|
||||
#we look for 'warning:' in the compilation log file
|
||||
#this is how gcc starts a warning
|
||||
#this is not perfect, we may get false positive
|
||||
warning_count=`grep "warning:" "$1"|wc -l`
|
||||
if [ $warning_count -gt 0 ]; then
|
||||
echo_error "WARNING: $warning_count warnings. See $1"
|
||||
fi
|
||||
}
|
||||
|
||||
compilations() {
|
||||
cd $OPENAIR_DIR/cmake_targets/$1/build
|
||||
set +e
|
||||
@@ -153,6 +185,7 @@ compilations() {
|
||||
if [ -s $3 ] ; then
|
||||
cp $3 $4
|
||||
echo_success "$2 compiled"
|
||||
check_warnings "$dlog/$2.$REL.txt"
|
||||
else
|
||||
echo_error "$2 compilation failed"
|
||||
exit 1
|
||||
@@ -163,7 +196,72 @@ compilations() {
|
||||
# External packages installers
|
||||
############################################
|
||||
|
||||
install_protobuf_from_source(){
|
||||
protobuf_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_install_log.txt
|
||||
echo_info "\nInstalling Google Protobuf from sources. The log file for Protobuf installation is here: $protobuf_install_log "
|
||||
(
|
||||
cd /tmp
|
||||
echo "Downloading protobuf"
|
||||
#rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1
|
||||
#wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
||||
#tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
|
||||
#cd protobuf-2.6.1/
|
||||
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
|
||||
wget https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
|
||||
tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $USER --no-same-owner
|
||||
cd protobuf-3.3.0/
|
||||
./configure
|
||||
echo "Compiling protobuf"
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
) >& $protobuf_install_log
|
||||
}
|
||||
|
||||
install_protobuf_c_from_source(){
|
||||
protobuf_c_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_c_install_log.txt
|
||||
echo_info "\nInstalling Google Protobuf_C from sources. The log file for Protobuf_C installation is here: $protobuf_c_install_log "
|
||||
(
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
|
||||
fi
|
||||
cd /tmp
|
||||
echo "Downloading protobuf-c"
|
||||
rm -rf /tmp/protobuf-c
|
||||
git clone https://github.com/protobuf-c/protobuf-c.git
|
||||
cd protobuf-c
|
||||
./autogen.sh
|
||||
./configure
|
||||
echo "Compiling protobuf-c"
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
) >& $protobuf_c_install_log
|
||||
}
|
||||
|
||||
install_usrp_uhd_driver_from_source(){
|
||||
uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt
|
||||
echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
|
||||
(
|
||||
cd /tmp
|
||||
echo "Downloading UHD driver"
|
||||
rm -rf /tmp/uhd
|
||||
git clone git://github.com/EttusResearch/uhd.git
|
||||
cd uhd
|
||||
git checkout tags/release_003_010_001_001
|
||||
mkdir -p host/build
|
||||
cd host/build
|
||||
$CMAKE ../
|
||||
echo "Compiling UHD"
|
||||
make
|
||||
make test
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
) >& $uhd_install_log
|
||||
}
|
||||
|
||||
check_install_usrp_uhd_driver(){
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
#first we remove old installation
|
||||
$SUDO apt-get remove -y uhd || true
|
||||
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y
|
||||
@@ -172,34 +270,99 @@ check_install_usrp_uhd_driver(){
|
||||
#The new USRP repository
|
||||
$SUDO add-apt-repository ppa:ettusresearch/uhd -y
|
||||
$SUDO apt-get update
|
||||
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
||||
$SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
|
||||
$SUDO apt-get -y --allow-unauthenticated install python python-tk libboost-all-dev libusb-1.0-0-dev
|
||||
$SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host
|
||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||
$SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
# until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source
|
||||
$SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware
|
||||
install_ursp_uhd_driver_from_source
|
||||
else
|
||||
$SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
install_usrp_uhd_driver() {
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
# We move uhd-host apart because it depends on linux kernel version
|
||||
# On newer kernels, it fails to install
|
||||
$SUDO apt-get -y install uhd-host
|
||||
$SUDO uhd_images_downloader
|
||||
fi
|
||||
if [ -z $1 ]; then
|
||||
$SUDO uhd_images_downloader
|
||||
else
|
||||
$SUDO uhd_images_downloader -i $1
|
||||
fi
|
||||
}
|
||||
|
||||
install_bladerf_driver_from_source(){
|
||||
bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt
|
||||
echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log "
|
||||
(
|
||||
cd /tmp
|
||||
echo "Downloading BladeRF driver"
|
||||
rm -rf /tmp/bladeRF
|
||||
git clone https://github.com/Nuand/bladeRF.git
|
||||
cd bladeRF
|
||||
git checkout tags/2016.06
|
||||
mkdir -p build
|
||||
cd build
|
||||
$CMAKE ../
|
||||
echo "Compiling BladeRF driver"
|
||||
make
|
||||
$SUDO make install
|
||||
$SUDO ldconfig
|
||||
echo "Downloading FPGA and firmware images"
|
||||
cd /tmp/bladeRF
|
||||
wget https://www.nuand.com/fx3/bladeRF_fw_latest.img
|
||||
wget https://www.nuand.com/fpga/hostedx40-latest.rbf
|
||||
sudo mkdir -p /usr/share/Nuand/bladeRF
|
||||
sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
||||
sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf
|
||||
) >& $bladerf_install_log
|
||||
}
|
||||
|
||||
check_install_bladerf_driver(){
|
||||
if [ "$(get_distribution_release)" == "Ubuntu14.04" ] ; then
|
||||
$SUDO add-apt-repository -y ppa:bladerf/bladerf
|
||||
$SUDO apt-get update
|
||||
fi
|
||||
$SUDO apt-get install -y bladerf libbladerf-dev
|
||||
$SUDO apt-get install -y bladerf-firmware-fx3
|
||||
$SUDO apt-get install -y bladerf-fpga-hostedx40
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
if [ "$(get_distribution_release)" == "ubuntu14.04" ] ; then
|
||||
$SUDO add-apt-repository -y ppa:bladerf/bladerf
|
||||
$SUDO apt-get update
|
||||
fi
|
||||
$SUDO apt-get install -y --allow-unauthenticated bladerf libbladerf-dev
|
||||
$SUDO apt-get install -y --allow-unauthenticated bladerf-firmware-fx3
|
||||
$SUDO apt-get install -y --allow-unauthenticated bladerf-fpga-hostedx40
|
||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||
install_bladerf_driver_from_source
|
||||
else
|
||||
echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website"
|
||||
fi
|
||||
}
|
||||
|
||||
flash_firmware_bladerf() {
|
||||
$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
|
||||
}
|
||||
|
||||
check_install_lmssdr_driver(){
|
||||
if ( [ -d "/usr/local/include/lime" ] &&
|
||||
[ -f "/usr/local/include/lime/LimeSuite.h" ] )
|
||||
then
|
||||
echo_success "Found lmssdr drivers and tools installed from source"
|
||||
else
|
||||
echo_error "lmssdr support implies installing lmssdr drivers and tools" \
|
||||
" from sources. check:"
|
||||
echo_info "https://open-cells.com/index.php/2017/05/10/limesdr-installation/"
|
||||
echo_fatal "Cannot compile lmssdr device"
|
||||
fi
|
||||
|
||||
|
||||
}
|
||||
|
||||
check_install_additional_tools (){
|
||||
$SUDO apt-get update
|
||||
$SUDO apt-get install -y \
|
||||
$SUDO $INSTALLER update -y
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
PACKAGE_LIST="\
|
||||
check \
|
||||
dialog \
|
||||
dkms \
|
||||
@@ -223,16 +386,78 @@ check_install_additional_tools (){
|
||||
android-tools-adb \
|
||||
wvdial \
|
||||
python-numpy \
|
||||
sshpass \
|
||||
nscd \
|
||||
bc \
|
||||
ntp
|
||||
|
||||
$SUDO pip install paramiko
|
||||
$SUDO pip install pyroute2
|
||||
sshpass \
|
||||
nscd \
|
||||
bc \
|
||||
ntp \
|
||||
python-scipy \
|
||||
python-matplotlib"
|
||||
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
PACKAGE_LIST="\
|
||||
check \
|
||||
dialog \
|
||||
dkms \
|
||||
gawk \
|
||||
boost-devel \
|
||||
openvpn \
|
||||
pkgconfig \
|
||||
pexpect \
|
||||
sshfs \
|
||||
swig \
|
||||
wireshark \
|
||||
unzip \
|
||||
valgrind \
|
||||
vconfig \
|
||||
ctags \
|
||||
ntpdate \
|
||||
iperf3 \
|
||||
wvdial \
|
||||
numpy \
|
||||
sshpass \
|
||||
nscd \
|
||||
python2-paramiko \
|
||||
python-pyroute2 \
|
||||
python-netifaces \
|
||||
scipy \
|
||||
python-matplotlib"
|
||||
elif [[ "$OS_DISTRO" == "fedora" ]]; then
|
||||
PACKAGE_LIST=" \
|
||||
check \
|
||||
dialog \
|
||||
dkms \
|
||||
gawk \
|
||||
boost-devel \
|
||||
openvpn \
|
||||
pkgconfig \
|
||||
python-pexpect \
|
||||
sshfs \
|
||||
swig \
|
||||
wireshark \
|
||||
unzip \
|
||||
valgrind \
|
||||
vconfig \
|
||||
ctags \
|
||||
ntpdate \
|
||||
iperf3 \
|
||||
wvdial \
|
||||
python-numpy \
|
||||
sshpass \
|
||||
nscd \
|
||||
python2-paramiko \
|
||||
python-pyroute2 \
|
||||
python-netifaces \
|
||||
python2-scipy \
|
||||
python2-matplotlib"
|
||||
fi
|
||||
$SUDO $INSTALLER install -y $PACKAGE_LIST
|
||||
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh
|
||||
|
||||
|
||||
#The packages below are already installed for Redhat distros (RHEL, CentOS, Fedora)
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
$SUDO pip install paramiko
|
||||
$SUDO pip install pyroute2 colorama
|
||||
log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt
|
||||
echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface"
|
||||
(
|
||||
@@ -243,6 +468,7 @@ check_install_additional_tools (){
|
||||
$SUDO python setup.py install
|
||||
cd -
|
||||
) >& $log_netiface
|
||||
fi
|
||||
}
|
||||
|
||||
check_install_oai_software() {
|
||||
@@ -251,16 +477,17 @@ check_install_oai_software() {
|
||||
echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
|
||||
exit 1
|
||||
fi
|
||||
$SUDO apt-get update
|
||||
$SUDO $INSTALLER update -y
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
$SUDO apt install -y software-properties-common
|
||||
case "$(get_distribution_release)" in
|
||||
"Ubuntu14.04")
|
||||
"ubuntu14.04")
|
||||
specific_packages="libtasn1-3-dev"
|
||||
# For iperf3
|
||||
$SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
|
||||
$SUDO apt-get update
|
||||
;;
|
||||
"Ubuntu16.04")
|
||||
"ubuntu16.04")
|
||||
specific_packages="libtasn1-6-dev"
|
||||
;;
|
||||
esac
|
||||
@@ -322,67 +549,98 @@ check_install_oai_software() {
|
||||
xmlstarlet \
|
||||
python-pip \
|
||||
pydb \
|
||||
wget
|
||||
libyaml-dev \
|
||||
wget \
|
||||
libxpm-dev
|
||||
|
||||
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
|
||||
|
||||
#Remove old gnutls/nettle installation that was done from sources
|
||||
remove_nettle_from_source
|
||||
|
||||
$SUDO apt-get install -y nettle-dev nettle-bin
|
||||
remove_gnutls_from_source
|
||||
|
||||
$SUDO apt-get install -y libgnutls-dev
|
||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
if rpm -q epel-release > /dev/null; then
|
||||
echo "EPEL repos already present. Good."
|
||||
else
|
||||
echo "EPEL repos not present. Installing them."
|
||||
$SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||
fi
|
||||
$SUDO $INSTALLER install -y python-epdb
|
||||
$SUDO $INSTALLER install -y gccxml
|
||||
else
|
||||
$SUDO $INSTALLER install -y mscgen pydb
|
||||
# Fedora repos already contain gccxml's successor castxml.
|
||||
$SUDO $INSTALLER install -y castxml
|
||||
fi
|
||||
|
||||
$SUDO $INSTALLER install -y \
|
||||
autoconf \
|
||||
automake \
|
||||
bc \
|
||||
bison \
|
||||
$CMAKE \
|
||||
doxygen \
|
||||
ethtool \
|
||||
flex \
|
||||
gdb \
|
||||
git \
|
||||
graphviz \
|
||||
gtkwave \
|
||||
guile-devel \
|
||||
iperf \
|
||||
iproute \
|
||||
iptables \
|
||||
iptables-devel \
|
||||
atlas-devel \
|
||||
blas-devel \
|
||||
libconfig-devel \
|
||||
libffi-devel \
|
||||
xforms \
|
||||
xforms-devel \
|
||||
libgcrypt-devel \
|
||||
gmp-devel \
|
||||
gtk3-devel \
|
||||
libidn2-devel \
|
||||
libidn-devel \
|
||||
mariadb-devel \
|
||||
octave-devel \
|
||||
openpgm-devel \
|
||||
lksctp-tools \
|
||||
lksctp-tools-devel \
|
||||
openssl-devel \
|
||||
libtasn1 \
|
||||
libtool \
|
||||
libusb-devel \
|
||||
libxml2 \
|
||||
libxml2-devel \
|
||||
libxslt-devel \
|
||||
octave \
|
||||
octave-signal \
|
||||
openssh-clients \
|
||||
openssh-server \
|
||||
openssl \
|
||||
patch \
|
||||
psmisc \
|
||||
python \
|
||||
subversion \
|
||||
xmlstarlet \
|
||||
python-pip \
|
||||
wget \
|
||||
kernel-headers \
|
||||
kernel-devel \
|
||||
nettle-devel \
|
||||
gnutls-devel \
|
||||
libXpm-devel \
|
||||
lapack \
|
||||
lapack-devel \
|
||||
blas \
|
||||
blas-devel
|
||||
fi
|
||||
|
||||
install_asn1c_from_source
|
||||
}
|
||||
|
||||
### Remove Nettle installation which was done from sources
|
||||
remove_nettle_from_source() {
|
||||
nettle_uninstall_log=$OPENAIR_DIR/cmake_targets/log/nettle_uninstall_log.txt
|
||||
echo_info "\nUn-Installing Nettle from sources. The log file for nettle un-installation is here: $nettle_uninstall_log "
|
||||
(
|
||||
$SUDO apt-get remove -y nettle-dev nettle-bin
|
||||
cd /tmp
|
||||
echo "Downloading nettle archive"
|
||||
$SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5
|
||||
wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz
|
||||
if [ $? -ne 0 ]; then
|
||||
wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
|
||||
fi
|
||||
if [ ! -f nettle-2.5.tar.gz ]; then
|
||||
echo_error "Could not download nettle source files"
|
||||
cd -
|
||||
return
|
||||
fi
|
||||
tar -xzf nettle-2.5.tar.gz
|
||||
cd nettle-2.5/
|
||||
./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
) >& $nettle_uninstall_log
|
||||
}
|
||||
|
||||
### Remove Gnutls from source
|
||||
remove_gnutls_from_source(){
|
||||
gnutls_uninstall_log=$OPENAIR_DIR/cmake_targets/log/gnutls_uninstall_log.txt
|
||||
echo_info "\nUn-Installing Gnutls. The log file for Gnutls un-installation is here: $gnutls_uninstall_log "
|
||||
(
|
||||
$SUDO apt-get remove -y libgnutls-dev
|
||||
cd /tmp
|
||||
echo "Downloading gnutls archive"
|
||||
$SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23
|
||||
wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \
|
||||
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
|
||||
if [ ! -f gnutls-3.1.23.tar.xz ]; then
|
||||
echo_error "Could not download gnutls source files"
|
||||
cd -
|
||||
return
|
||||
fi
|
||||
tar -xJf gnutls-3.1.23.tar.xz
|
||||
cd gnutls-3.1.23/
|
||||
./configure --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
)>& $gnutls_uninstall_log
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
|
||||
}
|
||||
|
||||
install_asn1c_from_source(){
|
||||
@@ -396,6 +654,7 @@ install_asn1c_from_source(){
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
cd -
|
||||
$SUDO ldconfig
|
||||
) > $asn1_install_log 2>&1
|
||||
}
|
||||
|
||||
@@ -404,19 +663,18 @@ install_asn1c_from_source(){
|
||||
################################################
|
||||
|
||||
install_nas_tools() {
|
||||
cd $1
|
||||
if [ ! -f .ue.nvram ]; then
|
||||
if [ ! -f .ue.nvram0 ]; then
|
||||
echo_success "generate .ue_emm.nvram .ue.nvram"
|
||||
./nvram --gen
|
||||
./nvram --gen -c $1 -o $2
|
||||
else
|
||||
[ ./nvram -nt .ue.nvram -o ./nvram -nt .ue_emm.nvram ] && ./nvram --gen
|
||||
[ ./nvram -nt .ue.nvram0 -o ./nvram -nt .ue_emm.nvram0 ] && ./nvram --gen -c $1 -o $2
|
||||
fi
|
||||
|
||||
if [ ! -f .usim.nvram ]; then
|
||||
if [ ! -f .usim.nvram0 ]; then
|
||||
echo_success "generate .usim.nvram"
|
||||
./usim --gen
|
||||
./usim --gen -c $1 -o $2
|
||||
else
|
||||
[ ./usim -nt .usim.nvram ] && ./usim --gen
|
||||
[ ./usim -nt .usim.nvram0 ] && ./usim --gen -c $1 -o $2
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
@@ -3,19 +3,16 @@
|
||||
# in those arrays, each line is:
|
||||
# <file> <sha1sum of file (without line 4 which changes depending on the location of the files)> <patch to apply to file>
|
||||
|
||||
RRC_Rel14=(
|
||||
"SystemInformation-r8-IEs.h" 562e3c3aeb7c6d76d722f31bf24488a26e627f33 "fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff"
|
||||
)
|
||||
|
||||
RRC_Rel10=(
|
||||
"SystemInformation-r8-IEs.h" 603cd6615cff36ec7020692d72c0d6de7c4859cb "fix_asn1.data/RRC.rel10/SystemInformation-r8-IEs.h.diff"
|
||||
)
|
||||
|
||||
X2AP_Rel11_2=(
|
||||
"X2ap-CriticalityDiagnostics-IE-List.h" ae96308b37fcbcbf39da5012e42968135fc5f27b "fix_asn1.data/X2AP.rel11.2/X2ap-CriticalityDiagnostics-IE-List.h.diff"
|
||||
"NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff"
|
||||
"constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff"
|
||||
)
|
||||
|
||||
S1AP_Rel10_5=(
|
||||
"NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff"
|
||||
"constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff"
|
||||
)
|
||||
|
||||
red_color="$(tput setaf 1)"
|
||||
@@ -94,6 +91,10 @@ function patch_rrc()
|
||||
local version="$2"
|
||||
|
||||
case "$version" in
|
||||
Rel14 )
|
||||
echo "patching RRC files release 14"
|
||||
apply_patches "$directory" RRC_Rel14 ${#RRC_Rel14[*]}
|
||||
;;
|
||||
Rel10 )
|
||||
echo "patching RRC files release 10"
|
||||
apply_patches "$directory" RRC_Rel10 ${#RRC_Rel10[*]}
|
||||
@@ -130,8 +131,7 @@ function patch_s1ap()
|
||||
|
||||
case "$version" in
|
||||
R10 )
|
||||
echo "patching S1AP files release 10.5"
|
||||
apply_patches "$directory" S1AP_Rel10_5 ${#S1AP_Rel10_5[*]}
|
||||
#nothing to do anymore (fixes went to asn1c)
|
||||
;;
|
||||
* )
|
||||
error unknwon/unhandled S1AP version \'"$version"\'
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
73,77d72
|
||||
< /* SystemInformation-r8-IEs */
|
||||
< typedef struct SystemInformation_r8_IEs {
|
||||
< struct SystemInformation_r8_IEs__sib_TypeAndInfo {
|
||||
< A_SEQUENCE_OF(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member {
|
||||
< SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR present;
|
||||
103c98,102
|
||||
< } choice;
|
||||
---
|
||||
> };
|
||||
>
|
||||
> struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member {
|
||||
> SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR present;
|
||||
> union SystemInformation_r8_IEs__sib_TypeAndInfo__Member_u choice;
|
||||
107c106,111
|
||||
< } ) list;
|
||||
---
|
||||
> };
|
||||
>
|
||||
> /* SystemInformation-r8-IEs */
|
||||
> typedef struct SystemInformation_r8_IEs {
|
||||
> struct SystemInformation_r8_IEs__sib_TypeAndInfo {
|
||||
> A_SEQUENCE_OF(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member) list;
|
||||
@@ -1,8 +0,0 @@
|
||||
283c283
|
||||
< int dynamic = 0;
|
||||
---
|
||||
> //int dynamic = 0;
|
||||
290c290
|
||||
< dynamic = 1;
|
||||
---
|
||||
> //dynamic = 1;
|
||||
@@ -1,4 +0,0 @@
|
||||
1007c1007
|
||||
< (int)nelems, (int)ct ? ct->effective_bits : -1);
|
||||
---
|
||||
> (int)nelems, ct ? ct->effective_bits : -1);
|
||||
@@ -1,8 +0,0 @@
|
||||
283c283
|
||||
< int dynamic = 0;
|
||||
---
|
||||
> //int dynamic = 0;
|
||||
290c290
|
||||
< dynamic = 1;
|
||||
---
|
||||
> //dynamic = 1;
|
||||
@@ -1,4 +0,0 @@
|
||||
1007c1007
|
||||
< (int)nelems, (int)ct ? ct->effective_bits : -1);
|
||||
---
|
||||
> (int)nelems, ct ? ct->effective_bits : -1);
|
||||
19
cmake_targets/tools/generate_protobuf
Executable file
19
cmake_targets/tools/generate_protobuf
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
function main()
|
||||
{
|
||||
mkdir -p $1
|
||||
|
||||
#echo generate protobuf messages inside $1 $2
|
||||
|
||||
c_out=$1
|
||||
shift
|
||||
proto_path=$1
|
||||
shift
|
||||
|
||||
protoc-c --c_out=$c_out --proto_path=$proto_path $*
|
||||
#protoc --cpp_out=$c_out --proto_path=$proto_path $*
|
||||
|
||||
}
|
||||
|
||||
main "$@"
|
||||
71
cmake_targets/tools/init_nas_s1
Normal file
71
cmake_targets/tools/init_nas_s1
Normal file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
#WARNING: this file may not work properly, be sure to know what you
|
||||
#do when using it
|
||||
|
||||
#/*
|
||||
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
# * contributor license agreements. See the NOTICE file distributed with
|
||||
# * this work for additional information regarding copyright ownership.
|
||||
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||
# * the OAI Public License, Version 1.0 (the "License"); you may not use this file
|
||||
# * except in compliance with the License.
|
||||
# * You may obtain a copy of the License at
|
||||
# *
|
||||
# * http://www.openairinterface.org/?page_id=698
|
||||
# *
|
||||
# * Unless required by applicable law or agreed to in writing, software
|
||||
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# * See the License for the specific language governing permissions and
|
||||
# * limitations under the License.
|
||||
# *-------------------------------------------------------------------------------
|
||||
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
# * contact@openairinterface.org
|
||||
# */
|
||||
|
||||
################################################################################
|
||||
# file init_nas_s1
|
||||
# brief loads the ue_ip module and sets up IP for the UE
|
||||
# you may want to edit it to fit your settings (replace oip0 by oipX for
|
||||
# instance)
|
||||
# author Florian Kaltenberger
|
||||
#
|
||||
#######################################
|
||||
|
||||
LTEIF=oip1
|
||||
#OPENAIR_DIR=/home/oai/svn-oai/openair4G
|
||||
|
||||
load_module() {
|
||||
mod_name=${1##*/}
|
||||
mod_name=${mod_name%.*}
|
||||
if awk "/$mod_name/ {found=1 ;exit} END {if (found!=1) exit 1}" /proc/modules
|
||||
then
|
||||
echo "module $mod_name already loaded: I remove it first"
|
||||
sudo rmmod $mod_name
|
||||
fi
|
||||
echo loading $mod_name
|
||||
sudo insmod $1
|
||||
}
|
||||
|
||||
load_module ../../targets/bin/ue_ip.ko
|
||||
|
||||
if [ "$1" = "UE" ]; then
|
||||
echo "bring up $LTEIF interface for UE"
|
||||
ifconfig $LTEIF up
|
||||
fi
|
||||
|
||||
ip route flush cache
|
||||
sleep 1
|
||||
sysctl -w net.ipv4.conf.all.log_martians=1
|
||||
echo "Disabling reverse path filtering"
|
||||
sysctl -w net.ipv4.conf.all.rp_filter=0
|
||||
ip route flush cache
|
||||
|
||||
# Check table 200 lte in /etc/iproute2/rt_tables
|
||||
fgrep lte /etc/iproute2/rt_tables > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "200 lte " >> /etc/iproute2/rt_tables
|
||||
fi
|
||||
ip rule add fwmark 1 table lte
|
||||
ip route add default dev $LTEIF table lte
|
||||
21
cmake_targets/tools/make_agent_cache
Executable file
21
cmake_targets/tools/make_agent_cache
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CACHE_DIR=/mnt/oai_agent_cache
|
||||
|
||||
if [ ! -d $CACHE_DIR ]; then
|
||||
echo "Creating cache dir in $CACHE_DIR"
|
||||
sudo mkdir $CACHE_DIR
|
||||
fi
|
||||
|
||||
if grep -qs "$CACHE_DIR" /proc/mounts; then
|
||||
echo "Agent cache is already mounted"
|
||||
else
|
||||
echo "Agent cache was not mounted"
|
||||
echo "Mounting..."
|
||||
sudo mount -o size=100m -t tmpfs none "$CACHE_DIR"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Mount success"
|
||||
else
|
||||
echo "Something went wrong with the mount"
|
||||
fi
|
||||
fi
|
||||
@@ -150,7 +150,7 @@ function main()
|
||||
# -u | --num-ue )
|
||||
|
||||
-V | --vcd)
|
||||
"setting gtk-wave output"
|
||||
echo "setting gtk-wave output"
|
||||
exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd"
|
||||
shift ;
|
||||
;;
|
||||
@@ -164,6 +164,11 @@ function main()
|
||||
exe_arguments="$exe_arguments -n $2"
|
||||
shift 2;
|
||||
;;
|
||||
-x | --xforms)
|
||||
echo "running with xforms"
|
||||
exe_arguments="$exe_arguments --xforms"
|
||||
shift 1;
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option $1"
|
||||
help
|
||||
@@ -212,11 +217,11 @@ function main()
|
||||
fi
|
||||
|
||||
if [ $run_gdb -eq 0 ]; then
|
||||
exec $SUDO $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel10 $exe_arguments | tee /tmp/enb_ue_nos1.log.txt
|
||||
exec $SUDO $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14 $exe_arguments | tee /tmp/enb_ue_nos1.log.txt
|
||||
else
|
||||
touch ~/.gdb_enb_ue_nos1
|
||||
chmod 777 ~/.gdb_enb_ue_nos1
|
||||
echo "file $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel10" > ~/.gdb_enb_ue_nos1
|
||||
echo "file $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14" > ~/.gdb_enb_ue_nos1
|
||||
echo "set args $exe_arguments" >> ~/.gdb_enb_ue_nos1
|
||||
echo "run" >> ~/.gdb_enb_ue_nos1
|
||||
cat ~/.gdb_enb_ue_nos1
|
||||
|
||||
@@ -174,7 +174,7 @@ function main()
|
||||
;;
|
||||
|
||||
-V | --vcd)
|
||||
"setting gtk-wave output"
|
||||
echo "setting gtk-wave output"
|
||||
exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd"
|
||||
shift ;
|
||||
;;
|
||||
@@ -183,6 +183,11 @@ function main()
|
||||
exe_arguments="$exe_arguments -P wireshark"
|
||||
shift 2;
|
||||
;;
|
||||
-x | --xforms)
|
||||
echo "running with xforms"
|
||||
exe_arguments="$exe_arguments --xforms"
|
||||
shift 1;
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option $1"
|
||||
help
|
||||
@@ -247,12 +252,6 @@ function main()
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "200 lte " >> /etc/iproute2/rt_tables
|
||||
fi
|
||||
ip rule add fwmark 1 table lte
|
||||
ifconfig oip1 up
|
||||
ip route add default dev oip1 table lte
|
||||
# the actual IP address depends on the EPC/MME config file for address pool
|
||||
ip route add from 192.188.0.0/24 table lte
|
||||
ip route add to 192.188.0.0/24 table lte
|
||||
|
||||
exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0"
|
||||
|
||||
@@ -264,11 +263,11 @@ function main()
|
||||
fi
|
||||
|
||||
if [ $run_gdb -eq 0 ]; then
|
||||
exec $OPENAIR_DIR/targets/bin/oaisim.Rel10 $exe_arguments | tee /tmp/enb_ue_s1.log.txt
|
||||
exec $OPENAIR_DIR/targets/bin/oaisim.Rel14 $exe_arguments | tee /tmp/enb_ue_s1.log.txt
|
||||
else
|
||||
touch ~/.gdb_enb_ue_s1
|
||||
chmod 777 ~/.gdb_enb_ue_s1
|
||||
echo "file $OPENAIR_DIR/targets/bin/oaisim.Rel10" > ~/.gdb_enb_ue_s1
|
||||
echo "file $OPENAIR_DIR/targets/bin/oaisim.Rel14" > ~/.gdb_enb_ue_s1
|
||||
echo "set args $exe_arguments" >> ~/.gdb_enb_ue_s1
|
||||
echo "run" >> ~/.gdb_enb_ue_s1
|
||||
cat ~/.gdb_enb_ue_s1
|
||||
|
||||
33
cmake_targets/tools/run_ue_s1
Normal file
33
cmake_targets/tools/run_ue_s1
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Carrier frequency in Hz
|
||||
#FREQ=2660000000 #FDD
|
||||
FREQ=2350000000 #TDD
|
||||
NRB=50
|
||||
TA=0
|
||||
|
||||
#9:trace, 8/7:debug, 6:info, 4:warn, 3:error
|
||||
LOGLEVEL=6
|
||||
|
||||
#enable or disable soft scope
|
||||
#SCOPE=''
|
||||
SCOPE='-d'
|
||||
|
||||
#enable or disable VCD logging
|
||||
VCD=''
|
||||
#VCD='-V'
|
||||
|
||||
ISTDD='-T'
|
||||
#ISTDD=''
|
||||
|
||||
#use external clock
|
||||
ECLK="--external-clock"
|
||||
#ECLK=""
|
||||
|
||||
#UE scan carrier
|
||||
#ISSCAN="--ue-scan-carrier"
|
||||
ISSCAN=""
|
||||
|
||||
sudo sh -c './init_nas_s1 UE'
|
||||
cd ../../targets/bin/
|
||||
sudo -E ./lte-softmodem.Rel10 -U -C$FREQ -r$NRB $ISSCAN --ue-txgain 70 --ue-rxgain 80 -A $TA $ECLK -W $ISTDD -g $LOGLEVEL $SCOPE 2>&1 | sudo tee /tmp/UE.log
|
||||
@@ -1,59 +0,0 @@
|
||||
export KERNEL_DIR=/lib/modules/$(shell uname -r)/
|
||||
CC=gcc
|
||||
CCC=gcc
|
||||
linux := $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi)
|
||||
|
||||
|
||||
CFLAGS += -std=gnu99
|
||||
#CFLAGS += -Wall -g -ggdb -Wstrict-prototypes -fno-strict-aliasing
|
||||
|
||||
# Need to force this option because default kernel module builder is wrong
|
||||
CFLAGS += $(call cc-option,-mpreferred-stack-boundary=4)
|
||||
|
||||
#For performance, if some option doesn't exist in all gcc versions, use $(call cc-option,MY_OPTION)
|
||||
CFLAGS += -O2
|
||||
CFLAGS += -funroll-loops
|
||||
CFLAGS += -Wno-packed-bitfield-compat
|
||||
|
||||
# This is the minimum CPU faetures for OAI
|
||||
CFLAGS += -mmmx -msse -msse2 -mssse3 -msse4.1
|
||||
# Add CPU features from local CPU
|
||||
#CFLAGS += -march=native
|
||||
|
||||
ifeq ($(OSTYPE),Cygwin)
|
||||
cygwin=1
|
||||
CFLAGS += -DCYGWIN
|
||||
else
|
||||
cygwin=0
|
||||
endif
|
||||
|
||||
ifeq ($(linux),1)
|
||||
CFLAGS +=
|
||||
LDFLAGS +=
|
||||
endif
|
||||
|
||||
ITTI_DIR = $(COMMON_UTILS_DIR)/itti
|
||||
|
||||
ITTI_OBJS = $(ITTI_DIR)/intertask_interface.o
|
||||
ITTI_OBJS += $(ITTI_DIR)/intertask_interface_dump.o
|
||||
ITTI_OBJS += $(ITTI_DIR)/backtrace.o
|
||||
ITTI_OBJS += $(ITTI_DIR)/memory_pools.o
|
||||
ITTI_OBJS += $(ITTI_DIR)/signals.o
|
||||
ITTI_OBJS += $(ITTI_DIR)/timer.o
|
||||
|
||||
|
||||
HASHTABLE_DIR = $(COMMON_UTILS_DIR)/collection/hashtable
|
||||
MSC_DIR = $(COMMON_UTILS_DIR)/msc
|
||||
|
||||
HASHTABLE_OBJS = $(HASHTABLE_DIR)/hashtable.o
|
||||
HASHTABLE_OBJS += $(HASHTABLE_DIR)/obj_hashtable.o
|
||||
|
||||
UTILS_OBJS = $(ITTI_OBJS) $(HASHTABLE_OBJS)
|
||||
|
||||
UTILS_incl = \
|
||||
-I$(COMMON_UTILS_DIR) \
|
||||
-I$(HASHTABLE_DIR) \
|
||||
-I$(ITTI_DIR) \
|
||||
-I$(MSC_DIR)
|
||||
|
||||
print-% : ; @echo $* = $($*)
|
||||
@@ -184,8 +184,30 @@ extern T_cache_t *T_cache;
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* we have 4 versions of T_HEADER:
|
||||
* - bad quality C++ version with time
|
||||
* - good quality C version with time
|
||||
* - bad quality C++ version without time
|
||||
* - good quality C version without time
|
||||
*/
|
||||
|
||||
#ifdef T_SEND_TIME
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
/* C++ version of T_HEADER with time */
|
||||
#define T_HEADER(x) \
|
||||
do { \
|
||||
struct timespec T_HEADER_time; \
|
||||
if (clock_gettime(CLOCK_REALTIME, &T_HEADER_time)) abort(); \
|
||||
memcpy(T_LOCAL_buf, &T_HEADER_time, sizeof(struct timespec)); \
|
||||
T_LOCAL_size += sizeof(struct timespec); \
|
||||
T_PUT_int(1, (int)(uintptr_t)(x)); \
|
||||
} while (0)
|
||||
|
||||
#else /* #ifdef __cplusplus */
|
||||
|
||||
/* C version of T_HEADER with time */
|
||||
#define T_HEADER(x) \
|
||||
do { \
|
||||
if (!__builtin_types_compatible_p(typeof(x), struct T_header *)) { \
|
||||
@@ -201,8 +223,21 @@ extern T_cache_t *T_cache;
|
||||
T_PUT_int(1, (int)(uintptr_t)(x)); \
|
||||
} while (0)
|
||||
|
||||
#endif /* #ifdef __cplusplus */
|
||||
|
||||
#else /* #ifdef T_SEND_TIME */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
/* C++ version of T_HEADER without time */
|
||||
#define T_HEADER(x) \
|
||||
do { \
|
||||
T_PUT_int(1, (int)(uintptr_t)(x)); \
|
||||
} while (0)
|
||||
|
||||
#else /* #ifdef __cplusplus */
|
||||
|
||||
/* C version of T_HEADER without time */
|
||||
#define T_HEADER(x) \
|
||||
do { \
|
||||
if (!__builtin_types_compatible_p(typeof(x), struct T_header *)) { \
|
||||
@@ -214,6 +249,8 @@ extern T_cache_t *T_cache;
|
||||
T_PUT_int(1, (int)(uintptr_t)(x)); \
|
||||
} while (0)
|
||||
|
||||
#endif /* #ifdef __cplusplus */
|
||||
|
||||
#endif /* #ifdef T_SEND_TIME */
|
||||
|
||||
#define T1(t) \
|
||||
|
||||
@@ -29,15 +29,15 @@ typedef struct {
|
||||
#define T_SHM_FILENAME "/T_shm_segment"
|
||||
|
||||
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
|
||||
#define VCD_NUM_FUNCTIONS 146
|
||||
#define VCD_NUM_FUNCTIONS 172
|
||||
|
||||
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
|
||||
#define VCD_NUM_VARIABLES 99
|
||||
#define VCD_NUM_VARIABLES 118
|
||||
|
||||
/* first VCD function (to be kept up to date! see in T_messages.txt) */
|
||||
#define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
|
||||
|
||||
/* first VCD variable (to be kept up to date! see in T_messages.txt) */
|
||||
#define VCD_FIRST_VARIABLE ((uintptr_t)T_VCD_VARIABLE_FRAME_NUMBER_TX_ENB)
|
||||
#define VCD_FIRST_VARIABLE ((uintptr_t)T_VCD_VARIABLE_FRAME_NUMBER_TX0_ENB)
|
||||
|
||||
#endif /* _T_defs_H_ */
|
||||
|
||||
@@ -16,7 +16,7 @@ ID = ENB_PHY_DL_TICK
|
||||
ID = ENB_PHY_DLSCH_UE_DCI
|
||||
DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
|
||||
ID = ENB_PHY_DLSCH_UE_ACK
|
||||
DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
@@ -28,7 +28,7 @@ ID = ENB_PHY_DLSCH_UE_NACK
|
||||
ID = ENB_PHY_ULSCH_UE_DCI
|
||||
DESC = eNodeB uplink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS : int,L : int,firstCCE
|
||||
ID = ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION
|
||||
DESC = eNodeB uplink UE retransmission due to PHICH NACK (see generate_phich_top)
|
||||
GROUP = ALL:PHY:GRAPHIC:ENB
|
||||
@@ -45,6 +45,10 @@ ID = ENB_PHY_INPUT_SIGNAL
|
||||
DESC = eNodeB received signal in the time domain for a duration of 1ms
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata
|
||||
ID = ENB_PHY_OUTPUT_SIGNAL
|
||||
DESC = eNodeB sent signal in the time domain for a duration of 1ms
|
||||
GROUP = ALL:PHY:HEAVY:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,antenna : buffer,txdata
|
||||
ID = ENB_PHY_UL_CHANNEL_ESTIMATE
|
||||
DESC = eNodeB channel estimation in the time domain
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
|
||||
@@ -61,6 +65,18 @@ ID = ENB_PHY_PUCCH_1_ENERGY
|
||||
DESC = eNodeB PUCCH 1 energy and threshold
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold
|
||||
ID = ENB_PHY_PHICH
|
||||
DESC = eNodeB PHICH
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,NGROUP : int,NSF : int,ngroup : int,nseq : int,ACK : int,first_rb : int,n_DMRS
|
||||
ID = ENB_PHY_MSG3_ALLOCATION
|
||||
DESC = eNodeB Msg3 allocation/reallocation
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,first_transmission : int,Msg3_frame : int,Msg3_subframe
|
||||
ID = ENB_PHY_INITIATE_RA_PROCEDURE
|
||||
DESC = eNodeB initiates a random access procedure after detecting enough energy for one of the preambles
|
||||
GROUP = ALL:PHY:ENB
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,preamble : int,energy : int,delay
|
||||
|
||||
#MAC logs
|
||||
ID = ENB_MAC_UE_DL_SDU
|
||||
@@ -70,7 +86,7 @@ ID = ENB_MAC_UE_DL_SDU
|
||||
ID = ENB_MAC_UE_UL_SCHEDULE
|
||||
DESC = MAC uplink UE scheduling decision
|
||||
GROUP = ALL:MAC:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS : int,ndi
|
||||
ID = ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION
|
||||
DESC = MAC uplink UE scheduling retransmission decision
|
||||
GROUP = ALL:MAC:ENB
|
||||
@@ -81,7 +97,7 @@ ID = ENB_MAC_UE_UL_PDU
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu
|
||||
ID = ENB_MAC_UE_UL_PDU_WITH_DATA
|
||||
DESC = MAC uplink UE received PDU
|
||||
GROUP = ALL:MAC:ENB:HEAVY
|
||||
GROUP = ALL:MAC:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu : buffer,data
|
||||
ID = ENB_MAC_UE_UL_SDU
|
||||
DESC = MAC uplink UE received SDU
|
||||
@@ -99,6 +115,10 @@ ID = ENB_MAC_UE_DL_PDU_WITH_DATA
|
||||
DESC = MAC downlink PDU for an UE
|
||||
GROUP = ALL:MAC:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
|
||||
ID = ENB_MAC_SCHEDULING_REQUEST
|
||||
DESC = MAC scheduling request detected for an UE
|
||||
GROUP = ALL:MAC:ENB
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,rnti
|
||||
|
||||
#RLC logs
|
||||
ID = ENB_RLC_DL
|
||||
@@ -411,6 +431,27 @@ ID = LEGACY_ENB_APP_TRACE
|
||||
GROUP = ALL:LEGACY_ENB_APP:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_FLEXRAN_AGENT_INFO
|
||||
DESC = FLEXRAN_AGENT legacy logs - info level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_INFO:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_ERROR
|
||||
DESC = FLEXRAN_AGENT legacy logs - error level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_ERROR:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_WARNING
|
||||
DESC = FLEXRAN_AGENT legacy logs - warning level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_WARNING:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_DEBUG
|
||||
DESC = FLEXRAN_AGENT legacy logs - debug level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_DEBUG:LEGACY
|
||||
FORMAT = string,log
|
||||
ID = LEGACY_FLEXRAN_AGENT_TRACE
|
||||
DESC = FLEXRAN_AGENT legacy logs - trace level
|
||||
GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
ID = LEGACY_SCTP_INFO
|
||||
DESC = SCTP legacy logs - info level
|
||||
GROUP = ALL:LEGACY_SCTP:LEGACY_GROUP_INFO:LEGACY
|
||||
@@ -772,6 +813,85 @@ ID = LEGACY_CLI_TRACE
|
||||
GROUP = ALL:LEGACY_CLI:LEGACY_GROUP_TRACE:LEGACY
|
||||
FORMAT = string,log
|
||||
|
||||
#################
|
||||
#### UE LOGS ####
|
||||
#################
|
||||
#general logs
|
||||
ID = UE_MASTER_TICK
|
||||
DESC = UE master tick - one tick per ms, to be used as "reference clock", mostly for ticktime view
|
||||
GROUP = ALL:GENERAL:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe
|
||||
|
||||
#PHY logs
|
||||
ID = UE_PHY_UL_TICK
|
||||
DESC = UE uplink tick - one tick per ms at start of uplink processing
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe
|
||||
ID = UE_PHY_DL_TICK
|
||||
DESC = UE downlink tick - one tick per ms at start of downlink processing
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe
|
||||
ID = UE_PHY_DLSCH_UE_DCI
|
||||
DESC = UE downlink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
|
||||
ID = UE_PHY_DLSCH_UE_ACK
|
||||
DESC = UE downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
ID = UE_PHY_DLSCH_UE_NACK
|
||||
DESC = UE downlink UE NACK as seen by the PHY layer in process_HARQ_feedback
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
ID = UE_PHY_ULSCH_UE_DCI
|
||||
DESC = UE uplink UE specific DCI as sent by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS
|
||||
ID = UE_PHY_ULSCH_UE_ACK
|
||||
DESC = UE uplink UE ACK as seen by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
ID = UE_PHY_ULSCH_UE_NACK
|
||||
DESC = UE uplink UE NACK as seen by the PHY layer
|
||||
GROUP = ALL:PHY:GRAPHIC:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid
|
||||
ID = UE_PHY_INPUT_SIGNAL
|
||||
DESC = UE received signal in the time domain for a duration of 1ms
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata
|
||||
ID = UE_PHY_DL_CHANNEL_ESTIMATE
|
||||
DESC = UE channel estimation in the time domain
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t
|
||||
ID = UE_PHY_PDCCH_IQ
|
||||
DESC = UE PDCCH received IQ data
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,nb_rb : int,NB_RB_DL : int,symbols_per_tti : buffer,rxdataF_comp
|
||||
ID = UE_PHY_PDCCH_ENERGY
|
||||
DESC = UE PDSCH 1 energy and threshold
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,pdcch_ch_level00 : int,pdcch_ch_level01 : int,pdcch_ch_level10: int,pdcch_ch_level11
|
||||
ID = UE_PHY_PDSCH_IQ
|
||||
DESC = UE PDSCH received IQ data
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
|
||||
ID = UE_PHY_PDSCH_ENERGY
|
||||
DESC = UE PDSCH 1 energy and threshold
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,pdsch_ch_level00 : int,pdsch_ch_level01 : int,pdsch_ch_level10: int,pdsch_ch_level11
|
||||
ID = UE_PHY_PUSCH_TX_POWER
|
||||
DESC = UE PUSCH tx power
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_id : int,frame : int,subframe : int,p0_pusch : int,ampl: int,g_pusch: int,pl: int,nb_rb
|
||||
ID = UE_PHY_PUCCH_TX_POWER
|
||||
DESC = UE PDSCH 1 energy and threshold
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_id : int,frame : int,subframe : int,p0_pucch : int,ampl: int,g_pucch: int,pl
|
||||
ID = UE_PHY_MEAS
|
||||
DESC = UE PHY measurements
|
||||
GROUP = ALL:PHY:GRAPHIC:HEAVY:UE
|
||||
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,rsrp : int,rssi : int,snr: int,rx_power: int,noise_power: int,w_cqi: int,freq_offset
|
||||
|
||||
#for debug/test - not used
|
||||
ID = first
|
||||
ID = buf_test
|
||||
@@ -806,12 +926,36 @@ ID = buf_test
|
||||
|
||||
#variables
|
||||
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_TX_ENB
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_TX0_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_RX_ENB
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_TX1_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_RX0_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB
|
||||
DESC = VCD variable FRAME_NUMBER_RX1_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB
|
||||
DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB
|
||||
DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB
|
||||
DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB
|
||||
DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_RUNTIME_TX_ENB
|
||||
@@ -822,28 +966,36 @@ ID = VCD_VARIABLE_RUNTIME_RX_ENB
|
||||
DESC = VCD variable RUNTIME_RX_ENB
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX_UE
|
||||
DESC = VCD variable FRAME_NUMBER_TX_UE
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE
|
||||
DESC = VCD variable FRAME_NUMBER_TX0_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX_UE
|
||||
DESC = VCD variable FRAME_NUMBER_RX_UE
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE
|
||||
DESC = VCD variable FRAME_NUMBER_TX1_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SLOT_NUMBER_TX_UE
|
||||
DESC = VCD variable SLOT_NUMBER_TX_UE
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE
|
||||
DESC = VCD variable FRAME_NUMBER_RX0_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SLOT_NUMBER_RX_UE
|
||||
DESC = VCD variable SLOT_NUMBER_RX_UE
|
||||
ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE
|
||||
DESC = VCD variable FRAME_NUMBER_RX1_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_TX_UE
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_TX0_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_RX_UE
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_TX1_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_RX0_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE
|
||||
DESC = VCD variable SUBFRAME_NUMBER_RX1_UE
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_MISSED_SLOTS_ENB
|
||||
@@ -898,6 +1050,10 @@ ID = VCD_VARIABLE_TRX_TST
|
||||
DESC = VCD variable TRX_TST
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_TRX_WRITE_FLAGS
|
||||
DESC = VCD variable TRX_WRITE_FLAGS
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_TX_TS
|
||||
DESC = VCD variable TX_TS
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
@@ -1202,6 +1358,46 @@ ID = VCD_VARIABLE_UE0_SFN7
|
||||
DESC = VCD variable UE0_SFN7
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SEND_IF4_SYMBOL
|
||||
DESC = VCD variable SEND_IF4_SYMBOL
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_RECV_IF4_SYMBOL
|
||||
DESC = VCD variable RECV_IF4_SYMBOL
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_SEND_IF5_PKT_ID
|
||||
DESC = VCD variable SEND_IF5_PKT_ID
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_RECV_IF5_PKT_ID
|
||||
DESC = VCD variable RECV_IF5_PKT_ID
|
||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE
|
||||
DESC = VCD variable UE_PDCP_FLUSH_SIZE
|
||||
GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR
|
||||
DESC = VCD variable UE_PDCP_FLUSH_ERR
|
||||
GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_READ_NS
|
||||
DESC = VCD variable UE0_TRX_READ_NS
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_WRITE_NS
|
||||
DESC = VCD variable UE0_TRX_WRITE_NS
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING
|
||||
DESC = VCD variable UE0_TRX_READ_NS_MISSING
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING
|
||||
DESC = VCD variable UE0_TRX_WRITE_NS_MISSING
|
||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||
FORMAT = ulong,value
|
||||
|
||||
#functions
|
||||
|
||||
@@ -1217,92 +1413,80 @@ ID = VCD_FUNCTION_TRX_WRITE
|
||||
DESC = VCD function TRX_WRITE
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX0
|
||||
DESC = VCD function eNB_PROC_TX0
|
||||
ID = VCD_FUNCTION_TRX_READ_IF
|
||||
DESC = VCD function TRX_READ_IF
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX0
|
||||
DESC = VCD function eNB_PROC_RX0
|
||||
ID = VCD_FUNCTION_TRX_WRITE_IF
|
||||
DESC = VCD function TRX_WRITE_IF
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX1
|
||||
DESC = VCD function eNB_PROC_TX1
|
||||
ID = VCD_FUNCTION_eNB_PROC_RXTX0
|
||||
DESC = VCD function eNB_PROC_RXTX0
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX1
|
||||
DESC = VCD function eNB_PROC_RX1
|
||||
ID = VCD_FUNCTION_eNB_PROC_RXTX1
|
||||
DESC = VCD function eNB_PROC_RXTX1
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX2
|
||||
DESC = VCD function eNB_PROC_TX2
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX2
|
||||
DESC = VCD function eNB_PROC_RX2
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX3
|
||||
DESC = VCD function eNB_PROC_TX3
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX3
|
||||
DESC = VCD function eNB_PROC_RX3
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX4
|
||||
DESC = VCD function eNB_PROC_TX4
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX4
|
||||
DESC = VCD function eNB_PROC_RX4
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX5
|
||||
DESC = VCD function eNB_PROC_TX5
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX5
|
||||
DESC = VCD function eNB_PROC_RX5
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX6
|
||||
DESC = VCD function eNB_PROC_TX6
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX6
|
||||
DESC = VCD function eNB_PROC_RX6
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX7
|
||||
DESC = VCD function eNB_PROC_TX7
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX7
|
||||
DESC = VCD function eNB_PROC_RX7
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX8
|
||||
DESC = VCD function eNB_PROC_TX8
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX8
|
||||
DESC = VCD function eNB_PROC_RX8
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_TX9
|
||||
DESC = VCD function eNB_PROC_TX9
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_PROC_RX9
|
||||
DESC = VCD function eNB_PROC_RX9
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_THREAD_TX
|
||||
DESC = VCD function UE_THREAD_TX
|
||||
ID = VCD_FUNCTION_UE_THREAD_SYNCH
|
||||
DESC = VCD function UE_THREAD_SYNCH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_THREAD_RX
|
||||
DESC = VCD function UE_THREAD_RX
|
||||
ID = VCD_FUNCTION_UE_THREAD_RXTX0
|
||||
DESC = VCD function UE_THREAD_RXTX0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_THREAD_RXTX1
|
||||
DESC = VCD function UE_THREAD_RXTX1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_READ_SF9
|
||||
DESC = VCD function TRX_READ_SF9
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_WRITE_SF9
|
||||
DESC = VCD function TRX_WRITE_SF9
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0
|
||||
DESC = VCD function UE_SIGNAL_COND_RXTX0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1
|
||||
DESC = VCD function UE_SIGNAL_COND_RXTX1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0
|
||||
DESC = VCD function UE_WAIT_COND_RXTX0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1
|
||||
DESC = VCD function UE_WAIT_COND_RXTX1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_eNB_TX
|
||||
@@ -1377,8 +1561,28 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_TX
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_TX1
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON1
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON1
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_SLOT_FEP
|
||||
DESC = VCD function ENB_SLOT_FEP
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX
|
||||
@@ -1389,6 +1593,26 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX
|
||||
DESC = VCD function PHY_PROCEDURES_UE_RX
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR
|
||||
DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_LTE
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1477,6 +1701,22 @@ ID = VCD_FUNCTION_RX_PHICH
|
||||
DESC = VCD function RX_PHICH
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC
|
||||
DESC = VCD function PDSCH_PROC
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_SI
|
||||
DESC = VCD function PDSCH_PROC_SI
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_P
|
||||
DESC = VCD function PDSCH_PROC_P
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDSCH_PROC_RA
|
||||
DESC = VCD function PDSCH_PROC_RA
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2
|
||||
DESC = VCD function PHY_UE_CONFIG_SIB2
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
@@ -1561,6 +1801,10 @@ ID = VCD_FUNCTION_UE_ULSCH_ENCODING
|
||||
DESC = VCD function UE_ULSCH_ENCODING
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI
|
||||
DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING
|
||||
DESC = VCD function UE_ULSCH_SCRAMBLING
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
@@ -1573,10 +1817,22 @@ ID = VCD_FUNCTION_ENB_DLSCH_ENCODING
|
||||
DESC = VCD function ENB_DLSCH_ENCODING
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W
|
||||
DESC = VCD function ENB_DLSCH_ENCODING_W
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING
|
||||
DESC = VCD function ENB_DLSCH_SCRAMBLING
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_BEAM_PRECODING
|
||||
DESC = VCD function ENB_BEAM_PRECODING
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_ENB_OFDM_MODULATION
|
||||
DESC = VCD function ENB_OFDM_MODULATION
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_MACPHY_INIT
|
||||
DESC = VCD function MACPHY_INIT
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1645,6 +1901,10 @@ ID = VCD_FUNCTION_UE_DECODE_SI
|
||||
DESC = VCD function UE_DECODE_SI
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_DECODE_PCCH
|
||||
DESC = VCD function UE_DECODE_PCCH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_UE_DECODE_CCCH
|
||||
DESC = VCD function UE_DECODE_CCCH
|
||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||
@@ -1685,6 +1945,10 @@ ID = VCD_FUNCTION_RLC_DATA_REQ
|
||||
DESC = VCD function RLC_DATA_REQ
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
#ID = VCD_FUNCTION_RLC_DATA_IND
|
||||
# DESC = VCD function RLC_DATA_IND
|
||||
# GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
# FORMAT = int,value
|
||||
ID = VCD_FUNCTION_MAC_RLC_STATUS_IND
|
||||
DESC = VCD function MAC_RLC_STATUS_IND
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1729,6 +1993,22 @@ ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY
|
||||
DESC = VCD function PDCP_VALIDATE_SECURITY
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDCP_FIFO_READ
|
||||
DESC = VCD function PDCP_FIFO_READ
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER
|
||||
DESC = VCD function PDCP_FIFO_READ_BUFFER
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDCP_FIFO_FLUSH
|
||||
DESC = VCD function PDCP_FIFO_FLUSH
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER
|
||||
DESC = VCD function PDCP_FIFO_FLUSH_BUFFER
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_RRC_RX_TX
|
||||
DESC = VCD function RRC_RX_TX
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1789,3 +2069,27 @@ ID = VCD_FUNCTION_TEST
|
||||
DESC = VCD function TEST
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_SEND_IF4
|
||||
DESC = VCD function SEND_IF4
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_RECV_IF4
|
||||
DESC = VCD function RECV_IF4
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_SEND_IF5
|
||||
DESC = VCD function SEND_IF5
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_RECV_IF5
|
||||
DESC = VCD function RECV_IF5
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_COMPR_IF
|
||||
DESC = VCD function TRX_COMPR_IF
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
ID = VCD_FUNCTION_TRX_DECOMPR_IF
|
||||
DESC = VCD function TRX_DECOMPR_IF
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
FORMAT = int,value
|
||||
|
||||
@@ -5,7 +5,8 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
|
||||
|
||||
LIBS=-lX11 -lm -lpng -lXft
|
||||
|
||||
all: record replay extract_config textlog enb vcd macpdu2wireshark
|
||||
all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
|
||||
extract_input_subframe
|
||||
|
||||
record: utils.o record.o database.o config.o
|
||||
$(CC) $(CFLAGS) -o record $^ $(LIBS)
|
||||
@@ -16,6 +17,10 @@ replay: utils.o replay.o
|
||||
extract_config: extract_config.o
|
||||
$(CC) $(CFLAGS) -o extract_config $^ $(LIBS)
|
||||
|
||||
extract_input_subframe: extract_input_subframe.o database.o event.o utils.o \
|
||||
config.o
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||
|
||||
textlog: utils.o textlog.o database.o event.o handler.o config.o \
|
||||
event_selector.o view/view.a gui/gui.a logger/logger.a \
|
||||
filter/filter.a
|
||||
@@ -26,6 +31,11 @@ enb: utils.o enb.o database.o event.o handler.o config.o \
|
||||
filter/filter.a
|
||||
$(CC) $(CFLAGS) -o enb $^ $(LIBS)
|
||||
|
||||
ue: utils.o ue.o database.o event.o handler.o config.o \
|
||||
event_selector.o view/view.a gui/gui.a logger/logger.a \
|
||||
filter/filter.a
|
||||
$(CC) $(CFLAGS) -o ue $^ $(LIBS)
|
||||
|
||||
vcd: utils.o vcd.o database.o event.o handler.o config.o \
|
||||
event_selector.o view/view.a gui/gui.a logger/logger.a \
|
||||
filter/filter.a
|
||||
@@ -53,8 +63,8 @@ filter/filter.a:
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f *.o core tracer_remote textlog enb vcd record replay
|
||||
rm -f extract_config macpdu2wireshark
|
||||
rm -f *.o core tracer_remote textlog enb ue vcd record replay
|
||||
rm -f extract_config macpdu2wireshark extract_input_subframe
|
||||
cd gui && make clean
|
||||
cd view && make clean
|
||||
cd logger && make clean
|
||||
|
||||
@@ -24,6 +24,30 @@ typedef struct {
|
||||
view *pdcpview;
|
||||
view *rrcview;
|
||||
view *legacy;
|
||||
widget *current_ue_label;
|
||||
widget *prev_ue_button;
|
||||
widget *next_ue_button;
|
||||
widget *pusch_iq_ue_xy_plot;
|
||||
widget *ul_estimate_ue_xy_plot;
|
||||
widget *pucch1_energy_ue_xy_plot;
|
||||
widget *pucch_iq_ue_xy_plot;
|
||||
widget *dl_ul_harq_ue_label;
|
||||
widget *dl_mcs_xy_plot;
|
||||
widget *ul_mcs_xy_plot;
|
||||
logger *pusch_iq_ue_logger;
|
||||
logger *ul_estimate_ue_logger;
|
||||
logger *pucch1_energy_ue_threshold_logger;
|
||||
logger *pucch1_energy_ue_energy_logger;
|
||||
logger *pucch_iq_ue_logger;
|
||||
logger *dl_dci_logger[8];
|
||||
logger *dl_ack_logger[8];
|
||||
logger *dl_nack_logger[8];
|
||||
logger *ul_dci_logger[8];
|
||||
logger *ul_dci_retransmission_logger[8];
|
||||
logger *ul_ack_logger[8];
|
||||
logger *ul_nack_logger[8];
|
||||
logger *dl_mcs_logger;
|
||||
logger *ul_mcs_logger;
|
||||
} enb_gui;
|
||||
|
||||
typedef struct {
|
||||
@@ -31,6 +55,9 @@ typedef struct {
|
||||
int *is_on;
|
||||
int nevents;
|
||||
pthread_mutex_t lock;
|
||||
enb_gui *e;
|
||||
int ue; /* what UE is displayed in the UE specific views */
|
||||
void *database;
|
||||
} enb_data;
|
||||
|
||||
void is_on_changed(void *_d)
|
||||
@@ -86,18 +113,109 @@ static void *gui_thread(void *_g)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static filter *ticktime_filter(void *database, char *event, int i)
|
||||
static filter *ticktime_filter(void *database, char *event, int i, int ue)
|
||||
{
|
||||
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
|
||||
return
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(0)),
|
||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)),
|
||||
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
|
||||
}
|
||||
|
||||
static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
static void set_current_ue(gui *g, enb_data *e, int ue)
|
||||
{
|
||||
int i;
|
||||
char s[256];
|
||||
|
||||
sprintf(s, "[UE %d] ", ue);
|
||||
label_set_text(g, e->e->current_ue_label, s);
|
||||
sprintf(s, "PUSCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pusch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "UL estimated channel [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->ul_estimate_ue_xy_plot, s);
|
||||
sprintf(s, "PUCCH1 energy (SR) [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pucch1_energy_ue_xy_plot, s);
|
||||
sprintf(s, "PUCCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pucch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "DL/UL HARQ (x8) [UE %d]", ue);
|
||||
label_set_text(g, e->e->dl_ul_harq_ue_label, s);
|
||||
sprintf(s, "DL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->dl_mcs_xy_plot, s);
|
||||
sprintf(s, "UL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->ul_mcs_xy_plot, s);
|
||||
|
||||
logger_set_filter(e->e->pusch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->ul_estimate_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch1_energy_ue_threshold_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch1_energy_ue_energy_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
for (i = 0; i < 8; i++) {
|
||||
logger_set_filter(e->e->dl_dci_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_DCI", i, ue));
|
||||
logger_set_filter(e->e->dl_ack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->dl_nack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_NACK", i, ue));
|
||||
logger_set_filter(e->e->ul_dci_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_DCI", i, ue));
|
||||
logger_set_filter(e->e->ul_dci_retransmission_logger[i],
|
||||
ticktime_filter(e->database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));
|
||||
logger_set_filter(e->e->ul_ack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->ul_nack_logger[i],
|
||||
ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NACK", i, ue));
|
||||
}
|
||||
logger_set_filter(e->e->dl_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_DLSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->ul_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_ULSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
}
|
||||
|
||||
static void click(void *private, gui *g,
|
||||
char *notification, widget *w, void *notification_data)
|
||||
{
|
||||
int *d = notification_data;
|
||||
int button = d[0];
|
||||
enb_data *ed = private;
|
||||
enb_gui *e = ed->e;
|
||||
int ue = ed->ue;
|
||||
|
||||
if (button != 1) return;
|
||||
if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; }
|
||||
if (w == e->next_ue_button) ue++;
|
||||
|
||||
if (pthread_mutex_lock(&ed->lock)) abort();
|
||||
if (ue != ed->ue) {
|
||||
set_current_ue(g, ed, ue);
|
||||
ed->ue = ue;
|
||||
}
|
||||
if (pthread_mutex_unlock(&ed->lock)) abort();
|
||||
}
|
||||
|
||||
static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database,
|
||||
enb_data *ed)
|
||||
{
|
||||
widget *main_window;
|
||||
widget *top_container;
|
||||
@@ -113,7 +231,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
widget *text;
|
||||
view *textview;
|
||||
int i;
|
||||
widget *w;
|
||||
widget *w, *w2;
|
||||
view *v;
|
||||
logger *l;
|
||||
|
||||
@@ -124,7 +242,26 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
logo = new_image(g, openair_logo_png, openair_logo_png_len);
|
||||
widget_add_child(g, line, logo, -1);
|
||||
|
||||
/* logo + prev/next UE buttons */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, col, logo, -1);
|
||||
w = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, col, w, -1);
|
||||
w2 = new_label(g, "");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
e->current_ue_label = w2;
|
||||
/* TODO: use button widget, not label widget */
|
||||
w2 = new_label(g, " [prev UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->prev_ue_button = w2;
|
||||
w2 = new_label(g, " [next UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->next_ue_button = w2;
|
||||
widget_add_child(g, line, col, -1);
|
||||
|
||||
input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20);
|
||||
widget_add_child(g, line, input_signal_plot, -1);
|
||||
xy_plot_set_range(g, input_signal_plot, 0, 7680*10, 20, 70);
|
||||
@@ -138,21 +275,20 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(input_signal_log, input_signal_view);
|
||||
|
||||
/* UE 0 PUSCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "PUSCH IQ [UE 0]", 50);
|
||||
/* UE x PUSCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pusch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -1000, 1000, -1000, 1000);
|
||||
l = new_iqlog(h, database, "ENB_PHY_PUSCH_IQ", "nb_rb",
|
||||
"N_RB_UL", "symbols_per_tti", "pusch_comp");
|
||||
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pusch_iq_ue_logger = l;
|
||||
|
||||
/* UE 0 estimated UL channel */
|
||||
w = new_xy_plot(g, 280, 55, "UL estimated channel [UE 0]", 50);
|
||||
/* UE x estimated UL channel */
|
||||
w = new_xy_plot(g, 280, 55, "", 50);
|
||||
e->ul_estimate_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 512*10, -10, 80);
|
||||
l = new_framelog(h, database,
|
||||
@@ -161,43 +297,87 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
framelog_set_update_only_at_sf9(l, 0);
|
||||
v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->ul_estimate_ue_logger = l;
|
||||
|
||||
/* UE 0 PUCCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "PUCCH1 energy (SR) [UE 0]", 50);
|
||||
/* UE x PUCCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "", 50);
|
||||
e->pucch1_energy_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "threshold", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch1_energy_ue_threshold_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "energy", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch1_energy_ue_energy_logger = l;
|
||||
|
||||
/* UE 0 PUCCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "PUCCH IQ [UE 0]", 50);
|
||||
/* UE x PUCCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pucch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -100, 100, -100, 100);
|
||||
xy_plot_set_range(g, w, -2000, 2000, -2000, 2000);
|
||||
l = new_iqdotlog(h, database, "ENB_PHY_PUCCH_1AB_IQ", "I", "Q");
|
||||
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
logger_set_filter(l,
|
||||
filter_eq(
|
||||
filter_evarg(database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
|
||||
filter_int(0)));
|
||||
e->pucch_iq_ue_logger = l;
|
||||
|
||||
/* UE x DL mcs */
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->dl_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_DLSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->dl_mcs_logger = l;
|
||||
|
||||
/* UE x UL mcs */
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->ul_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->ul_mcs_logger = l;
|
||||
|
||||
/* UE x DL PHY (truly: DCI) throughput */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
w = new_xy_plot(g, 70, 10, "DL PHY [0]", 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1000, 0, 100000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_DLSCH_UE_DCI", "TBS");
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2);
|
||||
logger_add_view(l, v);
|
||||
|
||||
/* UE x UL PHY (truly: DCI) throughput */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
w = new_xy_plot(g, 70, 10, "UL PHY [0]", 35);
|
||||
w2 = new_textarea(g, 70, 11, 64);
|
||||
xy_plot_set_range(g, w, 0, 1000, 0, 100000);
|
||||
xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK);
|
||||
widget_add_child(g, col, w2, -1);
|
||||
widget_add_child(g, col, w, -1);
|
||||
container_set_child_growable(g, col, w, 1);
|
||||
l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe",
|
||||
"ENB_PHY_ULSCH_UE_DCI", "TBS");
|
||||
v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2);
|
||||
logger_add_view(l, v);
|
||||
|
||||
/* downlink/uplink UE DCIs */
|
||||
widget_add_child(g, top_container,
|
||||
@@ -250,8 +430,8 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
logger_add_view(timelog, subview);
|
||||
|
||||
/* harq processes' ticktime view */
|
||||
widget_add_child(g, top_container,
|
||||
new_label(g,"DL/UL HARQ (x8) [UE 0]"), -1);
|
||||
e->dl_ul_harq_ue_label = new_label(g, "");
|
||||
widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1);
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
timeline_plot = new_timeline(g, 512, 2*8+2, 3);
|
||||
@@ -271,15 +451,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
/* tick on UL view */
|
||||
subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL harq pids */
|
||||
/* DL DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_DCI",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_DCI", i));
|
||||
e->dl_dci_logger[i] = timelog;
|
||||
}
|
||||
/* DL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -288,8 +467,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_ACK", i));
|
||||
e->dl_ack_logger[i] = timelog;
|
||||
}
|
||||
/* DL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -298,10 +476,9 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_DLSCH_UE_NACK", i));
|
||||
e->dl_nack_logger[i] = timelog;
|
||||
}
|
||||
/* UL harq pids */
|
||||
/* UL DCI/retransmission without DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
/* first transmission */
|
||||
timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_DCI",
|
||||
@@ -309,17 +486,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_DCI", i));
|
||||
e->ul_dci_logger[i] = timelog;
|
||||
/* retransmission */
|
||||
timelog = new_ticklog(h, database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#99f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i));
|
||||
e->ul_dci_retransmission_logger[i] = timelog;
|
||||
}
|
||||
/* UL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -328,8 +502,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_ACK", i));
|
||||
e->ul_ack_logger[i] = timelog;
|
||||
}
|
||||
/* UL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -338,8 +511,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
logger_set_filter(timelog,
|
||||
ticktime_filter(database, "ENB_PHY_ULSCH_UE_NACK", i));
|
||||
e->ul_nack_logger[i] = timelog;
|
||||
}
|
||||
|
||||
/* phy/mac/rlc/pdcp/rrc textlog */
|
||||
@@ -416,6 +588,10 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
|
||||
widget_add_child(g, top_container, text, -1);
|
||||
container_set_child_growable(g, top_container, text, 1);
|
||||
e->legacy = new_view_textlist(10000, 10, g, text);
|
||||
|
||||
set_current_ue(g, ed, 0);
|
||||
register_notifier(g, "click", e->prev_ue_button, click, ed);
|
||||
register_notifier(g, "click", e->next_ue_button, click, ed);
|
||||
}
|
||||
|
||||
void view_add_log(view *v, char *log, event_handler *h, void *database,
|
||||
@@ -495,7 +671,11 @@ int main(int n, char **v)
|
||||
g = gui_init();
|
||||
new_thread(gui_thread, g);
|
||||
|
||||
enb_main_gui(&eg, g, h, database);
|
||||
enb_data.ue = 0;
|
||||
enb_data.e = ⪚
|
||||
enb_data.database = database;
|
||||
|
||||
enb_main_gui(&eg, g, h, database, &enb_data);
|
||||
|
||||
for (i = 0; i < number_of_events; i++) {
|
||||
logger *textlog;
|
||||
@@ -525,9 +705,9 @@ int main(int n, char **v)
|
||||
on_off(database, "ENB_PHY_PUCCH_1_ENERGY", is_on, 1);
|
||||
on_off(database, "ENB_PHY_PUCCH_1AB_IQ", is_on, 1);
|
||||
|
||||
on_off(database, "LEGACY_RRC_INFO", is_on, 1);
|
||||
on_off(database, "LEGACY_RRC_ERROR", is_on, 1);
|
||||
on_off(database, "LEGACY_RRC_WARNING", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
|
||||
|
||||
view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_DCI", h, database, is_on);
|
||||
view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_ACK", h, database, is_on);
|
||||
@@ -639,7 +819,9 @@ restart:
|
||||
event e;
|
||||
e = get_event(enb_data.socket, v, database);
|
||||
if (e.type == -1) goto restart;
|
||||
if (pthread_mutex_lock(&enb_data.lock)) abort();
|
||||
handle_event(h, e);
|
||||
if (pthread_mutex_unlock(&enb_data.lock)) abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
109
common/utils/T/tracer/extract_input_subframe.c
Normal file
109
common/utils/T/tracer/extract_input_subframe.c
Normal file
@@ -0,0 +1,109 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include "database.h"
|
||||
#include "event.h"
|
||||
#include "config.h"
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
printf(
|
||||
"usage: [options] <file> <frame> <subframe>\n"
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -v verbose\n"
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int n, char **v)
|
||||
{
|
||||
char *database_filename = NULL;
|
||||
void *database;
|
||||
int i;
|
||||
int input_event_id;
|
||||
database_event_format f;
|
||||
char *file = NULL;
|
||||
int fd;
|
||||
int frame = -1, subframe = -1;
|
||||
int frame_arg, subframe_arg, buffer_arg;
|
||||
int verbose = 0;
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d"))
|
||||
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-v")) { verbose = 1; continue; }
|
||||
if (file == NULL) { file = v[i]; continue; }
|
||||
if (frame == -1) { frame = atoi(v[i]); continue; }
|
||||
if (subframe == -1) { subframe = atoi(v[i]); continue; }
|
||||
usage();
|
||||
}
|
||||
if (file == NULL || frame == -1 || subframe == -1) usage();
|
||||
|
||||
if (database_filename == NULL) {
|
||||
printf("ERROR: provide a database file (-d)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
database = parse_database(database_filename);
|
||||
|
||||
load_config_file(database_filename);
|
||||
|
||||
input_event_id = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL");
|
||||
f = get_format(database, input_event_id);
|
||||
|
||||
frame_arg = subframe_arg = buffer_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], "frame")) {
|
||||
if (frame_arg != -1) goto err;
|
||||
if (strcmp(f.type[i], "int")) goto err;
|
||||
frame_arg = i;
|
||||
}
|
||||
if (!strcmp(f.name[i], "subframe")) {
|
||||
if (subframe_arg != -1) goto err;
|
||||
if (strcmp(f.type[i], "int")) goto err;
|
||||
subframe_arg = i;
|
||||
}
|
||||
if (!strcmp(f.name[i], "rxdata")) {
|
||||
if (buffer_arg != -1) goto err;
|
||||
if (strcmp(f.type[i], "buffer")) goto err;
|
||||
buffer_arg = i;
|
||||
}
|
||||
continue;
|
||||
err:
|
||||
printf("cannot deal with ENB_PHY_INPUT_SIGNAL from database file\n");
|
||||
exit(1);
|
||||
}
|
||||
if (frame_arg == -1 || subframe_arg == -1 || buffer_arg == -1) goto err;
|
||||
|
||||
fd = open(file, O_RDONLY);
|
||||
if (fd == -1) { perror(file); exit(1); }
|
||||
|
||||
/* get wanted frame/subframe */
|
||||
while (1) {
|
||||
char v[T_BUFFER_MAX];
|
||||
event e;
|
||||
e = get_event(fd, v, database);
|
||||
if (e.type == -1) break;
|
||||
if (e.type != input_event_id) continue;
|
||||
if (verbose)
|
||||
printf("input frame %d subframe %d size %d\n",
|
||||
e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
|
||||
if (!(frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i))
|
||||
continue;
|
||||
#if 0
|
||||
for (i = 0; i < e.e[buffer_arg].bsize/2; i++) {
|
||||
short *x = e.e[buffer_arg].b;
|
||||
x[i] *= 14;
|
||||
}
|
||||
#endif
|
||||
fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, stdout);
|
||||
fflush(stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("frame %d subframe %d not found\n", frame, subframe);
|
||||
return 0;
|
||||
}
|
||||
@@ -13,6 +13,7 @@ struct filter {
|
||||
} v;
|
||||
|
||||
int (*eval)(struct filter *this, event e);
|
||||
void (*free)(struct filter *this);
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -52,7 +53,23 @@ int eval_evarg(struct filter *f, event e)
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* filter construction functions */
|
||||
/* free memory functions */
|
||||
/****************************************************************************/
|
||||
|
||||
void free_op2(struct filter *f)
|
||||
{
|
||||
free_filter(f->v.op2.a);
|
||||
free_filter(f->v.op2.b);
|
||||
free(f);
|
||||
}
|
||||
|
||||
void free_noop(struct filter *f)
|
||||
{
|
||||
free(f);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* filter construction/destruction functions */
|
||||
/****************************************************************************/
|
||||
|
||||
filter *filter_and(filter *a, filter *b)
|
||||
@@ -60,6 +77,7 @@ filter *filter_and(filter *a, filter *b)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_and;
|
||||
ret->free = free_op2;
|
||||
ret->v.op2.a = a;
|
||||
ret->v.op2.b = b;
|
||||
return ret;
|
||||
@@ -70,6 +88,7 @@ filter *filter_eq(filter *a, filter *b)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_eq;
|
||||
ret->free = free_op2;
|
||||
ret->v.op2.a = a;
|
||||
ret->v.op2.b = b;
|
||||
return ret;
|
||||
@@ -80,6 +99,7 @@ filter *filter_int(int v)
|
||||
struct filter *ret = calloc(1, sizeof(struct filter));
|
||||
if (ret == NULL) abort();
|
||||
ret->eval = eval_int;
|
||||
ret->free = free_noop;
|
||||
ret->v.v = v;
|
||||
return ret;
|
||||
}
|
||||
@@ -97,6 +117,7 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
|
||||
f = get_format(database, event_id);
|
||||
|
||||
ret->eval = eval_evarg;
|
||||
ret->free = free_noop;
|
||||
ret->v.evarg.event_type = event_id;
|
||||
ret->v.evarg.arg_index = -1;
|
||||
|
||||
@@ -114,6 +135,14 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void free_filter(filter *_f)
|
||||
{
|
||||
struct filter *f;
|
||||
if (_f == NULL) return;
|
||||
f = _f;
|
||||
f->free(f);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* eval function */
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -12,4 +12,6 @@ filter *filter_evarg(void *database, char *event_name, char *varname);
|
||||
|
||||
int filter_eval(filter *f, event e);
|
||||
|
||||
void free_filter(filter *f);
|
||||
|
||||
#endif /* _FILTER_H_ */
|
||||
|
||||
@@ -2,8 +2,8 @@ CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I/usr/include/X11/Xft -I/usr/include/freetype2
|
||||
|
||||
OBJS=init.o loop.o toplevel_window.o x.o container.o widget.o \
|
||||
gui.o label.o event.o xy_plot.o textlist.o notify.o positioner.o \
|
||||
timeline.o space.o image.o
|
||||
gui.o label.o textarea.o event.o xy_plot.o textlist.o notify.o \
|
||||
positioner.o timeline.o space.o image.o
|
||||
|
||||
gui.a: $(OBJS)
|
||||
ar cr gui.a $(OBJS)
|
||||
|
||||
@@ -14,6 +14,10 @@ typedef void widget;
|
||||
|
||||
#define DEFAULT_FONT 0
|
||||
|
||||
/* tic type for XY plot */
|
||||
#define XY_PLOT_DEFAULT_TICK 0
|
||||
#define XY_PLOT_SCROLL_TICK 1
|
||||
|
||||
/* key modifiers */
|
||||
#define KEY_SHIFT (1<<0)
|
||||
#define KEY_CONTROL (1<<1)
|
||||
@@ -30,6 +34,7 @@ widget *new_toplevel_window(gui *gui, int width, int height, char *title);
|
||||
widget *new_container(gui *gui, int vertical);
|
||||
widget *new_positioner(gui *gui);
|
||||
widget *new_label(gui *gui, const char *text);
|
||||
widget *new_textarea(gui *gui, int width, int height, int maxsize);
|
||||
widget *new_xy_plot(gui *gui, int width, int height, char *label,
|
||||
int vruler_width);
|
||||
widget *new_textlist(gui *gui, int width, int nlines, int background_color);
|
||||
@@ -39,6 +44,9 @@ widget *new_space(gui *gui, int width, int height);
|
||||
widget *new_image(gui *gui, unsigned char *data, int length);
|
||||
|
||||
void label_set_clickable(gui *gui, widget *label, int clickable);
|
||||
void label_set_text(gui *gui, widget *label, char *text);
|
||||
|
||||
void textarea_set_text(gui *gui, widget *textarea, char *text);
|
||||
|
||||
void container_set_child_growable(gui *_gui, widget *_this,
|
||||
widget *child, int growable);
|
||||
@@ -49,6 +57,8 @@ void xy_plot_set_range(gui *gui, widget *this,
|
||||
void xy_plot_set_points(gui *gui, widget *this,
|
||||
int plot, int npoints, float *x, float *y);
|
||||
void xy_plot_get_dimensions(gui *gui, widget *this, int *width, int *height);
|
||||
void xy_plot_set_title(gui *gui, widget *this, char *label);
|
||||
void xy_plot_set_tick_type(gui *gui, widget *this, int type);
|
||||
|
||||
void textlist_add(gui *gui, widget *this, const char *text, int position,
|
||||
int color);
|
||||
|
||||
@@ -31,7 +31,7 @@ extern int volatile gui_logd;
|
||||
|
||||
enum widget_type {
|
||||
TOPLEVEL_WINDOW, CONTAINER, POSITIONER, TEXT_LIST, XY_PLOT, BUTTON, LABEL,
|
||||
TIMELINE, SPACE, IMAGE
|
||||
TEXTAREA, TIMELINE, SPACE, IMAGE
|
||||
};
|
||||
|
||||
struct widget_list;
|
||||
@@ -117,6 +117,7 @@ struct xy_plot_widget {
|
||||
int wanted_height;
|
||||
struct xy_plot_plot *plots;
|
||||
int nplots;
|
||||
int tick_type;
|
||||
};
|
||||
|
||||
struct timeline_subline {
|
||||
@@ -141,13 +142,24 @@ struct button_widget {
|
||||
|
||||
struct label_widget {
|
||||
struct widget common;
|
||||
const char *t;
|
||||
char *t;
|
||||
int color;
|
||||
int width; /* as given by the graphic's backend */
|
||||
int height; /* as given by the graphic's backend */
|
||||
int baseline; /* as given by the graphic's backend */
|
||||
};
|
||||
|
||||
struct textarea_widget {
|
||||
struct widget common;
|
||||
char *t;
|
||||
int tmaxsize;
|
||||
int color;
|
||||
int wanted_width;
|
||||
int wanted_height;
|
||||
int baseline; /* as given by the graphic's backend */
|
||||
int text_width; /* as given by the graphic's backend */
|
||||
};
|
||||
|
||||
struct space_widget {
|
||||
struct widget common;
|
||||
int wanted_width;
|
||||
|
||||
@@ -81,3 +81,21 @@ void label_set_clickable(gui *_g, widget *_this, int clickable)
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void label_set_text(gui *_g, widget *_this, char *text)
|
||||
{
|
||||
struct gui *g = _g;
|
||||
struct label_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
free(this->t);
|
||||
this->t = strdup(text); if (this->t == NULL) OOM;
|
||||
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, text,
|
||||
&this->width, &this->height, &this->baseline);
|
||||
|
||||
send_event(g, REPACK, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
83
common/utils/T/tracer/gui/textarea.c
Normal file
83
common/utils/T/tracer/gui/textarea.c
Normal file
@@ -0,0 +1,83 @@
|
||||
#include "gui.h"
|
||||
#include "gui_defs.h"
|
||||
#include "x.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static void paint(gui *_gui, widget *_w)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct textarea_widget *t = _w;
|
||||
LOGD("PAINT textarea '%s'\n", t->t);
|
||||
x_fill_rectangle(g->x, g->xwin, BACKGROUND_COLOR,
|
||||
t->common.x, t->common.y,
|
||||
t->common.width, t->common.height);
|
||||
x_draw_clipped_string(g->x, g->xwin, DEFAULT_FONT, t->color,
|
||||
t->common.x + t->common.width - t->text_width,
|
||||
t->common.y + t->baseline, t->t,
|
||||
t->common.x, t->common.y,
|
||||
t->common.width, t->common.height);
|
||||
}
|
||||
|
||||
static void hints(gui *_gui, widget *_w, int *width, int *height)
|
||||
{
|
||||
struct textarea_widget *t = _w;
|
||||
LOGD("HINTS textarea '%s'\n", t->t);
|
||||
*width = t->wanted_width;
|
||||
*height = t->wanted_height;
|
||||
}
|
||||
|
||||
widget *new_textarea(gui *_gui, int width, int height, int maxsize)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct textarea_widget *w;
|
||||
int _;
|
||||
|
||||
glock(g);
|
||||
|
||||
w = new_widget(g, TEXTAREA, sizeof(struct textarea_widget));
|
||||
|
||||
w->t = calloc(maxsize, 1);
|
||||
if (w->t == NULL) OOM;
|
||||
w->tmaxsize = maxsize;
|
||||
w->wanted_width = width;
|
||||
w->wanted_height = height;
|
||||
w->color = FOREGROUND_COLOR;
|
||||
w->text_width = 0;
|
||||
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, "jlM",
|
||||
&_, &_, &w->baseline);
|
||||
|
||||
w->common.paint = paint;
|
||||
w->common.hints = hints;
|
||||
|
||||
gunlock(g);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
/* public functions */
|
||||
/*************************************************************************/
|
||||
|
||||
void textarea_set_text(gui *_g, widget *_this, char *text)
|
||||
{
|
||||
struct gui *g = _g;
|
||||
struct textarea_widget *this = _this;
|
||||
int _;
|
||||
int len = strlen(text);
|
||||
if (len >= this->tmaxsize) {
|
||||
fprintf(stderr, "ERROR: string '%s' too big for textarea\n", text);
|
||||
return;
|
||||
}
|
||||
|
||||
glock(g);
|
||||
|
||||
strcpy(this->t, text);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, text,
|
||||
&this->text_width, &_, &this->baseline);
|
||||
send_event(g, DIRTY, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
@@ -265,7 +265,7 @@ void widget_dirty(gui *_gui, widget *_this)
|
||||
|
||||
static const char *names[] = {
|
||||
"TOPLEVEL_WINDOW", "CONTAINER", "POSITIONER", "TEXT_LIST",
|
||||
"XY_PLOT", "BUTTON", "LABEL", "TIMELINE", "SPACE", "IMAGE"
|
||||
"XY_PLOT", "BUTTON", "LABEL", "TEXTAREA", "TIMELINE", "SPACE", "IMAGE"
|
||||
};
|
||||
const char *widget_name(enum widget_type type)
|
||||
{
|
||||
@@ -277,6 +277,7 @@ const char *widget_name(enum widget_type type)
|
||||
case XY_PLOT:
|
||||
case BUTTON:
|
||||
case LABEL:
|
||||
case TEXTAREA:
|
||||
case TIMELINE:
|
||||
case SPACE:
|
||||
case IMAGE:
|
||||
|
||||
@@ -1,11 +1,20 @@
|
||||
#include "gui.h"
|
||||
#include "gui_defs.h"
|
||||
#include "x.h"
|
||||
#include "../utils.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#if 0
|
||||
/* this version behaves differently when you resize the XY plot. Say
|
||||
* you increase the size. The old (smaller) view is put at the center
|
||||
* of the new view. Everything inside keeps the same size/aspect ratio.
|
||||
* The other version below resizes the old view so that it fully occupies
|
||||
* the new view. It may introduce aspect ratio changes, but usage seems
|
||||
* to suggest it's a better behaviour.
|
||||
*/
|
||||
static void paint(gui *_gui, widget *_this)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
@@ -70,9 +79,9 @@ static void paint(gui *_gui, widget *_this)
|
||||
*/
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
float x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
int x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2,
|
||||
@@ -85,7 +94,7 @@ static void paint(gui *_gui, widget *_this)
|
||||
this->common.y + this->common.height - this->label_height * 2 +
|
||||
this->label_baseline,
|
||||
v);
|
||||
LOGD("tic k %d val %g x %g\n", k, k * ticstep, x);
|
||||
LOGD("tic k %d val %g x %d\n", k, k * ticstep, x);
|
||||
}
|
||||
|
||||
/* vertical tics */
|
||||
@@ -112,9 +121,9 @@ static void paint(gui *_gui, widget *_this)
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
float y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
int y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
@@ -155,6 +164,184 @@ static void paint(gui *_gui, widget *_this)
|
||||
x_plot_points(g->x, g->xwin, this->plots[n].color);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void paint(gui *_gui, widget *_this)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
int allocated_plot_width;
|
||||
int allocated_plot_height;
|
||||
float pxsize;
|
||||
float ticdist;
|
||||
float tic;
|
||||
float ticstep;
|
||||
int k, kmin, kmax;
|
||||
float allocated_xmin, allocated_xmax;
|
||||
float allocated_ymin, allocated_ymax;
|
||||
int i;
|
||||
int n;
|
||||
char v[64];
|
||||
int vwidth, dummy;
|
||||
|
||||
# define FLIP(v) (-(v) + allocated_plot_height-1)
|
||||
|
||||
LOGD("PAINT xy plot xywh %d %d %d %d\n", this->common.x, this->common.y, this->common.width, this->common.height);
|
||||
|
||||
//x_draw_rectangle(g->x, g->xwin, 1, this->common.x, this->common.y, this->common.width, this->common.height);
|
||||
|
||||
allocated_plot_width = this->common.width - this->vrule_width;
|
||||
allocated_plot_height = this->common.height - this->label_height * 2;
|
||||
|
||||
if (allocated_plot_width <= 1 || allocated_plot_height <= 1) {
|
||||
WARN("PAINT xy plot: width (%d) or height (%d) is wrong, not painting\n",
|
||||
this->common.width, this->common.height);
|
||||
return;
|
||||
}
|
||||
|
||||
/* plot zone */
|
||||
/* TODO: refine height - height of hrule text may be != from label */
|
||||
x_draw_rectangle(g->x, g->xwin, 1,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y,
|
||||
this->common.width - this->vrule_width -1, /* -1 to see right border */
|
||||
this->common.height - this->label_height * 2);
|
||||
|
||||
/* horizontal tics */
|
||||
pxsize = (this->xmax - this->xmin) / allocated_plot_width;
|
||||
ticdist = 100;
|
||||
tic = floor(log10(ticdist * pxsize));
|
||||
ticstep = powf(10, tic);
|
||||
allocated_xmin = this->xmin;
|
||||
allocated_xmax = this->xmax;
|
||||
/* adjust tic if too tight */
|
||||
LOGD("pre x ticstep %g\n", ticstep);
|
||||
while (1) {
|
||||
if (ticstep / (allocated_xmax - allocated_xmin)
|
||||
* (allocated_plot_width - 1) > 40) break;
|
||||
ticstep *= 2;
|
||||
}
|
||||
LOGD("post x ticstep %g\n", ticstep);
|
||||
LOGD("xmin/max %g %g width allocated %d alloc xmin/max %g %g ticstep %g\n", this->xmin, this->xmax, allocated_plot_width, allocated_xmin, allocated_xmax, ticstep);
|
||||
kmin = ceil(allocated_xmin / ticstep);
|
||||
kmax = floor(allocated_xmax / ticstep);
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
/*
|
||||
(k * ticstep - allocated_xmin) / (allocated_max - allocated_xmin) =
|
||||
(x - 0) / (allocated_plot_width-1 - 0)
|
||||
*/
|
||||
int x = (k * ticstep - allocated_xmin) /
|
||||
(allocated_xmax - allocated_xmin) *
|
||||
(allocated_plot_width - 1);
|
||||
int px;
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + this->common.height - this->label_height * 2 - 5);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
|
||||
/* do not draw after the widget ('width-1' for if we use 'width'
|
||||
* it is still off by 1 pixel for whatever reason) */
|
||||
px = this->vrule_width + x - vwidth/2;
|
||||
if (px + vwidth > this->common.width-1)
|
||||
px = this->common.width-1 - vwidth;
|
||||
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + px,
|
||||
this->common.y + this->common.height - this->label_height * 2 +
|
||||
this->label_baseline,
|
||||
v);
|
||||
LOGD("tic k %d val %g x %d\n", k, k * ticstep, x);
|
||||
}
|
||||
|
||||
/* vertical tics */
|
||||
allocated_ymin = this->ymin;
|
||||
allocated_ymax = this->ymax;
|
||||
switch (this->tick_type) {
|
||||
case XY_PLOT_DEFAULT_TICK:
|
||||
pxsize = (this->ymax - this->ymin) / allocated_plot_height;
|
||||
ticdist = 30;
|
||||
tic = floor(log10(ticdist * pxsize));
|
||||
ticstep = powf(10, tic);
|
||||
/* adjust tic if too tight */
|
||||
LOGD("pre y ticstep %g\n", ticstep);
|
||||
while (1) {
|
||||
if (ticstep / (allocated_ymax - allocated_ymin)
|
||||
* (allocated_plot_height - 1) > 20) break;
|
||||
ticstep *= 2;
|
||||
}
|
||||
LOGD("post y ticstep %g\n", ticstep);
|
||||
LOGD("ymin/max %g %g height allocated %d alloc "
|
||||
"ymin/max %g %g ticstep %g\n", this->ymin, this->ymax,
|
||||
allocated_plot_height, allocated_ymin, allocated_ymax, ticstep);
|
||||
kmin = ceil(allocated_ymin / ticstep);
|
||||
kmax = floor(allocated_ymax / ticstep);
|
||||
for (k = kmin; k <= kmax; k++) {
|
||||
int y = (k * ticstep - allocated_ymin) /
|
||||
(allocated_ymax - allocated_ymin) *
|
||||
(allocated_plot_height - 1);
|
||||
sprintf(v, "%g", k * ticstep);
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y + FLIP(y),
|
||||
this->common.x + this->vrule_width + 5,
|
||||
this->common.y + FLIP(y));
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width - vwidth - 2,
|
||||
this->common.y + FLIP(y)-this->label_height/2+this->label_baseline,
|
||||
v);
|
||||
}
|
||||
break;
|
||||
case XY_PLOT_SCROLL_TICK:
|
||||
/* print only max value, formatted using 'bps' for readability */
|
||||
bps(v, this->ymax, "");
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width - vwidth - 2,
|
||||
this->common.y + +this->label_baseline,
|
||||
v);
|
||||
/* vertically divide into 5 */
|
||||
for (k = 1; k < 5; k++) {
|
||||
int y = round((k * (allocated_plot_height - 1)) / 5.);
|
||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
||||
this->common.x + this->vrule_width,
|
||||
this->common.y + y,
|
||||
this->common.x + this->vrule_width + 5,
|
||||
this->common.y + y);
|
||||
}
|
||||
break;
|
||||
} /* swich (this->tick_type) */
|
||||
|
||||
/* label at bottom, in the middle */
|
||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
||||
this->common.x + (this->common.width - this->label_width) / 2,
|
||||
this->common.y + this->common.height - this->label_height
|
||||
+ this->label_baseline,
|
||||
this->label);
|
||||
|
||||
for (n = 0; n < this->nplots; n++) {
|
||||
/* points */
|
||||
float ax, bx, ay, by;
|
||||
ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin);
|
||||
bx = -ax * allocated_xmin;
|
||||
ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin);
|
||||
by = -ay * allocated_ymin;
|
||||
for (i = 0; i < this->plots[n].npoints; i++) {
|
||||
int x, y;
|
||||
x = ax * this->plots[n].x[i] + bx;
|
||||
y = ay * this->plots[n].y[i] + by;
|
||||
if (x >= 0 && x < allocated_plot_width &&
|
||||
y >= 0 && y < allocated_plot_height)
|
||||
x_add_point(g->x,
|
||||
this->common.x + this->vrule_width + x,
|
||||
this->common.y + FLIP(y));
|
||||
}
|
||||
x_plot_points(g->x, g->xwin, this->plots[n].color);
|
||||
}
|
||||
}
|
||||
|
||||
static void hints(gui *_gui, widget *_w, int *width, int *height)
|
||||
{
|
||||
@@ -191,6 +378,7 @@ widget *new_xy_plot(gui *_gui, int width, int height, char *label,
|
||||
w->ymax = 1;
|
||||
w->plots = NULL;
|
||||
w->nplots = 0;
|
||||
w->tick_type = XY_PLOT_DEFAULT_TICK;
|
||||
|
||||
w->common.paint = paint;
|
||||
w->common.hints = hints;
|
||||
@@ -290,3 +478,36 @@ void xy_plot_get_dimensions(gui *_gui, widget *_this, int *width, int *height)
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_set_title(gui *_gui, widget *_this, char *label)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
free(this->label);
|
||||
this->label = strdup(label); if (this->label == NULL) OOM;
|
||||
/* TODO: be sure calling X there is valid wrt "global model" (we are
|
||||
* not in the "gui thread") */
|
||||
x_text_get_dimensions(g->x, DEFAULT_FONT, label,
|
||||
&this->label_width, &this->label_height, &this->label_baseline);
|
||||
|
||||
send_event(g, REPACK, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
void xy_plot_set_tick_type(gui *_gui, widget *_this, int type)
|
||||
{
|
||||
struct gui *g = _gui;
|
||||
struct xy_plot_widget *this = _this;
|
||||
|
||||
glock(g);
|
||||
|
||||
this->tick_type = type;
|
||||
|
||||
send_event(g, DIRTY, this->common.id);
|
||||
|
||||
gunlock(g);
|
||||
}
|
||||
|
||||
@@ -3,16 +3,23 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I. -I..
|
||||
|
||||
LIBS=-lX11 -lm -lpng -lXft
|
||||
|
||||
all: dump_nack_signal
|
||||
all: dump_nack_signal time_meas timeplot
|
||||
|
||||
dump_nack_signal: ../utils.o ../database.o ../config.o ../event.o \
|
||||
dump_nack_signal.o
|
||||
$(CC) $(CFLAGS) -o dump_nack_signal $^ $(LIBS)
|
||||
|
||||
time_meas: ../utils.o ../database.o ../config.o ../event.o \
|
||||
time_meas.o
|
||||
$(CC) $(CFLAGS) -o time_meas $^ $(LIBS)
|
||||
|
||||
timplot: timeplot.o
|
||||
$(CC) $(CFLAGS) -o timeplot $^ $(LIBS)
|
||||
|
||||
.PHONY: all
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f *.o core dump_nack_signal
|
||||
rm -f *.o core dump_nack_signal time_meas timeplot
|
||||
|
||||
112
common/utils/T/tracer/hacks/time_meas.c
Normal file
112
common/utils/T/tracer/hacks/time_meas.c
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "utils.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
#include "config.h"
|
||||
#include "../T_defs.h"
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
printf(
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -ip <host> connect to given IP address (default %s)\n"
|
||||
" -p <port> connect to given port (default %d)\n",
|
||||
DEFAULT_REMOTE_IP,
|
||||
DEFAULT_REMOTE_PORT
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
struct timespec time_sub(struct timespec a, struct timespec b)
|
||||
{
|
||||
struct timespec ret;
|
||||
if (a.tv_nsec < b.tv_nsec) {
|
||||
ret.tv_nsec = (int64_t)a.tv_nsec - (int64_t)b.tv_nsec + 1000000000;
|
||||
ret.tv_sec = a.tv_sec - b.tv_sec - 1;
|
||||
} else {
|
||||
ret.tv_nsec = a.tv_nsec - b.tv_nsec;
|
||||
ret.tv_sec = a.tv_sec - b.tv_sec;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(int n, char **v)
|
||||
{
|
||||
char *database_filename = NULL;
|
||||
void *database;
|
||||
char *ip = DEFAULT_REMOTE_IP;
|
||||
int port = DEFAULT_REMOTE_PORT;
|
||||
int i;
|
||||
char t;
|
||||
int number_of_events;
|
||||
int socket;
|
||||
int *is_on;
|
||||
int ev_fun;
|
||||
int start_valid = 0;
|
||||
struct timespec start_time, stop_time, delta_time;
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d"))
|
||||
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-p"))
|
||||
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
||||
usage();
|
||||
}
|
||||
|
||||
if (database_filename == NULL) {
|
||||
printf("ERROR: provide a database file (-d)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
database = parse_database(database_filename);
|
||||
|
||||
load_config_file(database_filename);
|
||||
|
||||
number_of_events = number_of_ids(database);
|
||||
is_on = calloc(number_of_events, sizeof(int));
|
||||
if (is_on == NULL) abort();
|
||||
|
||||
on_off(database, "VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER", is_on, 1);
|
||||
|
||||
ev_fun = event_id_from_name(database,
|
||||
"VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER");
|
||||
|
||||
socket = connect_to(ip, port);
|
||||
|
||||
t = 1;
|
||||
if (socket_send(socket, &t, 1) == -1 ||
|
||||
socket_send(socket, &number_of_events, sizeof(int)) == -1 ||
|
||||
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
|
||||
abort();
|
||||
|
||||
while (1) {
|
||||
char v[T_BUFFER_MAX];
|
||||
event e;
|
||||
int on_off;
|
||||
e = get_event(socket, v, database);
|
||||
if (e.type == -1) break;
|
||||
if (e.type != ev_fun)
|
||||
{ printf("unhandled event %d\n", e.type); continue; }
|
||||
on_off = e.e[0].i;
|
||||
printf("yo %d\n", on_off);
|
||||
if (on_off == 1) {
|
||||
start_time = e.sending_time;
|
||||
start_valid = 1;
|
||||
continue;
|
||||
}
|
||||
if (on_off != 0) { printf("fatal!\n"); abort(); }
|
||||
if (!start_valid) continue;
|
||||
stop_time = e.sending_time;
|
||||
delta_time = time_sub(stop_time, start_time);
|
||||
fprintf(stderr, "%ld\n",
|
||||
delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec);
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
84
common/utils/T/tracer/hacks/timeplot.c
Normal file
84
common/utils/T/tracer/hacks/timeplot.c
Normal file
@@ -0,0 +1,84 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
void RESET(void)
|
||||
{ printf("\x1b""c"); fflush(stdout); }
|
||||
|
||||
void GOTO(int x, int y)
|
||||
{ char s[64];sprintf(s,"\x1b[%d;%dH",y,x);printf("%s",s);fflush(stdout); }
|
||||
|
||||
void HIDE_CURSOR(void)
|
||||
{ printf("\x1b[?25l"); fflush(stdout); }
|
||||
|
||||
void sig(int x)
|
||||
{
|
||||
RESET();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* 0: [0-2[
|
||||
* ...
|
||||
* 48: [96-98[
|
||||
* 49: [98-infinity]
|
||||
*/
|
||||
int bins[50];
|
||||
|
||||
#define N 1000
|
||||
int data[N];
|
||||
|
||||
void plot(void)
|
||||
{
|
||||
int i;
|
||||
int max = 0;
|
||||
int vmin = data[0];
|
||||
int vmax = 0;
|
||||
long vavg;
|
||||
memset(bins, 0, sizeof(bins));
|
||||
int binsize_ns = 500;
|
||||
|
||||
vavg = 0;
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
if (data[i] < vmin) vmin = data[i];
|
||||
if (data[i] > vmax) vmax = data[i];
|
||||
vavg += data[i];
|
||||
int ms2 = data[i]/binsize_ns;
|
||||
if (ms2 > 49) ms2 = 49;
|
||||
bins[ms2]++;
|
||||
if (bins[ms2] > max) max = bins[ms2];
|
||||
}
|
||||
|
||||
vavg /= N;
|
||||
|
||||
GOTO(1,1);
|
||||
for (i = 0; i < 50; i++) {
|
||||
double binend = (i+1) * binsize_ns / 1000.;
|
||||
int k;
|
||||
int width = bins[i] * 70 / max;
|
||||
/* force at least width of 1 if some point is there */
|
||||
if (bins[i] && width == 0) width = 1;
|
||||
printf("%#5.1f ", binend);
|
||||
for (k = 0; k < width; k++) putchar('#');
|
||||
for (; k < 70; k++) putchar(' ');
|
||||
putchar('\n');
|
||||
}
|
||||
printf("min %d ns max %d ns avg %ld ns\n", vmin, vmax, vavg);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
int pos = 0;
|
||||
signal(SIGINT, sig);
|
||||
RESET();
|
||||
HIDE_CURSOR();
|
||||
while (!feof(stdin)) {
|
||||
for (i=0; i<100; i++) { scanf("%d", &data[pos]); pos++; pos%=N; }
|
||||
plot();
|
||||
}
|
||||
RESET();
|
||||
return 0;
|
||||
}
|
||||
@@ -2,7 +2,7 @@ CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I..
|
||||
|
||||
OBJS=logger.o textlog.o framelog.o ttilog.o timelog.o ticklog.o iqlog.o \
|
||||
iqdotlog.o
|
||||
iqdotlog.o ticked_ttilog.o throughputlog.o
|
||||
|
||||
logger.a: $(OBJS)
|
||||
ar cr logger.a $(OBJS)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void logger_add_view(logger *_l, view *v)
|
||||
@@ -13,5 +14,6 @@ void logger_add_view(logger *_l, view *v)
|
||||
void logger_set_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct logger *l = _l;
|
||||
free_filter(l->filter);
|
||||
l->filter = filter;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,13 @@ logger *new_textlog(void *event_handler, void *database,
|
||||
logger *new_ttilog(void *event_handler, void *database,
|
||||
char *event_name, char *frame_varname, char *subframe_varname,
|
||||
char *data_varname, int convert_to_dB);
|
||||
logger *new_ticked_ttilog(void *event_handler, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname,
|
||||
int convert_to_dB, float empty_value);
|
||||
logger *new_throughputlog(void *event_handler, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname);
|
||||
logger *new_timelog(void *event_handler, void *database, char *event_name);
|
||||
logger *new_ticklog(void *event_handler, void *database,
|
||||
char *event_name, char *frame_name, char *subframe_name);
|
||||
@@ -28,5 +35,6 @@ void textlog_dump_buffer(logger *_this, int dump_buffer);
|
||||
|
||||
void logger_add_view(logger *l, view *v);
|
||||
void logger_set_filter(logger *l, void *filter);
|
||||
void ticked_ttilog_set_tick_filter(logger *l, void *filter);
|
||||
|
||||
#endif /* _LOGGER_H_ */
|
||||
|
||||
194
common/utils/T/tracer/logger/throughputlog.c
Normal file
194
common/utils/T/tracer/logger/throughputlog.c
Normal file
@@ -0,0 +1,194 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
#include "handler.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct throughputlog {
|
||||
struct logger common;
|
||||
void *database;
|
||||
int tick_frame_arg;
|
||||
int tick_subframe_arg;
|
||||
int data_frame_arg;
|
||||
int data_subframe_arg;
|
||||
int data_arg;
|
||||
int last_tick_frame;
|
||||
int last_tick_subframe;
|
||||
unsigned long bits[1000];
|
||||
unsigned long total;
|
||||
int insert_point;
|
||||
char *tick_event_name;
|
||||
unsigned long tick_handler_id;
|
||||
/* tick filter - NULL is no filter set */
|
||||
void *tick_filter;
|
||||
};
|
||||
|
||||
static void _event(void *p, event e)
|
||||
{
|
||||
struct throughputlog *l = p;
|
||||
int frame;
|
||||
int subframe;
|
||||
unsigned long value;
|
||||
|
||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->data_frame_arg].i;
|
||||
subframe = e.e[l->data_subframe_arg].i;
|
||||
|
||||
if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) {
|
||||
printf("WARNING: %s:%d: data comes without previous tick!\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (e.e[l->data_arg].type) {
|
||||
case EVENT_INT: value = e.e[l->data_arg].i; break;
|
||||
case EVENT_ULONG: value = e.e[l->data_arg].ul; break;
|
||||
default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort();
|
||||
}
|
||||
|
||||
l->total += value;
|
||||
l->bits[l->insert_point] += value;
|
||||
}
|
||||
|
||||
static void _tick_event(void *p, event e)
|
||||
{
|
||||
struct throughputlog *l = p;
|
||||
int i;
|
||||
int frame;
|
||||
int subframe;
|
||||
|
||||
if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->tick_frame_arg].i;
|
||||
subframe = e.e[l->tick_subframe_arg].i;
|
||||
|
||||
for (i = 0; i < l->common.vsize; i++)
|
||||
l->common.v[i]->append(l->common.v[i], frame, subframe, (double)l->total);
|
||||
|
||||
l->insert_point = (l->insert_point + 1) % 1000;
|
||||
l->total -= l->bits[l->insert_point];
|
||||
l->bits[l->insert_point] = 0;
|
||||
|
||||
l->last_tick_frame = frame;
|
||||
l->last_tick_subframe = subframe;
|
||||
}
|
||||
|
||||
logger *new_throughputlog(event_handler *h, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname)
|
||||
{
|
||||
struct throughputlog *ret;
|
||||
int event_id;
|
||||
database_event_format f;
|
||||
int i;
|
||||
|
||||
ret = calloc(1, sizeof(struct throughputlog)); if (ret == NULL) abort();
|
||||
|
||||
ret->common.event_name = strdup(event_name);
|
||||
if (ret->common.event_name == NULL) abort();
|
||||
ret->database = database;
|
||||
|
||||
ret->tick_event_name = strdup(tick_event_name);
|
||||
if (ret->tick_event_name == NULL) abort();
|
||||
|
||||
/* tick event */
|
||||
event_id = event_id_from_name(database, tick_event_name);
|
||||
|
||||
ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame and subframe */
|
||||
ret->tick_frame_arg = -1;
|
||||
ret->tick_subframe_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i;
|
||||
}
|
||||
if (ret->tick_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->tick_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* data event */
|
||||
event_id = event_id_from_name(database, event_name);
|
||||
|
||||
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame, subframe and data args */
|
||||
ret->data_frame_arg = -1;
|
||||
ret->data_subframe_arg = -1;
|
||||
ret->data_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], data_varname)) ret->data_arg = i;
|
||||
}
|
||||
if (ret->data_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_arg == -1) {
|
||||
printf("%s:%d: data argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, data_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_arg], "int") != 0 &&
|
||||
strcmp(f.type[ret->data_arg], "float") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type"
|
||||
" (should be 'int' or 'float')\n",
|
||||
__FILE__, __LINE__, data_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void throughputlog_set_tick_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct throughputlog *l = (struct throughputlog *)_l;
|
||||
free(l->tick_filter);
|
||||
l->tick_filter = filter;
|
||||
}
|
||||
196
common/utils/T/tracer/logger/ticked_ttilog.c
Normal file
196
common/utils/T/tracer/logger/ticked_ttilog.c
Normal file
@@ -0,0 +1,196 @@
|
||||
#include "logger.h"
|
||||
#include "logger_defs.h"
|
||||
#include "event.h"
|
||||
#include "database.h"
|
||||
#include "handler.h"
|
||||
#include "filter/filter.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct ticked_ttilog {
|
||||
struct logger common;
|
||||
void *database;
|
||||
int tick_frame_arg;
|
||||
int tick_subframe_arg;
|
||||
int data_frame_arg;
|
||||
int data_subframe_arg;
|
||||
int data_arg;
|
||||
int convert_to_dB;
|
||||
int last_tick_frame;
|
||||
int last_tick_subframe;
|
||||
float last_value;
|
||||
float empty_value;
|
||||
char *tick_event_name;
|
||||
unsigned long tick_handler_id;
|
||||
/* tick filter - NULL is no filter set */
|
||||
void *tick_filter;
|
||||
};
|
||||
|
||||
static void _event(void *p, event e)
|
||||
{
|
||||
struct ticked_ttilog *l = p;
|
||||
int frame;
|
||||
int subframe;
|
||||
float value;
|
||||
|
||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->data_frame_arg].i;
|
||||
subframe = e.e[l->data_subframe_arg].i;
|
||||
|
||||
if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) {
|
||||
printf("WARNING: %s:%d: data comes without previous tick!\n",
|
||||
__FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (e.e[l->data_arg].type) {
|
||||
case EVENT_INT: value = e.e[l->data_arg].i; break;
|
||||
case EVENT_ULONG: value = e.e[l->data_arg].ul; break;
|
||||
default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort();
|
||||
}
|
||||
|
||||
if (l->convert_to_dB) value = 10 * log10(value);
|
||||
|
||||
l->last_value = value;
|
||||
}
|
||||
|
||||
static void _tick_event(void *p, event e)
|
||||
{
|
||||
struct ticked_ttilog *l = p;
|
||||
int i;
|
||||
int frame;
|
||||
int subframe;
|
||||
|
||||
if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0)
|
||||
return;
|
||||
|
||||
frame = e.e[l->tick_frame_arg].i;
|
||||
subframe = e.e[l->tick_subframe_arg].i;
|
||||
|
||||
for (i = 0; i < l->common.vsize; i++)
|
||||
l->common.v[i]->append(l->common.v[i], frame, subframe, l->last_value);
|
||||
|
||||
l->last_value = l->empty_value;
|
||||
l->last_tick_frame = frame;
|
||||
l->last_tick_subframe = subframe;
|
||||
}
|
||||
|
||||
logger *new_ticked_ttilog(event_handler *h, void *database,
|
||||
char *tick_event_name, char *frame_varname, char *subframe_varname,
|
||||
char *event_name, char *data_varname,
|
||||
int convert_to_dB, float empty_value)
|
||||
{
|
||||
struct ticked_ttilog *ret;
|
||||
int event_id;
|
||||
database_event_format f;
|
||||
int i;
|
||||
|
||||
ret = calloc(1, sizeof(struct ticked_ttilog)); if (ret == NULL) abort();
|
||||
|
||||
ret->common.event_name = strdup(event_name);
|
||||
if (ret->common.event_name == NULL) abort();
|
||||
ret->database = database;
|
||||
ret->convert_to_dB = convert_to_dB;
|
||||
|
||||
ret->tick_event_name = strdup(tick_event_name);
|
||||
if (ret->tick_event_name == NULL) abort();
|
||||
ret->empty_value = empty_value;
|
||||
ret->last_value = empty_value;
|
||||
|
||||
/* tick event */
|
||||
event_id = event_id_from_name(database, tick_event_name);
|
||||
|
||||
ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame and subframe */
|
||||
ret->tick_frame_arg = -1;
|
||||
ret->tick_subframe_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i;
|
||||
}
|
||||
if (ret->tick_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->tick_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* data event */
|
||||
event_id = event_id_from_name(database, event_name);
|
||||
|
||||
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
|
||||
|
||||
f = get_format(database, event_id);
|
||||
|
||||
/* look for frame, subframe and data args */
|
||||
ret->data_frame_arg = -1;
|
||||
ret->data_subframe_arg = -1;
|
||||
ret->data_arg = -1;
|
||||
for (i = 0; i < f.count; i++) {
|
||||
if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i;
|
||||
if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i;
|
||||
if (!strcmp(f.name[i], data_varname)) ret->data_arg = i;
|
||||
}
|
||||
if (ret->data_frame_arg == -1) {
|
||||
printf("%s:%d: frame argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, frame_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_subframe_arg == -1) {
|
||||
printf("%s:%d: subframe argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, subframe_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (ret->data_arg == -1) {
|
||||
printf("%s:%d: data argument '%s' not found in event '%s'\n",
|
||||
__FILE__, __LINE__, data_varname, event_name);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_frame_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, frame_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
|
||||
__FILE__, __LINE__, subframe_varname);
|
||||
abort();
|
||||
}
|
||||
if (strcmp(f.type[ret->data_arg], "int") != 0 &&
|
||||
strcmp(f.type[ret->data_arg], "float") != 0) {
|
||||
printf("%s:%d: argument '%s' has wrong type"
|
||||
" (should be 'int' or 'float')\n",
|
||||
__FILE__, __LINE__, data_varname);
|
||||
abort();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ticked_ttilog_set_tick_filter(logger *_l, void *filter)
|
||||
{
|
||||
struct ticked_ttilog *l = (struct ticked_ttilog *)_l;
|
||||
free(l->tick_filter);
|
||||
l->tick_filter = filter;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ void usage(void)
|
||||
printf(
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -in <dump file> read events from this dump file\n"
|
||||
" -i <dump file> read events from this dump file\n"
|
||||
" -ip <IP address> send packets to this IP address (default %s)\n"
|
||||
" -p <port> send packets to this port (default %d)\n",
|
||||
DEFAULT_IP,
|
||||
@@ -205,7 +205,7 @@ int main(int n, char **v)
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d"))
|
||||
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-in"))
|
||||
if (!strcmp(v[i], "-i"))
|
||||
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
|
||||
|
||||
876
common/utils/T/tracer/ue.c
Normal file
876
common/utils/T/tracer/ue.c
Normal file
@@ -0,0 +1,876 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include "database.h"
|
||||
#include "event.h"
|
||||
#include "handler.h"
|
||||
#include "logger/logger.h"
|
||||
#include "view/view.h"
|
||||
#include "gui/gui.h"
|
||||
#include "filter/filter.h"
|
||||
#include "utils.h"
|
||||
#include "../T_defs.h"
|
||||
#include "event_selector.h"
|
||||
#include "openair_logo.h"
|
||||
#include "config.h"
|
||||
|
||||
typedef struct {
|
||||
view *phyview;
|
||||
view *macview;
|
||||
view *rlcview;
|
||||
view *pdcpview;
|
||||
view *rrcview;
|
||||
view *legacy;
|
||||
widget *current_ue_label;
|
||||
widget *prev_ue_button;
|
||||
widget *next_ue_button;
|
||||
widget *pdsch_iq_ue_xy_plot;
|
||||
widget *dl_estimate_ue_xy_plot;
|
||||
widget *pdcch_energy_ue_xy_plot;
|
||||
widget *pdsch_energy_ue_xy_plot;
|
||||
widget *pdcch_iq_ue_xy_plot;
|
||||
widget *dl_ul_harq_ue_label;
|
||||
widget *dl_mcs_xy_plot;
|
||||
widget *ul_mcs_xy_plot;
|
||||
widget *pusch_power_xy_plot;
|
||||
widget *pucch_power_xy_plot;
|
||||
widget *phy_meas_xy_plot;
|
||||
logger *pdsch_iq_ue_logger;
|
||||
logger *dl_estimate_ue_logger;
|
||||
logger *pdcch_iq_ue_logger;
|
||||
logger *dl_dci_logger[8];
|
||||
logger *dl_ack_logger[8];
|
||||
logger *dl_nack_logger[8];
|
||||
logger *ul_dci_logger[8];
|
||||
logger *ul_dci_retransmission_logger[8];
|
||||
logger *ul_ack_logger[8];
|
||||
logger *ul_nack_logger[8];
|
||||
logger *dl_mcs_logger;
|
||||
logger *ul_mcs_logger;
|
||||
logger *pusch_power_logger;
|
||||
logger *pusch_ampl_logger;
|
||||
logger *pucch_power_logger;
|
||||
logger *pucch_ampl_logger;
|
||||
logger *pdcch_energy_logger;
|
||||
logger *pdsch_energy_logger;
|
||||
logger *phy_meas_logger;
|
||||
} ue_gui;
|
||||
|
||||
typedef struct {
|
||||
int socket;
|
||||
int *is_on;
|
||||
int nevents;
|
||||
pthread_mutex_t lock;
|
||||
ue_gui *e;
|
||||
int ue; /* what UE is displayed in the UE specific views */
|
||||
void *database;
|
||||
} ue_data;
|
||||
|
||||
void is_on_changed(void *_d)
|
||||
{
|
||||
ue_data *d = _d;
|
||||
char t;
|
||||
|
||||
if (pthread_mutex_lock(&d->lock)) abort();
|
||||
|
||||
if (d->socket == -1) goto no_connection;
|
||||
|
||||
t = 1;
|
||||
if (socket_send(d->socket, &t, 1) == -1 ||
|
||||
socket_send(d->socket, &d->nevents, sizeof(int)) == -1 ||
|
||||
socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1)
|
||||
goto connection_dies;
|
||||
|
||||
no_connection:
|
||||
if (pthread_mutex_unlock(&d->lock)) abort();
|
||||
return;
|
||||
|
||||
connection_dies:
|
||||
close(d->socket);
|
||||
d->socket = -1;
|
||||
if (pthread_mutex_unlock(&d->lock)) abort();
|
||||
}
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
printf(
|
||||
"options:\n"
|
||||
" -d <database file> this option is mandatory\n"
|
||||
" -on <GROUP or ID> turn log ON for given GROUP or ID\n"
|
||||
" -off <GROUP or ID> turn log OFF for given GROUP or ID\n"
|
||||
" -ON turn all logs ON\n"
|
||||
" -OFF turn all logs OFF\n"
|
||||
" note: you may pass several -on/-off/-ON/-OFF,\n"
|
||||
" they will be processed in order\n"
|
||||
" by default, all is off\n"
|
||||
" -ip <host> connect to given IP address (default %s)\n"
|
||||
" -p <port> connect to given port (default %d)\n"
|
||||
" -debug-gui activate GUI debug logs\n",
|
||||
DEFAULT_REMOTE_IP,
|
||||
DEFAULT_REMOTE_PORT
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void *gui_thread(void *_g)
|
||||
{
|
||||
gui *g = _g;
|
||||
gui_loop(g);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static filter *ticktime_filter(void *database, char *event, int i, int ue)
|
||||
{
|
||||
/* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */
|
||||
return
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)),
|
||||
filter_and(
|
||||
filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)),
|
||||
filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0))));
|
||||
}
|
||||
|
||||
static void set_current_ue(gui *g, ue_data *e, int ue)
|
||||
{
|
||||
int i;
|
||||
char s[256];
|
||||
|
||||
sprintf(s, "[UE %d] ", ue);
|
||||
label_set_text(g, e->e->current_ue_label, s);
|
||||
sprintf(s, "PDSCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pdsch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "DL estimated channel [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->dl_estimate_ue_xy_plot, s);
|
||||
sprintf(s, "PDCCH energy [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pdcch_energy_ue_xy_plot, s);
|
||||
sprintf(s, "PDSCH energy [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pdsch_energy_ue_xy_plot, s);
|
||||
sprintf(s, "PDCCH IQ [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pdcch_iq_ue_xy_plot, s);
|
||||
sprintf(s, "DL/UL HARQ (x8) [UE %d]", ue);
|
||||
label_set_text(g, e->e->dl_ul_harq_ue_label, s);
|
||||
sprintf(s, "DL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->dl_mcs_xy_plot, s);
|
||||
sprintf(s, "UL MCS [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->ul_mcs_xy_plot, s);
|
||||
sprintf(s, "PUSCH POWER [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pusch_power_xy_plot, s);
|
||||
sprintf(s, "PUCCH POWER [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->pucch_power_xy_plot, s);
|
||||
sprintf(s, "PHY Measurements [UE %d]", ue);
|
||||
xy_plot_set_title(g, e->e->phy_meas_xy_plot, s);
|
||||
|
||||
logger_set_filter(e->e->pdsch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PDSCH_IQ", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->dl_estimate_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_DL_CHANNEL_ESTIMATE", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pdcch_energy_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PDCCH_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pdsch_energy_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PDSCH_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->phy_meas_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_MEAS", "UE_ID"),
|
||||
filter_int(ue)));
|
||||
/*logger_set_filter(e->pucch1_energy_ue_energy_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
|
||||
filter_int(ue)));*/
|
||||
/*logger_set_filter(e->e->pdcch_iq_ue_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PDCCH_IQ", "UE_ID"),
|
||||
filter_int(ue)));*/
|
||||
for (i = 0; i < 8; i++) {
|
||||
logger_set_filter(e->e->dl_dci_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_DCI", i, ue));
|
||||
logger_set_filter(e->e->dl_ack_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->dl_nack_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_DLSCH_UE_NACK", i, ue));
|
||||
logger_set_filter(e->e->ul_dci_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_DCI", i, ue));
|
||||
/*logger_set_filter(e->ul_dci_retransmission_logger[i],
|
||||
ticktime_filter(e->database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));*/
|
||||
logger_set_filter(e->e->ul_ack_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_ACK", i, ue));
|
||||
logger_set_filter(e->e->ul_nack_logger[i],
|
||||
ticktime_filter(e->database, "UE_PHY_ULSCH_UE_NACK", i, ue));
|
||||
}
|
||||
logger_set_filter(e->e->dl_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_DLSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->ul_mcs_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_ULSCH_UE_DCI", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pusch_power_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pusch_ampl_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch_power_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"),
|
||||
filter_int(ue)));
|
||||
logger_set_filter(e->e->pucch_ampl_logger,
|
||||
filter_eq(
|
||||
filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"),
|
||||
filter_int(ue)));
|
||||
}
|
||||
|
||||
static void click(void *private, gui *g,
|
||||
char *notification, widget *w, void *notification_data)
|
||||
{
|
||||
int *d = notification_data;
|
||||
int button = d[0];
|
||||
ue_data *ed = private;
|
||||
ue_gui *e = ed->e;
|
||||
int ue = ed->ue;
|
||||
|
||||
if (button != 1) return;
|
||||
if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; }
|
||||
if (w == e->next_ue_button) ue++;
|
||||
|
||||
if (pthread_mutex_lock(&ed->lock)) abort();
|
||||
if (ue != ed->ue) {
|
||||
set_current_ue(g, ed, ue);
|
||||
ed->ue = ue;
|
||||
}
|
||||
if (pthread_mutex_unlock(&ed->lock)) abort();
|
||||
}
|
||||
|
||||
static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database,
|
||||
ue_data *ed)
|
||||
{
|
||||
widget *main_window;
|
||||
widget *top_container;
|
||||
widget *line, *col;
|
||||
widget *logo;
|
||||
widget *input_signal_plot;
|
||||
logger *input_signal_log;
|
||||
view *input_signal_view;
|
||||
widget *timeline_plot;
|
||||
logger *timelog;
|
||||
view *timeview;
|
||||
view *subview;
|
||||
widget *text;
|
||||
view *textview;
|
||||
int i;
|
||||
widget *w, *w2;
|
||||
view *v;
|
||||
logger *l;
|
||||
|
||||
main_window = new_toplevel_window(g, 1200, 900, "eNB tracer");
|
||||
top_container = new_container(g, VERTICAL);
|
||||
widget_add_child(g, main_window, top_container, -1);
|
||||
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
logo = new_image(g, openair_logo_png, openair_logo_png_len);
|
||||
|
||||
/* logo + prev/next UE buttons */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, col, logo, -1);
|
||||
w = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, col, w, -1);
|
||||
w2 = new_label(g, "");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
e->current_ue_label = w2;
|
||||
/* TODO: use button widget, not label widget */
|
||||
w2 = new_label(g, " [prev UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->prev_ue_button = w2;
|
||||
w2 = new_label(g, " [next UE] ");
|
||||
widget_add_child(g, w, w2, -1);
|
||||
label_set_clickable(g, w2, 1);
|
||||
e->next_ue_button = w2;
|
||||
widget_add_child(g, line, col, -1);
|
||||
|
||||
input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20);
|
||||
widget_add_child(g, line, input_signal_plot, -1);
|
||||
xy_plot_set_range(g, input_signal_plot, 0, 7680*10, 20, 70);
|
||||
input_signal_log = new_framelog(h, database,
|
||||
"UE_PHY_INPUT_SIGNAL", "subframe", "rxdata");
|
||||
/* a skip value of 10 means to process 1 frame over 10, that is
|
||||
* more or less 10 frames per second
|
||||
*/
|
||||
framelog_set_skip(input_signal_log, 10);
|
||||
input_signal_view = new_view_xy(7680*10, 10,
|
||||
g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(input_signal_log, input_signal_view);
|
||||
|
||||
/* UE x PDSCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pdsch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -500, 500, -500, 500);
|
||||
l = new_iqlog(h, database, "UE_PHY_PDSCH_IQ", "nb_rb",
|
||||
"N_RB_UL", "symbols_per_tti", "pusch_comp");
|
||||
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_iq_ue_logger = l;
|
||||
|
||||
/* UE x estimated DL channel */
|
||||
w = new_xy_plot(g, 280, 55, "", 50);
|
||||
e->dl_estimate_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 512*10, -10, 80);
|
||||
l = new_framelog(h, database,
|
||||
"UE_PHY_DL_CHANNEL_ESTIMATE", "subframe", "chest_t");
|
||||
//framelog_set_skip(input_signal_log, 10);
|
||||
framelog_set_update_only_at_sf9(l, 0);
|
||||
v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
e->dl_estimate_ue_logger = l;
|
||||
|
||||
/* PHY Meas */
|
||||
w = new_xy_plot(g, 128, 55, "", 50);
|
||||
e->phy_meas_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -130, 35);
|
||||
/*l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rssi", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;*/
|
||||
l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rsrp", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;
|
||||
l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "snr", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c720c"));
|
||||
logger_add_view(l, v);
|
||||
e->phy_meas_logger = l;
|
||||
|
||||
/* UE x PDSCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "", 50);
|
||||
e->pdsch_energy_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level00", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level01", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level10", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level11", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||
logger_add_view(l, v);
|
||||
e->pdsch_energy_logger = l;
|
||||
|
||||
/* UE x PDCCH energy */
|
||||
w = new_xy_plot(g, 128, 55, "", 50);
|
||||
e->pdcch_energy_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level00", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level01", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#00ff00"));
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level10", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0f0f0f"));
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level11", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0000ff"));
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_energy_logger = l;
|
||||
|
||||
/* UE x PDCCH IQ data */
|
||||
w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pdcch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -100, 100, -100, 100);
|
||||
l = new_iqlog(h, database, "UE_PHY_PDCCH_IQ", "nb_rb",
|
||||
"NB_RB_DL", "symbols_per_tti", "rxdataF_comp");
|
||||
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_iq_ue_logger = l;
|
||||
|
||||
/* UE x PDCCH IQ data */
|
||||
/*w = new_xy_plot(g, 55, 55, "", 50);
|
||||
e->pdcch_iq_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, -2000, 2000, -2000, 2000);
|
||||
l = new_iqdotlog(h, database, "UE_PHY_PDCCH_IQ", "I", "Q");
|
||||
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
e->pdcch_iq_ue_logger = l;*/
|
||||
|
||||
/* UE x DL mcs */
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->dl_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "UE_PHY_DL_TICK", "frame", "subframe",
|
||||
"UE_PHY_DLSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->dl_mcs_logger = l;
|
||||
|
||||
/* UE x UL mcs */
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -2, 30);
|
||||
e->ul_mcs_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
l = new_ticked_ttilog(h, database, "UE_PHY_UL_TICK", "frame", "subframe",
|
||||
"UE_PHY_ULSCH_UE_DCI", "mcs", 0, -1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->ul_mcs_logger = l;
|
||||
|
||||
/* UE x PUSCH TX Power */
|
||||
// line = new_container(g, HORIZONTAL);
|
||||
// widget_add_child(g, top_container, line, -1);
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
e->pusch_power_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -30, 50);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "p0_pusch", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->pusch_power_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "ampl", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
logger_add_view(l, v);
|
||||
e->pusch_ampl_logger = l;
|
||||
|
||||
/* UE x PUCCH TX Power */
|
||||
// line = new_container(g, HORIZONTAL);
|
||||
// widget_add_child(g, top_container, line, -1);
|
||||
w = new_xy_plot(g, 128, 55, "", 20);
|
||||
e->pucch_power_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 1024*10, -30, 50);
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "p0_pucch", 0);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
|
||||
logger_add_view(l, v);
|
||||
e->pucch_power_logger = l;
|
||||
l = new_ttilog(h, database,
|
||||
"UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "ampl", 1);
|
||||
v = new_view_tti(10, g, w, new_color(g, "#720c0c"));
|
||||
logger_add_view(l, v);
|
||||
e->pucch_ampl_logger = l;
|
||||
|
||||
|
||||
/* downlink/uplink UE DCIs */
|
||||
widget_add_child(g, top_container,
|
||||
new_label(g,"DL/UL TICK/DCI/ACK/NACK [all UEs]"), -1);
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
timeline_plot = new_timeline(g, 512, 8, 5);
|
||||
widget_add_child(g, line, timeline_plot, -1);
|
||||
container_set_child_growable(g, line, timeline_plot, 1);
|
||||
for (i = 0; i < 8; i++)
|
||||
timeline_set_subline_background_color(g, timeline_plot, i,
|
||||
new_color(g, i==0 || i==4 ? "#aaf" : "#eee"));
|
||||
timeview = new_view_time(3600, 10, g, timeline_plot);
|
||||
/* DL tick logging */
|
||||
timelog = new_timelog(h, database, "UE_PHY_DL_TICK");
|
||||
subview = new_subview_time(timeview, 0, new_color(g, "#77c"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL DCI logging */
|
||||
timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_DCI");
|
||||
subview = new_subview_time(timeview, 1, new_color(g, "#228"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL ACK */
|
||||
timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_ACK");
|
||||
subview = new_subview_time(timeview, 2, new_color(g, "#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL NACK */
|
||||
timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_NACK");
|
||||
subview = new_subview_time(timeview, 3, new_color(g, "#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
|
||||
/* UL tick logging */
|
||||
timelog = new_timelog(h, database, "UE_PHY_UL_TICK");
|
||||
subview = new_subview_time(timeview, 4, new_color(g, "#77c"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* UL DCI logging */
|
||||
timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_DCI");
|
||||
subview = new_subview_time(timeview, 5, new_color(g, "#228"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* UL retransmission without DCI logging */
|
||||
//timelog = new_timelog(h,database,"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION");
|
||||
//subview = new_subview_time(timeview, 5, new_color(g, "#f22"), 3600*1000);
|
||||
//logger_add_view(timelog, subview);
|
||||
/* UL ACK */
|
||||
timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_ACK");
|
||||
subview = new_subview_time(timeview, 6, new_color(g, "#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* UL NACK */
|
||||
timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_NACK");
|
||||
subview = new_subview_time(timeview, 7, new_color(g, "#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
|
||||
/* harq processes' ticktime view */
|
||||
e->dl_ul_harq_ue_label = new_label(g, "");
|
||||
widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1);
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
timeline_plot = new_timeline(g, 512, 2*8+2, 3);
|
||||
widget_add_child(g, line, timeline_plot, -1);
|
||||
container_set_child_growable(g, line, timeline_plot, 1);
|
||||
for (i = 0; i < 2*8+2; i++)
|
||||
timeline_set_subline_background_color(g, timeline_plot, i,
|
||||
new_color(g, i==0 || i==9 ? "#ddd" : (i%9)&1 ? "#e6e6e6" : "#eee"));
|
||||
timeview = new_view_ticktime(10, g, timeline_plot);
|
||||
ticktime_set_tick(timeview,
|
||||
new_ticklog(h, database, "UE_MASTER_TICK", "frame", "subframe"));
|
||||
/* tick */
|
||||
timelog = new_ticklog(h, database, "UE_MASTER_TICK", "frame", "subframe");
|
||||
/* tick on DL view */
|
||||
subview = new_subview_ticktime(timeview, 0, new_color(g,"#bbb"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* tick on UL view */
|
||||
subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
/* DL DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_DCI",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->dl_dci_logger[i] = timelog;
|
||||
}
|
||||
/* DL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_ACK",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->dl_ack_logger[i] = timelog;
|
||||
}
|
||||
/* DL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_NACK",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->dl_nack_logger[i] = timelog;
|
||||
}
|
||||
/* UL DCI/retransmission without DCI */
|
||||
for (i = 0; i < 8; i++) {
|
||||
/* first transmission */
|
||||
timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_DCI",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#55f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->ul_dci_logger[i] = timelog;
|
||||
/* retransmission */
|
||||
|
||||
timelog = new_ticklog(h, database,
|
||||
"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#99f"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->ul_dci_retransmission_logger[i] = timelog;
|
||||
|
||||
}
|
||||
|
||||
/* UL ACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_ACK",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#282"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->ul_ack_logger[i] = timelog;
|
||||
}
|
||||
/* UL NACK */
|
||||
for (i = 0; i < 8; i++) {
|
||||
timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_NACK",
|
||||
"frame", "subframe");
|
||||
subview = new_subview_ticktime(timeview, i+9+1,
|
||||
new_color(g,"#f22"), 3600*1000);
|
||||
logger_add_view(timelog, subview);
|
||||
e->ul_nack_logger[i] = timelog;
|
||||
}
|
||||
|
||||
#if 1
|
||||
/* phy/mac/rlc/pdcp/rrc textlog */
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
container_set_child_growable(g, top_container, line, 1);
|
||||
|
||||
/* phy */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
container_set_child_growable(g, line, col, 1);
|
||||
widget_add_child(g, col, new_label(g, "PHY"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#afa"));
|
||||
widget_add_child(g, col, text, -1);
|
||||
container_set_child_growable(g, col, text, 1);
|
||||
textview = new_view_textlist(10000, 10, g, text);
|
||||
e->phyview = textview;
|
||||
|
||||
/* mac */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
container_set_child_growable(g, line, col, 1);
|
||||
widget_add_child(g, col, new_label(g, "MAC"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#adf"));
|
||||
widget_add_child(g, col, text, -1);
|
||||
container_set_child_growable(g, col, text, 1);
|
||||
textview = new_view_textlist(10000, 10, g, text);
|
||||
e->macview = textview;
|
||||
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
container_set_child_growable(g, top_container, line, 1);
|
||||
|
||||
/* rlc */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
container_set_child_growable(g, line, col, 1);
|
||||
widget_add_child(g, col, new_label(g, "RLC"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#aff"));
|
||||
widget_add_child(g, col, text, -1);
|
||||
container_set_child_growable(g, col, text, 1);
|
||||
textview = new_view_textlist(10000, 10, g, text);
|
||||
e->rlcview = textview;
|
||||
|
||||
/* pdcp */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
container_set_child_growable(g, line, col, 1);
|
||||
widget_add_child(g, col, new_label(g, "PDCP"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#ed9"));
|
||||
widget_add_child(g, col, text, -1);
|
||||
container_set_child_growable(g, col, text, 1);
|
||||
textview = new_view_textlist(10000, 10, g, text);
|
||||
e->pdcpview = textview;
|
||||
|
||||
line = new_container(g, HORIZONTAL);
|
||||
widget_add_child(g, top_container, line, -1);
|
||||
container_set_child_growable(g, top_container, line, 1);
|
||||
|
||||
/* rrc */
|
||||
col = new_container(g, VERTICAL);
|
||||
widget_add_child(g, line, col, -1);
|
||||
container_set_child_growable(g, line, col, 1);
|
||||
widget_add_child(g, col, new_label(g, "RRC"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#fdb"));
|
||||
widget_add_child(g, col, text, -1);
|
||||
container_set_child_growable(g, col, text, 1);
|
||||
textview = new_view_textlist(10000, 10, g, text);
|
||||
e->rrcview = textview;
|
||||
|
||||
/* legacy logs (LOG_I, LOG_D, ...) */
|
||||
widget_add_child(g, top_container, new_label(g, "LEGACY"), -1);
|
||||
text = new_textlist(g, 100, 10, new_color(g, "#eeb"));
|
||||
widget_add_child(g, top_container, text, -1);
|
||||
container_set_child_growable(g, top_container, text, 1);
|
||||
e->legacy = new_view_textlist(10000, 10, g, text);
|
||||
#endif
|
||||
|
||||
set_current_ue(g, ed, 0);
|
||||
register_notifier(g, "click", e->prev_ue_button, click, ed);
|
||||
register_notifier(g, "click", e->next_ue_button, click, ed);
|
||||
}
|
||||
|
||||
void view_add_log(view *v, char *log, event_handler *h, void *database,
|
||||
int *is_on)
|
||||
{
|
||||
logger *textlog;
|
||||
char *name, *desc;
|
||||
|
||||
database_get_generic_description(database,
|
||||
event_id_from_name(database, log), &name, &desc);
|
||||
textlog = new_textlog(h, database, name, desc);
|
||||
logger_add_view(textlog, v);
|
||||
free(name);
|
||||
free(desc);
|
||||
|
||||
on_off(database, log, is_on, 1);
|
||||
}
|
||||
|
||||
int main(int n, char **v)
|
||||
{
|
||||
extern int volatile gui_logd;
|
||||
char *database_filename = NULL;
|
||||
void *database;
|
||||
char *ip = DEFAULT_REMOTE_IP;
|
||||
int port = DEFAULT_REMOTE_PORT;
|
||||
char **on_off_name;
|
||||
int *on_off_action;
|
||||
int on_off_n = 0;
|
||||
int *is_on;
|
||||
int number_of_events;
|
||||
int i;
|
||||
event_handler *h;
|
||||
gui *g;
|
||||
ue_gui eg;
|
||||
ue_data ue_data;
|
||||
|
||||
/* write on a socket fails if the other end is closed and we get SIGPIPE */
|
||||
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
|
||||
|
||||
on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort();
|
||||
on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort();
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d"))
|
||||
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
|
||||
if (!strcmp(v[i], "-p"))
|
||||
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
||||
if (!strcmp(v[i], "-on")) { if (i > n-2) usage();
|
||||
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=1; continue; }
|
||||
if (!strcmp(v[i], "-off")) { if (i > n-2) usage();
|
||||
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=0; continue; }
|
||||
if (!strcmp(v[i], "-ON"))
|
||||
{ on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=1; continue; }
|
||||
if (!strcmp(v[i], "-OFF"))
|
||||
{ on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=0; continue; }
|
||||
if (!strcmp(v[i], "-debug-gui")) { gui_logd = 1; continue; }
|
||||
usage();
|
||||
}
|
||||
|
||||
if (database_filename == NULL) {
|
||||
printf("ERROR: provide a database file (-d)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
database = parse_database(database_filename);
|
||||
|
||||
load_config_file(database_filename);
|
||||
|
||||
number_of_events = number_of_ids(database);
|
||||
is_on = calloc(number_of_events, sizeof(int));
|
||||
if (is_on == NULL) abort();
|
||||
|
||||
h = new_handler(database);
|
||||
|
||||
g = gui_init();
|
||||
new_thread(gui_thread, g);
|
||||
|
||||
ue_data.ue = 0;
|
||||
ue_data.e = ⪚
|
||||
ue_data.database = database;
|
||||
|
||||
ue_main_gui(&eg, g, h, database, &ue_data);
|
||||
|
||||
for (i = 0; i < number_of_events; i++) {
|
||||
logger *textlog;
|
||||
char *name, *desc;
|
||||
database_get_generic_description(database, i, &name, &desc);
|
||||
if (!strncmp(name, "LEGACY_", 7)) {
|
||||
textlog = new_textlog(h, database, name, desc);
|
||||
logger_add_view(textlog, eg.legacy);
|
||||
}
|
||||
free(name);
|
||||
free(desc);
|
||||
}
|
||||
|
||||
on_off(database, "UE_MASTER_TICK", is_on, 1);
|
||||
on_off(database, "UE_PHY_UL_TICK", is_on, 1);
|
||||
on_off(database, "UE_PHY_DL_TICK", is_on, 1);
|
||||
on_off(database, "UE_PHY_DLSCH_UE_DCI", is_on, 1);
|
||||
on_off(database, "UE_PHY_DLSCH_UE_ACK", is_on, 1);
|
||||
on_off(database, "UE_PHY_DLSCH_UE_NACK", is_on, 1);
|
||||
on_off(database, "UE_PHY_ULSCH_UE_DCI", is_on, 1);
|
||||
on_off(database, "UE_PHY_ULSCH_UE_ACK", is_on, 1);
|
||||
on_off(database, "UE_PHY_ULSCH_UE_NACK", is_on, 1);
|
||||
on_off(database, "UE_PHY_INPUT_SIGNAL", is_on, 1);
|
||||
on_off(database, "UE_PHY_DL_CHANNEL_ESTIMATE", is_on, 1);
|
||||
on_off(database, "UE_PHY_PDCCH_IQ", is_on, 1);
|
||||
on_off(database, "UE_PHY_PDCCH_ENERGY", is_on, 1);
|
||||
on_off(database, "UE_PHY_PDSCH_IQ", is_on, 1);
|
||||
on_off(database, "UE_PHY_PDSCH_ENERGY", is_on, 1);
|
||||
on_off(database, "UE_PHY_PUSCH_TX_POWER", is_on, 1);
|
||||
on_off(database, "UE_PHY_PUCCH_TX_POWER", is_on, 1);
|
||||
on_off(database, "UE_PHY_MEAS", is_on, 1);
|
||||
|
||||
on_off(database, "LEGACY_GROUP_INFO", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_ERROR", is_on, 1);
|
||||
on_off(database, "LEGACY_GROUP_WARNING", is_on, 1);
|
||||
|
||||
view_add_log(eg.phyview, "UE_PHY_UL_TICK", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_DL_TICK", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_DCI", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_ACK", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_NACK",h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_DCI", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_ACK", h, database, is_on);
|
||||
view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_NACK", h, database, is_on);
|
||||
|
||||
|
||||
|
||||
/* deactivate those two by default, they are a bit heavy */
|
||||
//on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0);
|
||||
//on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0);
|
||||
|
||||
for (i = 0; i < on_off_n; i++)
|
||||
on_off(database, on_off_name[i], is_on, on_off_action[i]);
|
||||
|
||||
ue_data.socket = -1;
|
||||
ue_data.is_on = is_on;
|
||||
ue_data.nevents = number_of_events;
|
||||
if (pthread_mutex_init(&ue_data.lock, NULL)) abort();
|
||||
setup_event_selector(g, database, is_on, is_on_changed, &ue_data);
|
||||
|
||||
restart:
|
||||
clear_remote_config();
|
||||
ue_data.socket = connect_to(ip, port);
|
||||
|
||||
/* send the first message - activate selected traces */
|
||||
is_on_changed(&ue_data);
|
||||
|
||||
/* read messages */
|
||||
while (1) {
|
||||
char v[T_BUFFER_MAX];
|
||||
event e;
|
||||
e = get_event(ue_data.socket, v, database);
|
||||
if (e.type == -1) goto restart;
|
||||
if (pthread_mutex_lock(&ue_data.lock)) abort();
|
||||
handle_event(h, e);
|
||||
if (pthread_mutex_unlock(&ue_data.lock)) abort();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user