mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-21 00:20:30 +00:00
Compare commits
1135 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c375d3ae8 | ||
|
|
c1e460183b | ||
|
|
05f89b3922 | ||
|
|
1b1270e847 | ||
|
|
f94835becf | ||
|
|
94229ca593 | ||
|
|
b2c57f42fc | ||
|
|
74e2cf77fa | ||
|
|
7d649f432b | ||
|
|
2e9dfe0fbb | ||
|
|
0a46cc56a2 | ||
|
|
25f35fbbb4 | ||
|
|
2edbcbdf66 | ||
|
|
3d8fb53073 | ||
|
|
5c0f42a277 | ||
|
|
b1bf9db8fa | ||
|
|
2ef3dd8ff7 | ||
|
|
b81ee87f4d | ||
|
|
bf6a3b522d | ||
|
|
3a7fd01f22 | ||
|
|
465ab00bc5 | ||
|
|
fa9b91ad1d | ||
|
|
2c238010a7 | ||
|
|
60b83d84ea | ||
|
|
abfeb4ef06 | ||
|
|
c17e81b2aa | ||
|
|
2f4fcb5ecc | ||
|
|
dcb48081a0 | ||
|
|
34ca9a7f93 | ||
|
|
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 | ||
|
|
31c85b22ea | ||
|
|
70c84ef835 | ||
|
|
ba6d140445 | ||
|
|
bcfeb7af32 | ||
|
|
36bd7e1d75 | ||
|
|
1f3b1ff8ff | ||
|
|
f92bd91544 | ||
|
|
be0541aa8c | ||
|
|
6f6f9acb52 | ||
|
|
6397e66c29 | ||
|
|
63c0ed7042 | ||
|
|
7d9945e884 | ||
|
|
7b36af0597 | ||
|
|
7c4630057f | ||
|
|
bfa8a28ccb | ||
|
|
23c7547698 | ||
|
|
d65d91ddcc | ||
|
|
f52a42eda5 | ||
|
|
4ecdfa05f1 | ||
|
|
6c789a36bc | ||
|
|
09139ab018 | ||
|
|
2dc9dc0316 | ||
|
|
614d6bbe2a | ||
|
|
f66f6e49cb | ||
|
|
9ecae1837c | ||
|
|
b904ce7978 | ||
|
|
14aa96787a | ||
|
|
5805215227 | ||
|
|
e88d1e739e | ||
|
|
cd6ac4529d | ||
|
|
6ba07564af | ||
|
|
8d7c06b194 | ||
|
|
4d8e41100a | ||
|
|
82403ed1dd | ||
|
|
fa432bdd26 | ||
|
|
b2b1dc9f18 | ||
|
|
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 | ||
|
|
e0b8998def | ||
|
|
0cd250bc50 | ||
|
|
d1d4bb9f0c | ||
|
|
274030c4d5 | ||
|
|
e2ae88de23 | ||
|
|
bb5ee76ad8 | ||
|
|
31dde6129c | ||
|
|
8250ecd794 | ||
|
|
024af3e730 | ||
|
|
0e687fb765 | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
29d6400210 | ||
|
|
ad9a246043 | ||
|
|
ee934102b6 | ||
|
|
484cad2431 | ||
|
|
8eeebdaf98 | ||
|
|
afe698db10 | ||
|
|
0bb875d9c2 | ||
|
|
956135f9a3 | ||
|
|
426e6cd74b | ||
|
|
bea768660b | ||
|
|
0579d47154 | ||
|
|
7d5ec24bb5 | ||
|
|
a242028878 | ||
|
|
7f0679593c | ||
|
|
7f1bef9b65 | ||
|
|
045c947015 | ||
|
|
c4405d6c41 | ||
|
|
62ed687ef5 | ||
|
|
7637ed26ba | ||
|
|
b0b472e035 | ||
|
|
8a08206670 | ||
|
|
41fd001b31 | ||
|
|
c67536062b | ||
|
|
933dc966c0 | ||
|
|
3b7a9400f2 | ||
|
|
f15426d75c | ||
|
|
03231dd163 | ||
|
|
af2ad0682f | ||
|
|
8cfd5f29f6 | ||
|
|
9d64a0382b | ||
|
|
0c52c76df6 | ||
|
|
03eb2c498d | ||
|
|
fe10da2642 | ||
|
|
f8aea6189d | ||
|
|
7715900222 | ||
|
|
f1bd8ba02a | ||
|
|
880cddb4a0 | ||
|
|
6f0b71deac | ||
|
|
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 | ||
|
|
8369af0964 | ||
|
|
1fcc78375c | ||
|
|
20b0aae98b | ||
|
|
e0314d8b75 | ||
|
|
958c66c6db | ||
|
|
79bd3ea7d4 | ||
|
|
f974ec264e | ||
|
|
d9b32975c9 | ||
|
|
6fe8c9acec | ||
|
|
afbab21a54 | ||
|
|
0b1050c149 | ||
|
|
033513034f | ||
|
|
12f1cb9c7c | ||
|
|
8769024922 | ||
|
|
7f74065484 | ||
|
|
319ae6fbbf | ||
|
|
9648d1f245 | ||
|
|
fbfb756ca1 | ||
|
|
963ccb9bad | ||
|
|
22609539b0 | ||
|
|
69ccc900e8 | ||
|
|
9c65225869 | ||
|
|
c0ad88e537 | ||
|
|
2965d79dd4 | ||
|
|
f0f34c029b | ||
|
|
3bd591bfec | ||
|
|
6097e0516f | ||
|
|
09f149d86b | ||
|
|
1c86e23edf | ||
|
|
985dcdc38c | ||
|
|
bb5b90eab0 | ||
|
|
2078a9e57c | ||
|
|
630e39aea3 | ||
|
|
cf59e0d891 | ||
|
|
d56c651081 | ||
|
|
2b045e8106 | ||
|
|
141689e793 | ||
|
|
b9416fb542 | ||
|
|
048b5384dd | ||
|
|
83929d42f2 | ||
|
|
8236206cb0 | ||
|
|
9672b41089 | ||
|
|
5864cc08cd | ||
|
|
92ef1739b1 | ||
|
|
8baf3e7e57 | ||
|
|
0cee514c73 | ||
|
|
92fda18ab6 | ||
|
|
eff2887d92 | ||
|
|
65f047094c | ||
|
|
5bbdefeee8 | ||
|
|
b018a3bbe9 | ||
|
|
2d963f5330 | ||
|
|
45184c769c | ||
|
|
7b39d594d5 | ||
|
|
c5a8dbfee2 | ||
|
|
bc7df9f5c4 | ||
|
|
90e3931e4e | ||
|
|
17e8a047b3 | ||
|
|
e156079e33 | ||
|
|
ddb959991d | ||
|
|
af9c77d09f | ||
|
|
11db1d89bb | ||
|
|
5e1d462aa9 | ||
|
|
727cdb4a87 | ||
|
|
3c7ec4e416 | ||
|
|
6644204765 | ||
|
|
0dfde2f441 | ||
|
|
7e6a74d5be | ||
|
|
c37446507a | ||
|
|
f55c4e46cb | ||
|
|
b6c7909d03 | ||
|
|
db8c2a0537 | ||
|
|
64116b90e1 | ||
|
|
948f2df9f1 | ||
|
|
5affbe3848 | ||
|
|
b218128862 | ||
|
|
f1abf1a775 | ||
|
|
08499a69e2 | ||
|
|
25ab1c35ee | ||
|
|
9ed966cfe6 | ||
|
|
8c37787e23 | ||
|
|
9b9a7e50b4 | ||
|
|
93b9b73582 | ||
|
|
3bd7225f9a | ||
|
|
50565a21f7 | ||
|
|
3e81e8c86b | ||
|
|
82e54108e9 | ||
|
|
f62063276a | ||
|
|
2332290a0d | ||
|
|
8ce73e5a7e | ||
|
|
e202953ccb | ||
|
|
7e6b0c34d2 | ||
|
|
094f439626 | ||
|
|
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 | ||
|
|
fdde582e92 | ||
|
|
e3dbfa3dde | ||
|
|
987ffdd8a0 | ||
|
|
849639f3a2 | ||
|
|
1b4adae54f | ||
|
|
79e8653f03 | ||
|
|
4763438131 | ||
|
|
ce15e0e97b | ||
|
|
8cc39130e0 | ||
|
|
208e4d7e84 | ||
|
|
4e8e707951 | ||
|
|
aa69c550e3 | ||
|
|
b8e9e188c1 | ||
|
|
51e8e0ade7 | ||
|
|
a5b57ddce4 | ||
|
|
35bdc94092 | ||
|
|
08f73c72d8 | ||
|
|
802922dcf1 | ||
|
|
7463f71b48 | ||
|
|
cd8cc1a35c | ||
|
|
71c047d1ae | ||
|
|
615da86332 | ||
|
|
224498cf3b | ||
|
|
95808aec10 | ||
|
|
7d7cbc57f8 | ||
|
|
6a8a551ef3 | ||
|
|
4fa0810cdd | ||
|
|
61a6b06129 | ||
|
|
2e2f6f9c20 | ||
|
|
a04682d47a | ||
|
|
5a40c9a8c7 | ||
|
|
81047e94af | ||
|
|
d7db5cdd57 | ||
|
|
c63abc0842 | ||
|
|
199434b92c | ||
|
|
b1f64b22a6 | ||
|
|
719a94d2c4 | ||
|
|
7ca6a84e20 | ||
|
|
d621de7fb3 | ||
|
|
b6e7f7ec51 | ||
|
|
5370685740 | ||
|
|
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,19 @@
|
||||
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_USER
|
||||
- echo $OAI_PASS
|
||||
- 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
|
||||
|
||||
@@ -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()
|
||||
@@ -174,7 +171,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 +196,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 +224,15 @@ 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(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
|
||||
|
||||
@@ -475,7 +473,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,7 +487,7 @@ 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
|
||||
)
|
||||
@@ -497,27 +495,27 @@ 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} )
|
||||
|
||||
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} )
|
||||
|
||||
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} )
|
||||
|
||||
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
|
||||
@@ -557,16 +555,14 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
||||
|
||||
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")
|
||||
include_directories("/usr/local/include/lime")
|
||||
include_directories("/usr/include/lime")
|
||||
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")
|
||||
set(option_HW_lib "-lLimeSuite -rdynamic -ldl")
|
||||
|
||||
elseif (${RF_BOARD} STREQUAL "CPRIGW")
|
||||
set(HW_SOURCE ${HW_SOURCE}
|
||||
@@ -574,12 +570,12 @@ elseif (${RF_BOARD} STREQUAL "CPRIGW")
|
||||
)
|
||||
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
|
||||
@@ -588,7 +584,7 @@ if (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||
)
|
||||
set(option_TP_lib "-rdynamic -ldl")
|
||||
|
||||
|
||||
|
||||
endif (${TRANSP_PRO} STREQUAL "ETHERNET")
|
||||
##########################################################
|
||||
|
||||
@@ -621,7 +617,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 +813,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 +835,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 +930,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,7 +1009,7 @@ 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
|
||||
@@ -979,11 +1065,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
|
||||
@@ -1012,6 +1101,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
|
||||
@@ -1096,7 +1186,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
|
||||
@@ -1109,6 +1209,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
|
||||
##########################
|
||||
|
||||
@@ -1195,7 +1303,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
|
||||
@@ -1228,7 +1336,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
|
||||
@@ -1348,7 +1456,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
|
||||
@@ -1469,6 +1577,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
|
||||
@@ -1561,7 +1686,7 @@ endif()
|
||||
# Atlas is required by some packages, but not found in pkg-config
|
||||
if(EXISTS "/usr/include/atlas/cblas.h")
|
||||
include_directories("/usr/include/atlas")
|
||||
list(APPEND ATLAS_LIBRARIES lapack cblas atlas)
|
||||
list(APPEND ATLAS_LIBRARIES cblas atlas lapack)
|
||||
else()
|
||||
message("No Blas/Atlas libs found, some targets will fail")
|
||||
endif()
|
||||
@@ -1634,9 +1759,10 @@ 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
|
||||
${GTPU_need_ITTI}
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1645,11 +1771,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 ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (lte-softmodem ${T_LIB})
|
||||
|
||||
@@ -1671,7 +1797,7 @@ add_executable(lte-softmodem-nos1
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${RTAI_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${XFORMS_SOURCE_SOFTMODEM}
|
||||
@@ -1679,11 +1805,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} ${option_HW_lib} ${option_TP_lib} ${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})
|
||||
|
||||
@@ -1695,15 +1821,15 @@ 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
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${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
|
||||
-Wl,--end-group )
|
||||
target_link_libraries (rrh_gw rt pthread m )
|
||||
target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib})
|
||||
@@ -1715,14 +1841,6 @@ 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
|
||||
#################
|
||||
#add_executable(usim
|
||||
@@ -1768,13 +1886,15 @@ 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
|
||||
${GTPU_need_ITTI}
|
||||
${OPENAIR_TARGETS}/COMMON/create_tasks.c
|
||||
${HW_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${TRANSPORT_SOURCE}
|
||||
${XFORMS_SOURCE}
|
||||
${T_SOURCE}
|
||||
)
|
||||
@@ -1782,7 +1902,7 @@ 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 )
|
||||
|
||||
@@ -1813,31 +1933,49 @@ 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}
|
||||
${TRANSPORT_SOURCE}
|
||||
${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} ${option_HW_lib} ${option_TP_lib}
|
||||
${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
|
||||
@@ -1845,7 +1983,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)
|
||||
@@ -1861,7 +2000,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
|
||||
@@ -1882,7 +2021,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}
|
||||
)
|
||||
|
||||
|
||||
@@ -1902,7 +2041,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)
|
||||
|
||||
@@ -1918,6 +2057,8 @@ if (${T_TRACER})
|
||||
add_dependencies(oaisim generate_T)
|
||||
add_dependencies(oaisim_nos1 generate_T)
|
||||
add_dependencies(dlsim generate_T)
|
||||
add_dependencies(dlsim_tm4 generate_T)
|
||||
add_dependencies(dlsim_tm7 generate_T)
|
||||
add_dependencies(ulsim generate_T)
|
||||
add_dependencies(pbchsim generate_T)
|
||||
add_dependencies(scansim generate_T)
|
||||
@@ -2064,16 +2205,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
|
||||
)
|
||||
|
||||
@@ -2083,7 +2224,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,7 @@ 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
|
||||
)
|
||||
|
||||
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)
|
||||
@@ -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 00 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,7 @@ 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 80 00 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 +247,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 00 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
|
||||
@@ -268,6 +281,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
3214
cmake_targets/autotests/testsuite_ue_noS1.xml
Normal file
3214
cmake_targets/autotests/testsuite_ue_noS1.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -35,12 +35,15 @@ 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 = ('030030' , '030030' )
|
||||
test_cases = ('032800' , '032730' )
|
||||
|
||||
nb_run = 3
|
||||
nb_run = 2
|
||||
|
||||
def error_opt(msg):
|
||||
print("Option error: " + msg)
|
||||
@@ -58,14 +61,27 @@ def main(args):
|
||||
|
||||
|
||||
|
||||
# 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_DLSCH_BITRATE'
|
||||
metric['description'] = 'UE downlink physical throughput'
|
||||
metric['regex'] = '(UE_DLSCH_BITRATE) =\s+(\d+\.\d+) kbps.+frame = (\d+)\)'
|
||||
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)
|
||||
@@ -74,58 +90,44 @@ def main(args):
|
||||
|
||||
#return(0)
|
||||
|
||||
test_results = []
|
||||
|
||||
for test_case in test_cases:
|
||||
|
||||
# print test_case
|
||||
if test_case == '030001':
|
||||
metric['min_limit'] = 500.0
|
||||
if test_case == '030901':
|
||||
metric['min_limit'] = 640.0
|
||||
if test_case == '031001':
|
||||
metric['min_limit'] = 3200.0
|
||||
if test_case == '031601':
|
||||
metric['min_limit'] = 5920.0
|
||||
if test_case == '031701':
|
||||
metric['min_limit'] = 6000.0
|
||||
if test_case == '031801':
|
||||
metric['min_limit'] = 6200.0
|
||||
if test_case == '031901':
|
||||
metric['min_limit'] = 7000.0
|
||||
if test_case == '032001':
|
||||
metric['min_limit'] = 7800.0
|
||||
if test_case == '032101':
|
||||
metric['min_limit'] = 8000.0
|
||||
if test_case == '032201':
|
||||
metric['min_limit'] = 9000.0
|
||||
if test_case == '032301':
|
||||
metric['min_limit'] = 10000.0
|
||||
if test_case == '032501':
|
||||
metric['min_limit'] = 11000.0
|
||||
if test_case == '032601':
|
||||
metric['min_limit'] = 12000.0
|
||||
if test_case == '032801':
|
||||
metric['min_limit'] = 12500.0
|
||||
|
||||
if test_case == '035201':
|
||||
metric['min_limit'] = 14668.8
|
||||
if test_case == '036001':
|
||||
metric['min_limit'] = 25363.2
|
||||
|
||||
|
||||
|
||||
for i in range(0, nb_run):
|
||||
fname = 'log//'+test_case+'/run_'+str(i)+'/UE_exec_'+str(i)+'_.log'
|
||||
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 !!!!!!!!!!!'
|
||||
# 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 !!!!!!!!!!!'
|
||||
|
||||
# metric_extracted = analyser.do_extract_metrics(args)
|
||||
# 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'] )
|
||||
@@ -143,16 +145,27 @@ def main(args):
|
||||
# print fname
|
||||
# analyser.do_img_metrics(metric, metric_extracted, fname)
|
||||
|
||||
# fname = 'log//'+test_case+'/run_'+str(i)+'/UE_traffic_'+str(i)+'_.log'
|
||||
# fname = 'log//'+test_case+'/run_'+str(i)+'/UE_traffic_'+str(i)+'_.log'
|
||||
|
||||
# args = {'file' : fname }
|
||||
# args = {'file' : fname }
|
||||
|
||||
# traffic_metrics = analyser.do_extract_traffic_metrics(args)
|
||||
# traffic_metrics = analyser.do_extract_traffic_metrics(args)
|
||||
|
||||
# fname= 'report/iperf_'+test_case+'_'+str(i)+'.png'
|
||||
# fname= 'report/iperf_'+test_case+'_'+str(i)+'.png'
|
||||
|
||||
# print fname
|
||||
# analyser.do_img_traffic(traffic_metrics, fname)
|
||||
# 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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ 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')),
|
||||
loader=FileSystemLoader(os.path.join(PATH, '../templates')),
|
||||
trim_blocks=False)
|
||||
|
||||
|
||||
@@ -103,6 +103,129 @@ def do_extract_metrics(args):
|
||||
}
|
||||
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)
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
@@ -182,24 +305,30 @@ def do_img_metrics(metric_def, metric_data, fname):
|
||||
# print output['metric'].size
|
||||
|
||||
plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 , label=metric_def['id'])
|
||||
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
|
||||
|
||||
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('Physical throughput ('+metric_def['unit_of_meas']+')')
|
||||
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_def['min_limit']/10)
|
||||
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 metric_data['metric_max'] > metric_def['min_limit']:
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
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_def['min_limit']+metric_def['min_limit']/10
|
||||
y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10
|
||||
|
||||
|
||||
plt.ylim(ymax=y_axis_max)
|
||||
|
||||
@@ -219,9 +348,6 @@ def do_img_metrics(metric_def, metric_data, fname):
|
||||
|
||||
def do_extract_traffic_metrics(args):
|
||||
|
||||
print ""
|
||||
print "do_extract_traffic_metrics ... "
|
||||
|
||||
fname = args['file']
|
||||
|
||||
# print(fname)
|
||||
@@ -325,7 +451,8 @@ def do_img_traffic(traffic_data, fname):
|
||||
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' )
|
||||
@@ -334,6 +461,8 @@ def do_img_traffic(traffic_data, fname):
|
||||
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')
|
||||
@@ -342,10 +471,11 @@ def do_img_traffic(traffic_data, fname):
|
||||
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.xlabel('time (s)')
|
||||
# plt.ylabel(metric_def['id'])
|
||||
|
||||
# Set graphic minimum Y axis
|
||||
@@ -365,7 +495,7 @@ def do_img_traffic(traffic_data, fname):
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
|
||||
# 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()
|
||||
@@ -395,7 +525,7 @@ def check_cell_synchro(fname):
|
||||
|
||||
m = re.search('AUTOTEST Cell Sync \:', line)
|
||||
if m :
|
||||
print line
|
||||
#print line
|
||||
return 'CELL_SYNCH'
|
||||
|
||||
return 'CELL_NOT_SYNCH'
|
||||
@@ -407,7 +537,7 @@ def check_exec_seg_fault(fname):
|
||||
for line in f:
|
||||
m = re.search('Segmentation fault', line)
|
||||
if m :
|
||||
print line
|
||||
#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
|
||||
2
cmake_targets/autotests/v2/actions/alu_hss.bash
Normal file
2
cmake_targets/autotests/v2/actions/alu_hss.bash
Normal file
@@ -0,0 +1,2 @@
|
||||
sudo /opt/ltebox/tools/stop_ltebox || 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
|
||||
11
cmake_targets/autotests/v2/actions/execution_compile.bash
Normal file
11
cmake_targets/autotests/v2/actions/execution_compile.bash
Normal file
@@ -0,0 +1,11 @@
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
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()
|
||||
10
cmake_targets/autotests/v2/actions/run_enb.bash
Normal file
10
cmake_targets/autotests/v2/actions/run_enb.bash
Normal file
@@ -0,0 +1,10 @@
|
||||
#enable control+C reception (to be refined if it does not work)
|
||||
stty isig intr ^C
|
||||
|
||||
cd /tmp/oai_test_setup/oai
|
||||
source oaienv
|
||||
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
|
||||
24
cmake_targets/autotests/v2/actions/start_bandrich.bash
Normal file
24
cmake_targets/autotests/v2/actions/start_bandrich.bash
Normal file
@@ -0,0 +1,24 @@
|
||||
#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
|
||||
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_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)
|
||||
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!
|
||||
389
cmake_targets/autotests/v2/alu_test.py
Normal file
389
cmake_targets/autotests/v2/alu_test.py
Normal file
@@ -0,0 +1,389 @@
|
||||
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):
|
||||
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.task_hss = None
|
||||
self.task_enb = None
|
||||
self.task_ue = 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()
|
||||
|
||||
##########################################################################
|
||||
# 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("INFO: ALU test: compile softmodem")
|
||||
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." + 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_bandrich_ue
|
||||
##########################################################################
|
||||
def start_bandrich_ue(self):
|
||||
log("INFO: ALU test: start bandrich UE")
|
||||
self.task_ue = Task("actions/start_bandrich.bash",
|
||||
"start_bandrich",
|
||||
self.ue_machine,
|
||||
self.oai_user,
|
||||
self.oai_password,
|
||||
self.env,
|
||||
self.logdir + "/start_bandrich." + 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: bandrich UE did not connect")
|
||||
raise TestFailed()
|
||||
|
||||
self.event.clear()
|
||||
|
||||
if ( not self.task_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 bandrich UE IP
|
||||
l = open(self.task_ue.logfile, "r").read()
|
||||
self.bandrich_ue_ip = re.search("local IP address (.*)\n", l) \
|
||||
.groups()[0]
|
||||
log("INFO: ALU test: bandrich UE IP address: " + self.bandrich_ue_ip)
|
||||
|
||||
##########################################################################
|
||||
# stop_bandrich_ue
|
||||
##########################################################################
|
||||
def stop_bandrich_ue(self):
|
||||
log("INFO: ALU test: stop bandrich UE")
|
||||
self.task_ue.sendnow("%c" % 3)
|
||||
ret = self.task_ue.wait()
|
||||
if ret != 0:
|
||||
log("ERROR: ALU test: task bandrich 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 ( not self.task_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.alive():
|
||||
self.task_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 ( not self.task_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):
|
||||
self._do_traffic("bandrich downlink TCP",
|
||||
"server_tcp", self.ue_machine, self.bandrich_ue_ip,
|
||||
"client_tcp", self.epc_machine,
|
||||
"Server listening on TCP port 5001",
|
||||
"bandrich_downlink_tcp_server",
|
||||
"bandrich_downlink_tcp_client")
|
||||
|
||||
##########################################################################
|
||||
# ul_tcp
|
||||
##########################################################################
|
||||
def ul_tcp(self):
|
||||
self._do_traffic("bandrich uplink TCP",
|
||||
"server_tcp", self.epc_machine, "192.172.0.1",
|
||||
"client_tcp", self.ue_machine,
|
||||
"Server listening on TCP port 5001",
|
||||
"bandrich_uplink_tcp_server",
|
||||
"bandrich_uplink_tcp_client")
|
||||
|
||||
##########################################################################
|
||||
# dl_udp
|
||||
##########################################################################
|
||||
def dl_udp(self, bandwidth):
|
||||
self._do_traffic("bandrich downlink UDP",
|
||||
"server_udp", self.ue_machine, self.bandrich_ue_ip,
|
||||
"client_udp", self.epc_machine,
|
||||
"Server listening on UDP port 5001",
|
||||
"bandrich_downlink_udp_server",
|
||||
"bandrich_downlink_udp_client",
|
||||
udp_bandwidth=bandwidth)
|
||||
|
||||
##########################################################################
|
||||
# ul_udp
|
||||
##########################################################################
|
||||
def ul_udp(self, bandwidth):
|
||||
self._do_traffic("bandrich uplink UDP",
|
||||
"server_udp", self.epc_machine, "192.172.0.1",
|
||||
"client_udp", self.ue_machine,
|
||||
"Server listening on UDP port 5001",
|
||||
"bandrich_uplink_udp_server",
|
||||
"bandrich_uplink_udp_client",
|
||||
udp_bandwidth=bandwidth)
|
||||
|
||||
##############################################################################
|
||||
# run_b210_alu
|
||||
##############################################################################
|
||||
|
||||
def run_b210_alu(tests, openair_dir, oai_user, oai_password, env):
|
||||
if not do_tests(tests['b210']['alu']):
|
||||
return
|
||||
|
||||
#compile eNB
|
||||
|
||||
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',
|
||||
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
|
||||
|
||||
#run tests
|
||||
|
||||
udp_dl_bandwidth = { "5" : "15M",
|
||||
"10" : "30M",
|
||||
"20" : "60M" }
|
||||
|
||||
udp_ul_bandwidth = { "5" : "7M",
|
||||
"10" : "15M",
|
||||
"20" : "15M" }
|
||||
|
||||
for bw in ('5', '10', '20'):
|
||||
if do_tests(tests['b210']['alu'][bw]):
|
||||
log("INFO: ALU test: run tests for bandwidth " + bw + " MHz")
|
||||
ctest = tests['b210']['alu'][bw]
|
||||
alu = alu_test(epc='amerique', enb='hutch', ue='stevens',
|
||||
openair=openair_dir,
|
||||
user=oai_user, password=oai_password,
|
||||
log_subdir='enb_tests/b210_alu/' + bw,
|
||||
env=env)
|
||||
try:
|
||||
alu.start_epc()
|
||||
alu.start_enb("enb.band7.tm1.usrpb210." + bw + "MHz.conf")
|
||||
if do_tests(ctest['bandrich']):
|
||||
alu.start_bandrich_ue()
|
||||
if do_tests(ctest['bandrich']['tcp']['dl']): alu.dl_tcp()
|
||||
if do_tests(ctest['bandrich']['tcp']['ul']): alu.ul_tcp()
|
||||
if do_tests(ctest['bandrich']['udp']['dl']):
|
||||
alu.dl_udp(udp_dl_bandwidth[bw])
|
||||
if do_tests(ctest['bandrich']['udp']['ul']):
|
||||
alu.ul_udp(udp_ul_bandwidth[bw])
|
||||
alu.stop_bandrich_ue()
|
||||
alu.stop_enb()
|
||||
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 = "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 = 1;
|
||||
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 = 1;
|
||||
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 = 1;
|
||||
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";
|
||||
};
|
||||
}
|
||||
);
|
||||
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)
|
||||
687
cmake_targets/autotests/v2/main.py
Normal file
687
cmake_targets/autotests/v2/main.py
Normal file
@@ -0,0 +1,687 @@
|
||||
#!/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 = {
|
||||
'b210' : {
|
||||
'alu' : {
|
||||
'5' : {
|
||||
'bandrich' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }},
|
||||
'sony' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }}},
|
||||
'10' : {
|
||||
'bandrich' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }},
|
||||
'sony' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }}},
|
||||
'20' : {
|
||||
'bandrich' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }},
|
||||
'sony' : {
|
||||
'tcp' : { 'ul': False, 'dl' : False },
|
||||
'udp' : { 'ul': False, 'dl' : False }}}},
|
||||
'openair-cn' : {}
|
||||
},
|
||||
'x310' : {
|
||||
'alu' : {},
|
||||
'openair-cn' : {}
|
||||
},
|
||||
'exmimo2' : {
|
||||
'alu' : {},
|
||||
'openair-cn' : {}
|
||||
}
|
||||
}
|
||||
|
||||
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'][ '5']['bandrich']['udp']['ul']=True
|
||||
if test=='015501':tests['b210']['alu']['10']['bandrich']['udp']['ul']=True
|
||||
if test=='015502':tests['b210']['alu']['20']['bandrich']['udp']['ul']=True
|
||||
if test=='015503':tests['b210']['alu'][ '5']['bandrich']['udp']['dl']=True
|
||||
if test=='015504':tests['b210']['alu']['10']['bandrich']['udp']['dl']=True
|
||||
if test=='015505':tests['b210']['alu']['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'][ '5']['bandrich']['tcp']['ul']=True
|
||||
if test=='015513':tests['b210']['alu']['10']['bandrich']['tcp']['ul']=True
|
||||
if test=='015514':tests['b210']['alu']['20']['bandrich']['tcp']['ul']=True
|
||||
if test=='015515':tests['b210']['alu'][ '5']['bandrich']['tcp']['dl']=True
|
||||
if test=='015516':tests['b210']['alu']['10']['bandrich']['tcp']['dl']=True
|
||||
if test=='015517':tests['b210']['alu']['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=='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=='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
|
||||
@@ -35,6 +35,7 @@ source $THIS_SCRIPT_PATH/tools/build_helper
|
||||
|
||||
MSC_GEN="False"
|
||||
XFORMS="True"
|
||||
FLEXRAN_AGENT_SB_IF="True"
|
||||
PRINT_STATS="False"
|
||||
VCD_TIMING="False"
|
||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||
@@ -53,19 +54,23 @@ BUILD_DOXYGEN=0
|
||||
T_TRACER="False"
|
||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||
CMAKE_BUILD_TYPE=""
|
||||
UE_AUTOTEST_TRACE="False"
|
||||
trap handle_ctrl_c INT
|
||||
|
||||
gen_nvram_path=$OPENAIR_DIR/targets/bin
|
||||
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
||||
|
||||
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,9 +85,15 @@ 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,
|
||||
Rel8 limits the implementation to 3GPP Release 8 version
|
||||
@@ -93,7 +104,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 +138,8 @@ Options
|
||||
Enables the T tracer.
|
||||
--disable-hardware-dependency
|
||||
Disable HW dependency during installation
|
||||
--ue-autotest-trace
|
||||
Enable specific traces for UE autotest framework
|
||||
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 +147,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
|
||||
@@ -169,10 +183,20 @@ function main() {
|
||||
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 +302,14 @@ 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;;
|
||||
--uhd-images-dir)
|
||||
UHD_IMAGES_DIR=$2
|
||||
echo_info "Downloading UHD images in the indicated location"
|
||||
shift 2;;
|
||||
-h | --help)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -321,7 +353,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,6 +380,10 @@ 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
|
||||
############################################
|
||||
@@ -385,7 +421,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
|
||||
@@ -404,9 +440,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 +475,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,6 +486,12 @@ 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
|
||||
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 ..
|
||||
@@ -494,15 +539,17 @@ function main() {
|
||||
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
|
||||
@@ -520,7 +567,7 @@ function main() {
|
||||
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 +628,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
|
||||
@@ -621,10 +671,13 @@ function main() {
|
||||
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 +693,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
|
||||
@@ -725,8 +790,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 +800,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 +810,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 +827,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
|
||||
|
||||
@@ -8,7 +8,7 @@ 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 $@
|
||||
@@ -136,6 +136,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 +167,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,6 +178,42 @@ 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/
|
||||
./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 "
|
||||
(
|
||||
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
|
||||
}
|
||||
|
||||
check_install_usrp_uhd_driver(){
|
||||
#first we remove old installation
|
||||
$SUDO apt-get remove -y uhd || true
|
||||
@@ -172,15 +223,19 @@ 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
|
||||
}
|
||||
|
||||
install_usrp_uhd_driver() {
|
||||
# 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
|
||||
if [ -z $1 ]; then
|
||||
$SUDO uhd_images_downloader
|
||||
else
|
||||
$SUDO uhd_images_downloader -i $1
|
||||
fi
|
||||
}
|
||||
|
||||
check_install_bladerf_driver(){
|
||||
@@ -188,9 +243,9 @@ check_install_bladerf_driver(){
|
||||
$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
|
||||
$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
|
||||
}
|
||||
|
||||
flash_firmware_bladerf() {
|
||||
@@ -324,6 +379,7 @@ check_install_oai_software() {
|
||||
xmlstarlet \
|
||||
python-pip \
|
||||
pydb \
|
||||
libyaml-dev \
|
||||
wget
|
||||
|
||||
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
|
||||
@@ -337,6 +393,10 @@ check_install_oai_software() {
|
||||
$SUDO apt-get install -y libgnutls-dev
|
||||
|
||||
install_asn1c_from_source
|
||||
$SUDO rm -fr /opt/ssh
|
||||
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
|
||||
install_protobuf_from_source
|
||||
install_protobuf_c_from_source
|
||||
}
|
||||
|
||||
### Remove Nettle installation which was done from sources
|
||||
@@ -361,6 +421,7 @@ remove_nettle_from_source() {
|
||||
cd nettle-2.5/
|
||||
./configure --disable-openssl --enable-shared --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
$SUDO ldconfig
|
||||
) >& $nettle_uninstall_log
|
||||
}
|
||||
|
||||
@@ -384,6 +445,7 @@ remove_gnutls_from_source(){
|
||||
cd gnutls-3.1.23/
|
||||
./configure --prefix=/usr
|
||||
$SUDO make uninstall || true
|
||||
$SUDO ldconfig
|
||||
)>& $gnutls_uninstall_log
|
||||
}
|
||||
|
||||
@@ -398,6 +460,7 @@ install_asn1c_from_source(){
|
||||
make -j`nproc`
|
||||
$SUDO make install
|
||||
cd -
|
||||
$SUDO ldconfig
|
||||
) > $asn1_install_log 2>&1
|
||||
}
|
||||
|
||||
@@ -406,19 +469,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
|
||||
|
||||
}
|
||||
|
||||
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=oip0
|
||||
#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 $OPENAIR_DIR/targets/bin/ue_ip.ko
|
||||
|
||||
if [ "$1" = "UE" ]; then
|
||||
echo "bring up oip0 interface for UE"
|
||||
ifconfig oip0 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
|
||||
@@ -247,12 +247,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"
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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
|
||||
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
|
||||
@@ -65,6 +65,14 @@ 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
|
||||
@@ -74,7 +82,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
|
||||
@@ -85,7 +93,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
|
||||
@@ -415,6 +423,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
|
||||
@@ -776,6 +805,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
|
||||
@@ -934,6 +1042,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
|
||||
@@ -1238,6 +1350,30 @@ ID = VCD_VARIABLE_UE0_SFN7
|
||||
DESC = VCD variable UE0_SFN7
|
||||
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
|
||||
|
||||
@@ -1281,6 +1417,54 @@ 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
|
||||
DESC = VCD function eNB_TX
|
||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||
@@ -1373,8 +1557,8 @@ 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_PHY_PROCEDURES_ENB_SLOT_FEP
|
||||
DESC = VCD function PHY_PROCEDURES_ENB_SLOT_FEP
|
||||
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
|
||||
@@ -1385,6 +1569,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
|
||||
@@ -1473,6 +1677,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
|
||||
@@ -1557,6 +1777,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
|
||||
@@ -1577,6 +1801,14 @@ 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
|
||||
@@ -1689,6 +1921,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
|
||||
@@ -1733,6 +1969,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
|
||||
|
||||
@@ -5,7 +5,7 @@ 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
|
||||
|
||||
record: utils.o record.o database.o config.o
|
||||
$(CC) $(CFLAGS) -o record $^ $(LIBS)
|
||||
@@ -26,6 +26,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <ctype.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <math.h>
|
||||
|
||||
void new_thread(void *(*f)(void *), void *data)
|
||||
{
|
||||
@@ -36,6 +37,16 @@ void sleepms(int ms)
|
||||
if (nanosleep(&t, NULL)) abort();
|
||||
}
|
||||
|
||||
void bps(char *out, float v, char *suffix)
|
||||
{
|
||||
static char *bps_unit[4] = { "", "k", "M", "G" };
|
||||
int flog;
|
||||
if (v < 1000) flog = 0; else flog = floor(floor(log10(v)) / 3);
|
||||
if (flog > 3) flog = 3;
|
||||
v /= pow(10, flog*3);
|
||||
sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* list */
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
void new_thread(void *(*f)(void *), void *data);
|
||||
void sleepms(int ms);
|
||||
void bps(char *out, float v, char *suffix);
|
||||
|
||||
/****************************************************************************/
|
||||
/* list */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
CC=gcc
|
||||
CFLAGS=-Wall -g -pthread -I.. -I../logger
|
||||
|
||||
OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o
|
||||
OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o scrolltti.o
|
||||
|
||||
view.a: $(OBJS)
|
||||
ar cr view.a $(OBJS)
|
||||
|
||||
100
common/utils/T/tracer/view/scrolltti.c
Normal file
100
common/utils/T/tracer/view/scrolltti.c
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "view.h"
|
||||
#include "../utils.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
struct scrolltti {
|
||||
view common;
|
||||
gui *g;
|
||||
widget *w;
|
||||
widget *throughput_textarea;
|
||||
int plot;
|
||||
float refresh_rate;
|
||||
pthread_mutex_t lock;
|
||||
unsigned long data[1000];
|
||||
unsigned long total; /* sum data[0..999] to have smoother value printed */
|
||||
float xout[1000];
|
||||
float yout[1000];
|
||||
int insert_point;
|
||||
};
|
||||
|
||||
/* this array is used to get Y range 1000, 2000, 5000, 10000, ... */
|
||||
static int tolog[11] = { -1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10 };
|
||||
|
||||
static void *scrolltti_thread(void *_this)
|
||||
{
|
||||
struct scrolltti *this = _this;
|
||||
int i;
|
||||
int p;
|
||||
float max, mlog;
|
||||
char o[64];
|
||||
|
||||
while (1) {
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
/* TODO: optimize */
|
||||
p = this->insert_point;
|
||||
max = 0;
|
||||
for (i = 0; i < 1000; i++) {
|
||||
this->xout[i] = i;
|
||||
this->yout[i] = this->data[p];
|
||||
if (this->data[p] > max) max = this->data[p];
|
||||
p = (p + 1) % 1000;
|
||||
}
|
||||
bps(o, this->total/1000., "b/s");
|
||||
textarea_set_text(this->g, this->throughput_textarea, o);
|
||||
/* for Y range we want 1000, 2000, 5000, 10000, 20000, 50000, etc. */
|
||||
if (max < 1000) max = 1000;
|
||||
mlog = pow(10, floor(log10(max)));
|
||||
max = tolog[(int)ceil(max/mlog)] * mlog;
|
||||
xy_plot_set_range(this->g, this->w, 0, 1000, 0, max);
|
||||
xy_plot_set_points(this->g, this->w, this->plot,
|
||||
1000, this->xout, this->yout);
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
sleepms(1000/this->refresh_rate);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void clear(view *this)
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
static void append(view *_this, int frame, int subframe, double value)
|
||||
{
|
||||
struct scrolltti *this = (struct scrolltti *)_this;
|
||||
|
||||
if (pthread_mutex_lock(&this->lock)) abort();
|
||||
this->total -= this->data[this->insert_point];
|
||||
this->data[this->insert_point] = value;
|
||||
this->total += this->data[this->insert_point];
|
||||
this->insert_point = (this->insert_point + 1) % 1000;
|
||||
if (pthread_mutex_unlock(&this->lock)) abort();
|
||||
}
|
||||
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, int color,
|
||||
widget *throughput_textarea)
|
||||
{
|
||||
struct scrolltti *ret = calloc(1, sizeof(struct scrolltti));
|
||||
if (ret == NULL) abort();
|
||||
|
||||
ret->common.clear = clear;
|
||||
ret->common.append = (void (*)(view *, ...))append;
|
||||
|
||||
ret->refresh_rate = refresh_rate;
|
||||
ret->g = g;
|
||||
ret->w = w;
|
||||
ret->throughput_textarea = throughput_textarea;
|
||||
ret->plot = xy_plot_new_plot(g, w, color);
|
||||
|
||||
if (pthread_mutex_init(&ret->lock, NULL)) abort();
|
||||
|
||||
new_thread(scrolltti_thread, ret);
|
||||
|
||||
return (view *)ret;
|
||||
}
|
||||
@@ -19,6 +19,8 @@ view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
|
||||
int color, enum xy_mode mode);
|
||||
view *new_view_tti(float refresh_rate, gui *g, widget *w,
|
||||
int color);
|
||||
view *new_view_scrolltti(float refresh_rate, gui *g, widget *w,
|
||||
int color, widget *throughput_label);
|
||||
view *new_view_time(int number_of_seconds, float refresh_rate,
|
||||
gui *g, widget *w);
|
||||
view *new_subview_time(view *time, int line, int color, int size);
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
/*
|
||||
/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */
|
||||
/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
/*-
|
||||
* Copyright 2002 Niels Provos <provos@citi.umich.edu>
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -26,6 +30,8 @@
|
||||
#ifndef _SYS_TREE_H_
|
||||
#define _SYS_TREE_H_
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
/*
|
||||
* This file defines data structures for different types of trees:
|
||||
* splay trees and red-black trees.
|
||||
@@ -63,7 +69,7 @@ struct name { \
|
||||
|
||||
#define SPLAY_INIT(root) do { \
|
||||
(root)->sph_root = NULL; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ENTRY(type) \
|
||||
struct { \
|
||||
@@ -81,32 +87,32 @@ struct { \
|
||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \
|
||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
||||
(head)->sph_root = tmp; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \
|
||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \
|
||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
||||
(head)->sph_root = tmp; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_LINKLEFT(head, tmp, field) do { \
|
||||
SPLAY_LEFT(tmp, field) = (head)->sph_root; \
|
||||
tmp = (head)->sph_root; \
|
||||
(head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_LINKRIGHT(head, tmp, field) do { \
|
||||
SPLAY_RIGHT(tmp, field) = (head)->sph_root; \
|
||||
tmp = (head)->sph_root; \
|
||||
(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \
|
||||
SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \
|
||||
SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\
|
||||
SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \
|
||||
SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
/* Generates prototypes and inline functions */
|
||||
|
||||
@@ -207,7 +213,7 @@ name##_SPLAY(struct name *head, struct type *elm) \
|
||||
SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
|
||||
__left = __right = &__node; \
|
||||
\
|
||||
while ((__comp = (cmp)(elm, (head)->sph_root))) { \
|
||||
while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \
|
||||
if (__comp < 0) { \
|
||||
__tmp = SPLAY_LEFT((head)->sph_root, field); \
|
||||
if (__tmp == NULL) \
|
||||
@@ -286,7 +292,7 @@ void name##_SPLAY_MINMAX(struct name *head, int __comp) \
|
||||
(x) != NULL; \
|
||||
(x) = SPLAY_NEXT(name, head, x))
|
||||
|
||||
/* Macros that define a red-back tree */
|
||||
/* Macros that define a red-black tree */
|
||||
#define RB_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *rbh_root; /* root of the tree */ \
|
||||
@@ -297,7 +303,7 @@ struct name { \
|
||||
|
||||
#define RB_INIT(root) do { \
|
||||
(root)->rbh_root = NULL; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_BLACK 0
|
||||
#define RB_RED 1
|
||||
@@ -320,24 +326,24 @@ struct { \
|
||||
RB_PARENT(elm, field) = parent; \
|
||||
RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \
|
||||
RB_COLOR(elm, field) = RB_RED; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_SET_BLACKRED(black, red, field) do { \
|
||||
RB_COLOR(black, field) = RB_BLACK; \
|
||||
RB_COLOR(red, field) = RB_RED; \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#ifndef RB_AUGMENT
|
||||
#define RB_AUGMENT(x)
|
||||
#define RB_AUGMENT(x) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \
|
||||
(tmp) = RB_RIGHT(elm, field); \
|
||||
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \
|
||||
if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \
|
||||
RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \
|
||||
} \
|
||||
RB_AUGMENT(elm); \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
||||
else \
|
||||
@@ -349,15 +355,15 @@ struct { \
|
||||
RB_AUGMENT(tmp); \
|
||||
if ((RB_PARENT(tmp, field))) \
|
||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \
|
||||
(tmp) = RB_LEFT(elm, field); \
|
||||
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \
|
||||
if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \
|
||||
RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \
|
||||
} \
|
||||
RB_AUGMENT(elm); \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \
|
||||
if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \
|
||||
if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
|
||||
RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \
|
||||
else \
|
||||
@@ -369,28 +375,66 @@ struct { \
|
||||
RB_AUGMENT(tmp); \
|
||||
if ((RB_PARENT(tmp, field))) \
|
||||
RB_AUGMENT(RB_PARENT(tmp, field)); \
|
||||
} while (0)
|
||||
} while (/*CONSTCOND*/ 0)
|
||||
|
||||
/* Generates prototypes and inline functions */
|
||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
||||
void name##_RB_INSERT_COLOR(struct name *, struct type *); \
|
||||
void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
|
||||
struct type *name##_RB_REMOVE(struct name *, struct type *); \
|
||||
struct type *name##_RB_INSERT(struct name *, struct type *); \
|
||||
struct type *name##_RB_FIND(struct name *, struct type *); \
|
||||
struct type *name##_RB_NEXT(struct type *); \
|
||||
struct type *name##_RB_MINMAX(struct name *, int); \
|
||||
\
|
||||
#define RB_PROTOTYPE(name, type, field, cmp) \
|
||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
|
||||
#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \
|
||||
RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static)
|
||||
#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \
|
||||
RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \
|
||||
RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \
|
||||
RB_PROTOTYPE_INSERT(name, type, attr); \
|
||||
RB_PROTOTYPE_REMOVE(name, type, attr); \
|
||||
RB_PROTOTYPE_FIND(name, type, attr); \
|
||||
RB_PROTOTYPE_NFIND(name, type, attr); \
|
||||
RB_PROTOTYPE_NEXT(name, type, attr); \
|
||||
RB_PROTOTYPE_PREV(name, type, attr); \
|
||||
RB_PROTOTYPE_MINMAX(name, type, attr);
|
||||
#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \
|
||||
attr void name##_RB_INSERT_COLOR(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \
|
||||
attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *)
|
||||
#define RB_PROTOTYPE_REMOVE(name, type, attr) \
|
||||
attr struct type *name##_RB_REMOVE(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_INSERT(name, type, attr) \
|
||||
attr struct type *name##_RB_INSERT(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_FIND(name, type, attr) \
|
||||
attr struct type *name##_RB_FIND(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_NFIND(name, type, attr) \
|
||||
attr struct type *name##_RB_NFIND(struct name *, struct type *)
|
||||
#define RB_PROTOTYPE_NEXT(name, type, attr) \
|
||||
attr struct type *name##_RB_NEXT(struct type *)
|
||||
#define RB_PROTOTYPE_PREV(name, type, attr) \
|
||||
attr struct type *name##_RB_PREV(struct type *)
|
||||
#define RB_PROTOTYPE_MINMAX(name, type, attr) \
|
||||
attr struct type *name##_RB_MINMAX(struct name *, int)
|
||||
|
||||
/* Main rb operation.
|
||||
* Moves node close to the key of elm to top
|
||||
*/
|
||||
#define RB_GENERATE(name, type, field, cmp) \
|
||||
void \
|
||||
#define RB_GENERATE(name, type, field, cmp) \
|
||||
RB_GENERATE_INTERNAL(name, type, field, cmp,)
|
||||
#define RB_GENERATE_STATIC(name, type, field, cmp) \
|
||||
RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static)
|
||||
#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
|
||||
RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \
|
||||
RB_GENERATE_INSERT(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_REMOVE(name, type, field, attr) \
|
||||
RB_GENERATE_FIND(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_NFIND(name, type, field, cmp, attr) \
|
||||
RB_GENERATE_NEXT(name, type, field, attr) \
|
||||
RB_GENERATE_PREV(name, type, field, attr) \
|
||||
RB_GENERATE_MINMAX(name, type, field, attr)
|
||||
|
||||
#define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
|
||||
attr void \
|
||||
name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *parent, *gparent, *tmp; \
|
||||
while ((parent = RB_PARENT(elm, field)) && \
|
||||
while ((parent = RB_PARENT(elm, field)) != NULL && \
|
||||
RB_COLOR(parent, field) == RB_RED) { \
|
||||
gparent = RB_PARENT(parent, field); \
|
||||
if (parent == RB_LEFT(gparent, field)) { \
|
||||
@@ -428,9 +472,10 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
|
||||
} \
|
||||
} \
|
||||
RB_COLOR(head->rbh_root, field) = RB_BLACK; \
|
||||
} \
|
||||
\
|
||||
void \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \
|
||||
attr void \
|
||||
name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp; \
|
||||
@@ -454,7 +499,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
if (RB_RIGHT(tmp, field) == NULL || \
|
||||
RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\
|
||||
struct type *oleft; \
|
||||
if ((oleft = RB_LEFT(tmp, field)))\
|
||||
if ((oleft = RB_LEFT(tmp, field)) \
|
||||
!= NULL) \
|
||||
RB_COLOR(oleft, field) = RB_BLACK;\
|
||||
RB_COLOR(tmp, field) = RB_RED; \
|
||||
RB_ROTATE_RIGHT(head, tmp, oleft, field);\
|
||||
@@ -486,7 +532,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
if (RB_LEFT(tmp, field) == NULL || \
|
||||
RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\
|
||||
struct type *oright; \
|
||||
if ((oright = RB_RIGHT(tmp, field)))\
|
||||
if ((oright = RB_RIGHT(tmp, field)) \
|
||||
!= NULL) \
|
||||
RB_COLOR(oright, field) = RB_BLACK;\
|
||||
RB_COLOR(tmp, field) = RB_RED; \
|
||||
RB_ROTATE_LEFT(head, tmp, oright, field);\
|
||||
@@ -504,9 +551,10 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm)
|
||||
} \
|
||||
if (elm) \
|
||||
RB_COLOR(elm, field) = RB_BLACK; \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_REMOVE(name, type, field, attr) \
|
||||
attr struct type * \
|
||||
name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *child, *parent, *old = elm; \
|
||||
@@ -518,7 +566,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
else { \
|
||||
struct type *left; \
|
||||
elm = RB_RIGHT(elm, field); \
|
||||
while ((left = RB_LEFT(elm, field))) \
|
||||
while ((left = RB_LEFT(elm, field)) != NULL) \
|
||||
elm = left; \
|
||||
child = RB_RIGHT(elm, field); \
|
||||
parent = RB_PARENT(elm, field); \
|
||||
@@ -551,7 +599,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \
|
||||
left = parent; \
|
||||
do { \
|
||||
RB_AUGMENT(left); \
|
||||
} while ((left = RB_PARENT(left, field))); \
|
||||
} while ((left = RB_PARENT(left, field)) != NULL); \
|
||||
} \
|
||||
goto color; \
|
||||
} \
|
||||
@@ -572,9 +620,10 @@ color: \
|
||||
name##_RB_REMOVE_COLOR(head, parent, child); \
|
||||
return (old); \
|
||||
} \
|
||||
\
|
||||
|
||||
#define RB_GENERATE_INSERT(name, type, field, cmp, attr) \
|
||||
/* Inserts a node into the RB tree */ \
|
||||
struct type * \
|
||||
attr struct type * \
|
||||
name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp; \
|
||||
@@ -599,15 +648,14 @@ name##_RB_INSERT(struct name *head, struct type *elm) \
|
||||
RB_RIGHT(parent, field) = elm; \
|
||||
RB_AUGMENT(parent); \
|
||||
} else \
|
||||
{ \
|
||||
RB_ROOT(head) = elm; \
|
||||
} \
|
||||
name##_RB_INSERT_COLOR(head, elm); \
|
||||
return (NULL); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define RB_GENERATE_FIND(name, type, field, cmp, attr) \
|
||||
/* Finds the node with the same key as elm */ \
|
||||
struct type * \
|
||||
attr struct type * \
|
||||
name##_RB_FIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
@@ -622,9 +670,33 @@ name##_RB_FIND(struct name *head, struct type *elm) \
|
||||
return (tmp); \
|
||||
} \
|
||||
return (NULL); \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_NFIND(name, type, field, cmp, attr) \
|
||||
/* Finds the first node greater than or equal to the search key */ \
|
||||
attr struct type * \
|
||||
name##_RB_NFIND(struct name *head, struct type *elm) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
struct type *res = NULL; \
|
||||
int comp; \
|
||||
while (tmp) { \
|
||||
comp = cmp(elm, tmp); \
|
||||
if (comp < 0) { \
|
||||
res = tmp; \
|
||||
tmp = RB_LEFT(tmp, field); \
|
||||
} \
|
||||
else if (comp > 0) \
|
||||
tmp = RB_RIGHT(tmp, field); \
|
||||
else \
|
||||
return (tmp); \
|
||||
} \
|
||||
return (res); \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_NEXT(name, type, field, attr) \
|
||||
/* ARGSUSED */ \
|
||||
attr struct type * \
|
||||
name##_RB_NEXT(struct type *elm) \
|
||||
{ \
|
||||
if (RB_RIGHT(elm, field)) { \
|
||||
@@ -643,9 +715,33 @@ name##_RB_NEXT(struct type *elm) \
|
||||
} \
|
||||
} \
|
||||
return (elm); \
|
||||
} \
|
||||
\
|
||||
struct type * \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_PREV(name, type, field, attr) \
|
||||
/* ARGSUSED */ \
|
||||
attr struct type * \
|
||||
name##_RB_PREV(struct type *elm) \
|
||||
{ \
|
||||
if (RB_LEFT(elm, field)) { \
|
||||
elm = RB_LEFT(elm, field); \
|
||||
while (RB_RIGHT(elm, field)) \
|
||||
elm = RB_RIGHT(elm, field); \
|
||||
} else { \
|
||||
if (RB_PARENT(elm, field) && \
|
||||
(elm == RB_RIGHT(RB_PARENT(elm, field), field))) \
|
||||
elm = RB_PARENT(elm, field); \
|
||||
else { \
|
||||
while (RB_PARENT(elm, field) && \
|
||||
(elm == RB_LEFT(RB_PARENT(elm, field), field)))\
|
||||
elm = RB_PARENT(elm, field); \
|
||||
elm = RB_PARENT(elm, field); \
|
||||
} \
|
||||
} \
|
||||
return (elm); \
|
||||
}
|
||||
|
||||
#define RB_GENERATE_MINMAX(name, type, field, attr) \
|
||||
attr struct type * \
|
||||
name##_RB_MINMAX(struct name *head, int val) \
|
||||
{ \
|
||||
struct type *tmp = RB_ROOT(head); \
|
||||
@@ -666,7 +762,9 @@ name##_RB_MINMAX(struct name *head, int val) \
|
||||
#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
|
||||
#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
|
||||
#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
|
||||
#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y)
|
||||
#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
|
||||
#define RB_PREV(name, x, y) name##_RB_PREV(y)
|
||||
#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
|
||||
#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
|
||||
|
||||
@@ -675,4 +773,29 @@ name##_RB_MINMAX(struct name *head, int val) \
|
||||
(x) != NULL; \
|
||||
(x) = name##_RB_NEXT(x))
|
||||
|
||||
#define RB_FOREACH_FROM(x, name, y) \
|
||||
for ((x) = (y); \
|
||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_SAFE(x, name, head, y) \
|
||||
for ((x) = RB_MIN(name, head); \
|
||||
((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_REVERSE(x, name, head) \
|
||||
for ((x) = RB_MAX(name, head); \
|
||||
(x) != NULL; \
|
||||
(x) = name##_RB_PREV(x))
|
||||
|
||||
#define RB_FOREACH_REVERSE_FROM(x, name, y) \
|
||||
for ((x) = (y); \
|
||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \
|
||||
for ((x) = RB_MAX(name, head); \
|
||||
((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \
|
||||
(x) = (y))
|
||||
|
||||
#endif /* _SYS_TREE_H_ */
|
||||
|
||||
@@ -65,7 +65,7 @@ _Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "
|
||||
(intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3)
|
||||
|
||||
#define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \
|
||||
_Assert_(cOND, _Assert_Exit_, #vALUE1": %"PRIdMAX"\n"#vALUE2": %"PRIdMAX"\n"#vALUE3": %"PRIdMAX"\n"#vALUE4": %"PRIdMAX"\n\n", \
|
||||
_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \
|
||||
(intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4)
|
||||
|
||||
#define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3)
|
||||
|
||||
@@ -81,13 +81,13 @@
|
||||
#define ITTI_DEBUG_ISSUES (1<<5)
|
||||
#define ITTI_DEBUG_MP_STATISTICS (1<<6)
|
||||
|
||||
const int itti_debug = ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS;
|
||||
const int itti_debug = (ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS);
|
||||
|
||||
/* Don't flush if using RTAI */
|
||||
#ifdef RTAI
|
||||
# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) rt_log_debug (x, ##args); } while(0);
|
||||
#else
|
||||
# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout); } while(0);
|
||||
# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) {fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout);} } while(0);
|
||||
#endif
|
||||
#define ITTI_ERROR(x, args...) do { fprintf(stdout, "[ITTI][E]"x, ##args); fflush (stdout); } while(0);
|
||||
|
||||
|
||||
@@ -71,7 +71,5 @@ typedef struct {
|
||||
#define INSTANCE_DEFAULT (UINT16_MAX - 1)
|
||||
#define INSTANCE_ALL (UINT16_MAX)
|
||||
|
||||
typedef uint16_t instance_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ int timer_handle_signal(siginfo_t *info)
|
||||
timer_p = (struct timer_elm_s *)info->si_ptr;
|
||||
|
||||
// LG: To many traces for msc timer:
|
||||
// TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
|
||||
|
||||
TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
|
||||
|
||||
task_id = timer_p->task_id;
|
||||
instance = timer_p->instance;
|
||||
message_p = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
||||
@@ -120,6 +120,10 @@ int timer_handle_signal(siginfo_t *info)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(ENB_AGENT_SB_IF)
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
23
common/utils/time_utils.h
Normal file
23
common/utils/time_utils.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef _TIME_UTILS_H_
|
||||
#define _TIME_UTILS_H_
|
||||
|
||||
#include <time.h>
|
||||
#include <stdint.h>
|
||||
|
||||
static inline int64_t clock_difftime_ns(struct timespec start, struct timespec end)
|
||||
{
|
||||
struct timespec temp;
|
||||
int64_t temp_ns;
|
||||
|
||||
if ((end.tv_nsec-start.tv_nsec)<0) {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec-1;
|
||||
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
|
||||
} else {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec;
|
||||
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
|
||||
}
|
||||
temp_ns = (int64_t)(temp.tv_sec) * (int64_t)1000000000 + (temp.tv_nsec);
|
||||
return temp_ns;
|
||||
}
|
||||
|
||||
#endif /* _TIME_UTILS_H_ */
|
||||
107
common/utils/utils.c
Normal file
107
common/utils/utils.c
Normal file
@@ -0,0 +1,107 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include "utils.h"
|
||||
|
||||
void *calloc_or_fail(size_t size) {
|
||||
void *ptr = calloc(1, size);
|
||||
if (ptr == NULL) {
|
||||
fprintf(stderr, "[UE] Failed to calloc %zu bytes", size);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void *malloc_or_fail(size_t size) {
|
||||
void *ptr = malloc(size);
|
||||
if (ptr == NULL) {
|
||||
fprintf(stderr, "[UE] Failed to malloc %zu bytes", size);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: hex_char_to_hex_value() **
|
||||
** **
|
||||
** Description: Converts an hexadecimal ASCII coded digit into its value. **
|
||||
** **
|
||||
** Inputs: c: A char holding the ASCII coded value **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: Converted value (-1 on error) **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int hex_char_to_hex_value (char c)
|
||||
{
|
||||
if (!((c >= 'a' && c <= 'f') ||
|
||||
(c >= 'A' && c <= 'F') ||
|
||||
(c >= '0' && c <= '9')))
|
||||
return -1;
|
||||
|
||||
if (c >= 'A') {
|
||||
/* Remove case bit */
|
||||
c &= ~('a' ^ 'A');
|
||||
|
||||
return (c - 'A' + 10);
|
||||
} else {
|
||||
return (c - '0');
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: hex_string_to_hex_value() **
|
||||
** **
|
||||
** Description: Converts an hexadecimal ASCII coded string into its value.**
|
||||
** **
|
||||
** Inputs: hex_value: A pointer to the location to store the **
|
||||
** conversion result **
|
||||
** size: The size of hex_value in bytes **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: hex_value: Converted value **
|
||||
** Return: 0 on success, -1 on error **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (strlen(hex_string) != size*2) {
|
||||
fprintf(stderr, "the string '%s' should be of length %d\n", hex_string, size*2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i=0; i < size; i++) {
|
||||
int a = hex_char_to_hex_value(hex_string[2 * i]);
|
||||
int b = hex_char_to_hex_value(hex_string[2 * i + 1]);
|
||||
if (a == -1 || b == -1) goto error;
|
||||
hex_value[i] = (a << 4) | b;
|
||||
}
|
||||
return 0;
|
||||
|
||||
error:
|
||||
fprintf(stderr, "the string '%s' is not a valid hexadecimal string\n", hex_string);
|
||||
for (i=0; i < size; i++)
|
||||
hex_value[i] = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *itoa(int i) {
|
||||
char buffer[64];
|
||||
int ret;
|
||||
|
||||
ret = snprintf(buffer, sizeof(buffer), "%d",i);
|
||||
if ( ret <= 0 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return strdup(buffer);
|
||||
}
|
||||
|
||||
17
common/utils/utils.h
Normal file
17
common/utils/utils.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef _UTILS_H
|
||||
#define _UTILS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
void *calloc_or_fail(size_t size);
|
||||
void *malloc_or_fail(size_t size);
|
||||
|
||||
// Converts an hexadecimal ASCII coded digit into its value. **
|
||||
int hex_char_to_hex_value (char c);
|
||||
// Converts an hexadecimal ASCII coded string into its value.**
|
||||
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
|
||||
|
||||
char *itoa(int i);
|
||||
|
||||
#endif
|
||||
1
maketags
1
maketags
@@ -1,3 +1,4 @@
|
||||
#!/bin/sh
|
||||
echo "building ctags for openair1 and openair2 ..."
|
||||
ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common
|
||||
|
||||
|
||||
@@ -256,6 +256,7 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB,
|
||||
&PHY_vars_UE->lte_frame_parms,
|
||||
PHY_vars_UE->dlsch_ue[0][0],
|
||||
PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid],
|
||||
frame,
|
||||
subframe,
|
||||
PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid,
|
||||
num_pdcch_symbols,1);
|
||||
|
||||
@@ -206,7 +206,19 @@ void phy_config_dedicated_ue(module_id_t Mod_id,
|
||||
uint8_t CH_index,
|
||||
struct PhysicalConfigDedicated *physicalConfigDedicated);
|
||||
|
||||
/*!
|
||||
\fn void phy_config_harq_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index,
|
||||
uint16_t max_harq_tx)
|
||||
\brief Configure UE UL max harq Tx.
|
||||
\details Invoked upon reception of RRCConnectionSetup or RRCConnectionReconfiguration from eNB.
|
||||
@param Mod_id Instance ID for eNB
|
||||
@param CC_id Component Carrier index
|
||||
@param CH_index Index of eNB for this configuration
|
||||
@param max_harq_tx max harq tx information
|
||||
|
||||
*/
|
||||
void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t CH_index,
|
||||
uint16_t max_harq_tx);
|
||||
/**
|
||||
\brief Configure UE MBSFN common parameters.
|
||||
\details Invoked upon reception of SIB13 from eNB.
|
||||
@@ -292,7 +304,8 @@ void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms);
|
||||
|
||||
//void copy_lte_parms_to_phy_framing(LTE_DL_FRAME_PARMS *frame_parm, PHY_FRAMING *phy_framing);
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -327,7 +340,8 @@ void phy_cleanup(void);
|
||||
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
|
||||
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx_phy,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -338,7 +352,6 @@ void lte_param_init(unsigned char N_tx,
|
||||
uint8_t threequarter_fs,
|
||||
uint8_t osf,
|
||||
uint32_t perfect_ce);
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
|
||||
|
||||
611
openair1/PHY/INIT/lte_init.c
Normal file → Executable file
611
openair1/PHY/INIT/lte_init.c
Normal file → Executable file
@@ -29,7 +29,7 @@
|
||||
#include "LAYER2/MAC/extern.h"
|
||||
#include "MBSFN-SubframeConfigList.h"
|
||||
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||
//#define DEBUG_PHY
|
||||
#define DEBUG_PHY
|
||||
#include "assertions.h"
|
||||
#include <math.h>
|
||||
|
||||
@@ -46,13 +46,12 @@ void phy_config_mib(LTE_DL_FRAME_PARMS *fp,
|
||||
uint8_t p_eNB,
|
||||
PHICH_CONFIG_COMMON *phich_config)
|
||||
{
|
||||
|
||||
fp->N_RB_DL = N_RB_DL;
|
||||
fp->Nid_cell = Nid_cell;
|
||||
fp->nushift = Nid_cell%6;
|
||||
fp->Ncp = Ncp;
|
||||
fp->frame_type = frame_type;
|
||||
fp->nb_antennas_tx_eNB = p_eNB;
|
||||
fp->nb_antenna_ports_eNB = p_eNB;
|
||||
fp->phich_config_common.phich_resource = phich_config->phich_resource;
|
||||
fp->phich_config_common.phich_duration = phich_config->phich_duration;
|
||||
}
|
||||
@@ -212,7 +211,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
|
||||
if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) {
|
||||
fp->MBSFN_config[i].fourFrames_flag = 0;
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
} else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
|
||||
fp->MBSFN_config[i].fourFrames_flag = 1;
|
||||
@@ -221,7 +220,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
|
||||
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
}
|
||||
}
|
||||
@@ -332,7 +331,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id,
|
||||
if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) {
|
||||
fp->MBSFN_config[i].fourFrames_flag = 0;
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
} else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration
|
||||
fp->MBSFN_config[i].fourFrames_flag = 1;
|
||||
@@ -341,7 +340,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id,
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)|
|
||||
(mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16);
|
||||
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i,
|
||||
LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i,
|
||||
fp->MBSFN_config[i].mbsfn_SubframeConfig);
|
||||
}
|
||||
}
|
||||
@@ -358,7 +357,7 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_
|
||||
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
|
||||
|
||||
|
||||
LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
||||
LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
||||
|
||||
if (mbsfn_Area_idx == 0) {
|
||||
fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9;
|
||||
@@ -377,7 +376,7 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx,
|
||||
LTE_DL_FRAME_PARMS *fp = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms;
|
||||
|
||||
|
||||
LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
||||
LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
|
||||
|
||||
if (mbsfn_Area_idx == 0) {
|
||||
fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9;
|
||||
@@ -399,7 +398,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB)
|
||||
physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id];
|
||||
|
||||
if (physicalConfigDedicated != NULL) {
|
||||
LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id);
|
||||
LOG_I(PHY,"[eNB %d] Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id);
|
||||
LOG_D(PHY,"------------------------------------------------------------------------\n");
|
||||
|
||||
if (physicalConfigDedicated->pdsch_ConfigDedicated) {
|
||||
@@ -483,7 +482,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB)
|
||||
}
|
||||
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SchedulingRequestConfig_PR_setup) {
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
||||
eNB->soundingrs_ul_config_dedicated[UE_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift;
|
||||
@@ -654,7 +653,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
|
||||
int8_t UE_id = find_ue(rnti,eNB);
|
||||
|
||||
if (UE_id == -1) {
|
||||
LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n");
|
||||
LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n", Mod_id);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -666,32 +665,34 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
|
||||
if (physicalConfigDedicated->antennaInfo) {
|
||||
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
|
||||
case AntennaInfoDedicated__transmissionMode_tm1:
|
||||
eNB->transmission_mode[UE_id] = 1;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 1;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm2:
|
||||
eNB->transmission_mode[UE_id] = 2;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 2;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm3:
|
||||
eNB->transmission_mode[UE_id] = 3;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 3;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm4:
|
||||
eNB->transmission_mode[UE_id] = 4;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 4;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm5:
|
||||
eNB->transmission_mode[UE_id] = 5;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 5;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm6:
|
||||
eNB->transmission_mode[UE_id] = 6;
|
||||
break;
|
||||
eNB->transmission_mode[UE_id] = 6;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm7:
|
||||
eNB->transmission_mode[UE_id] = 7;
|
||||
break;
|
||||
lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti);
|
||||
eNB->do_precoding = 1;
|
||||
eNB->transmission_mode[UE_id] = 7;
|
||||
break;
|
||||
default:
|
||||
LOG_E(PHY,"Unknown transmission mode!\n");
|
||||
break;
|
||||
LOG_E(PHY,"Unknown transmission mode!\n");
|
||||
break;
|
||||
}
|
||||
LOG_I(PHY,"Transmission Mode (phy_config_dedicated_eNB) %d\n",eNB->transmission_mode[UE_id]);
|
||||
|
||||
|
||||
} else {
|
||||
LOG_D(PHY,"[eNB %d] : Received NULL radioResourceConfigDedicated->antennaInfo from eNB %d\n",Mod_id,UE_id);
|
||||
}
|
||||
@@ -725,13 +726,13 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
|
||||
|
||||
if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) {
|
||||
carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1
|
||||
LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
|
||||
LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
|
||||
} else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) {
|
||||
carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1
|
||||
// this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band
|
||||
LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
|
||||
LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id,/*eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id);
|
||||
} else {
|
||||
LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id);
|
||||
LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %ld of SCell %d for UE %d not supported\n",Mod_id,/*eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id);
|
||||
}
|
||||
|
||||
if (physicalConfigDedicatedSCell_r10) {
|
||||
@@ -746,6 +747,14 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
|
||||
}
|
||||
#endif
|
||||
|
||||
void phy_config_harq_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
uint16_t max_harq_tx )
|
||||
{
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||
phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx;
|
||||
}
|
||||
|
||||
void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
struct PhysicalConfigDedicated *physicalConfigDedicated )
|
||||
{
|
||||
@@ -827,33 +836,33 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
if (physicalConfigDedicated->antennaInfo) {
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode);
|
||||
LOG_D(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]);
|
||||
LOG_D(PHY,"\n");
|
||||
switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) {
|
||||
case AntennaInfoDedicated__transmissionMode_tm1:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 1;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 1;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm2:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 2;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 2;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm3:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 3;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 3;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm4:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 4;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 4;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm5:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 5;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 5;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm6:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 6;
|
||||
break;
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 6;
|
||||
break;
|
||||
case AntennaInfoDedicated__transmissionMode_tm7:
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 7;
|
||||
break;
|
||||
lte_gold_ue_spec_port5(phy_vars_ue->lte_gold_uespec_port5_table, phy_vars_ue->frame_parms.Nid_cell, phy_vars_ue->pdcch_vars[eNB_id]->crnti);
|
||||
phy_vars_ue->transmission_mode[eNB_id] = 7;
|
||||
break;
|
||||
default:
|
||||
LOG_E(PHY,"Unknown transmission mode!\n");
|
||||
break;
|
||||
}
|
||||
LOG_E(PHY,"Unknown transmission mode!\n");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG_D(PHY,"[UE %d] Received NULL physicalConfigDedicated->antennaInfo from eNB %d\n",Mod_id, eNB_id);
|
||||
}
|
||||
@@ -876,7 +885,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) {
|
||||
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 0;
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SchedulingRequestConfig_PR_setup) {
|
||||
if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) {
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 1;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration;
|
||||
phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift;
|
||||
@@ -897,29 +906,29 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,
|
||||
|
||||
if (physicalConfigDedicated->cqi_ReportConfig) {
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) {
|
||||
// configure PUSCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
||||
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
||||
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
||||
// configure PUSCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic;
|
||||
if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) &&
|
||||
(phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31))
|
||||
LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic);
|
||||
}
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) {
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) {
|
||||
// configure PUCCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
||||
}
|
||||
else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_release) {
|
||||
// handle release
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||
}
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) {
|
||||
// configure PUCCH CQI reporting
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
|
||||
if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex)
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex;
|
||||
}
|
||||
else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_release) {
|
||||
// handle release
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
|
||||
phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef CBA
|
||||
|
||||
if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) {
|
||||
@@ -1007,17 +1016,22 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
|
||||
pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL );
|
||||
pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||
pdsch->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
|
||||
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
|
||||
|
||||
|
||||
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_uespec_pilots = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_bf_ch_estimates = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_bf_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
//pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
// the allocated memory size is fixed:
|
||||
AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
|
||||
@@ -1028,18 +1042,20 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
|
||||
for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
|
||||
const int idx = (j<<1)+i;
|
||||
const size_t num = 7*2*fp->N_RB_DL*12;
|
||||
pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
|
||||
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
|
||||
pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
//pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
int nb_connected_eNB,
|
||||
uint8_t abstraction_flag)
|
||||
@@ -1048,7 +1064,8 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
// create shortcuts
|
||||
LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms;
|
||||
LTE_UE_COMMON* const common_vars = &ue->common_vars;
|
||||
LTE_UE_PDSCH** const pdsch_vars = ue->pdsch_vars;
|
||||
LTE_UE_PDSCH** const pdsch_vars_th0 = ue->pdsch_vars[0];
|
||||
LTE_UE_PDSCH** const pdsch_vars_th1 = ue->pdsch_vars[1];
|
||||
LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI;
|
||||
LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra;
|
||||
LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH;
|
||||
@@ -1056,7 +1073,7 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
LTE_UE_PDCCH** const pdcch_vars = ue->pdcch_vars;
|
||||
LTE_UE_PRACH** const prach_vars = ue->prach_vars;
|
||||
|
||||
int i,j,k;
|
||||
int i,j,k,l;
|
||||
int eNB_id;
|
||||
|
||||
printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
|
||||
@@ -1101,32 +1118,37 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
// init RX buffers
|
||||
|
||||
common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdataF2 = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) );
|
||||
common_vars->rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
||||
common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti*10) );
|
||||
common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
||||
common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
|
||||
}
|
||||
}
|
||||
|
||||
// Channel estimates
|
||||
for (eNB_id=0; eNB_id<7; eNB_id++) {
|
||||
common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*));
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++)
|
||||
for (j=0; j<4; j++) {
|
||||
int idx = (j<<1) + i;
|
||||
common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
||||
common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
||||
common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
|
||||
common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
common_vars->common_vars_rx_data_per_thread[1].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
}
|
||||
}
|
||||
|
||||
// DLSCH
|
||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
||||
pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
pdsch_vars_th0[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
pdsch_vars_th1[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH));
|
||||
@@ -1135,30 +1157,76 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH));
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp );
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_th0[eNB_id], fp );
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp );
|
||||
|
||||
pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
||||
pdsch_vars[eNB_id]->llr_shifts_p = pdsch_vars[eNB_id]->llr_shifts;
|
||||
pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
// thread 0
|
||||
pdsch_vars_th0[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
||||
pdsch_vars_th0[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
|
||||
pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
pdsch_vars_th0[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||
pdsch_vars_th0[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (k=0; k<8; k++)
|
||||
pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
// thread 0
|
||||
pdsch_vars_th1[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12);
|
||||
pdsch_vars_th1[eNB_id]->llr_shifts_p = pdsch_vars_th0[eNB_id]->llr_shifts;
|
||||
pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
pdsch_vars_th1[eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) );
|
||||
pdsch_vars_th1[eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
|
||||
|
||||
|
||||
for (int i=0; i<fp->nb_antennas_rx; i++){
|
||||
pdsch_vars_th0[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th1[eNB_id]->rho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
}
|
||||
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++)
|
||||
for (j=0; j<4; j++) {
|
||||
int idx = (j<<1)+i;
|
||||
pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
|
||||
for (k=0; k<8; k++)
|
||||
pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*14) );
|
||||
const int idx = (j<<1)+i;
|
||||
const size_t num = 7*2*fp->N_RB_DL*12+4;
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||
}
|
||||
|
||||
|
||||
const size_t num = 7*2*fp->N_RB_DL*12+4;
|
||||
for (k=0;k<8;k++) { //harq_pid
|
||||
for (l=0;l<8;l++) { //round
|
||||
pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||
|
||||
|
||||
for (int i=0; i<fp->nb_antennas_rx; i++)
|
||||
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
|
||||
const int idx = (j<<1)+i;
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th0[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th0[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th1[eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
pdsch_vars_th1[eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) );
|
||||
}
|
||||
}
|
||||
}
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp );
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp );
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp );
|
||||
|
||||
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
|
||||
pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||
pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
|
||||
@@ -1210,14 +1278,17 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
|
||||
// initialization for the last instance of pdsch_vars (used for MU-MIMO)
|
||||
|
||||
pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||
pdsch_vars_th0[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||
pdsch_vars_th1[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||
pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||
pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) );
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars[eNB_id], fp );
|
||||
pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_th0[eNB_id], fp );
|
||||
pdsch_vars_th0[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
|
||||
phy_init_lte_ue__PDSCH( pdsch_vars_th1[eNB_id], fp );
|
||||
pdsch_vars_th1[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
} else { //abstraction == 1
|
||||
ue->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
|
||||
}
|
||||
@@ -1225,7 +1296,11 @@ int phy_init_lte_ue(PHY_VARS_UE *ue,
|
||||
ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
|
||||
|
||||
ue->init_averaging = 1;
|
||||
ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration
|
||||
// default value until overwritten by RRCConnectionReconfiguration
|
||||
if (fp->nb_antenna_ports_eNB==2)
|
||||
ue->pdsch_config_dedicated->p_a = dBm3;
|
||||
else
|
||||
ue->pdsch_config_dedicated->p_a = dB0;
|
||||
|
||||
// set channel estimation to do linear interpolation in time
|
||||
ue->high_speed_flag = 1;
|
||||
@@ -1248,7 +1323,10 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
LTE_eNB_PUSCH** const pusch_vars = eNB->pusch_vars;
|
||||
LTE_eNB_SRS* const srs_vars = eNB->srs_vars;
|
||||
LTE_eNB_PRACH* const prach_vars = &eNB->prach_vars;
|
||||
int i, j, eNB_id, UE_id;
|
||||
|
||||
int i, j, eNB_id, UE_id;
|
||||
int re;
|
||||
|
||||
|
||||
eNB->total_dlsch_bitrate = 0;
|
||||
eNB->total_transmitted_bits = 0;
|
||||
@@ -1264,102 +1342,160 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
lte_gold(fp,eNB->lte_gold_table,fp->Nid_cell);
|
||||
generate_pcfich_reg_mapping(fp);
|
||||
generate_phich_reg_mapping(fp);
|
||||
|
||||
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
eNB->first_run_timing_advance[UE_id] =
|
||||
1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
|
||||
// clear whole structure
|
||||
bzero( &eNB->UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) );
|
||||
|
||||
|
||||
eNB->physicalConfigDedicated[UE_id] = NULL;
|
||||
}
|
||||
|
||||
eNB->first_run_I0_measurements =
|
||||
1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
|
||||
eNB->first_run_I0_measurements = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here.
|
||||
}
|
||||
|
||||
// for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
{
|
||||
eNB_id=0;
|
||||
if (abstraction_flag==0) {
|
||||
|
||||
|
||||
// TX vars
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
common_vars->txdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
||||
common_vars->txdataF[eNB_id] = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
||||
|
||||
common_vars->txdata[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
common_vars->txdataF[eNB_id] = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*));
|
||||
common_vars->txdataF_BF[eNB_id] = (int32_t **)malloc16(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF5) {
|
||||
for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) {
|
||||
if (i<fp->nb_antenna_ports_eNB || i==5) {
|
||||
common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) );
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p\n",eNB_id,i,common_vars->txdata[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%d bytes)\n",
|
||||
eNB_id,i,common_vars->txdataF[eNB_id][i],
|
||||
fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t));
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdataF[%d][%d] = %p (%lu bytes)\n",
|
||||
eNB_id,i,common_vars->txdataF[eNB_id][i],
|
||||
fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<fp->nb_antennas_tx; i++) {
|
||||
common_vars->txdataF_BF[eNB_id][i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t) );
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5)
|
||||
|
||||
// Allocate 10 subframes of I/Q TX signal data (time) if not
|
||||
common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->txdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->txdata[eNB_id][i],
|
||||
fp->samples_per_tti*10*sizeof(int32_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) {
|
||||
if (i<fp->nb_antenna_ports_eNB || i==5) {
|
||||
common_vars->beam_weights[eNB_id][i] = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t*));
|
||||
for (j=0; j<fp->nb_antennas_tx; j++) {
|
||||
common_vars->beam_weights[eNB_id][i][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
// antenna ports 0-3 are mapped on antennas 0-3
|
||||
// antenna port 4 is mapped on antenna 0
|
||||
// antenna ports 5-14 are mapped on all antennas
|
||||
if (((i<4) && (i==j)) || ((i==4) && (j==0))) {
|
||||
for (re=0; re<fp->ofdm_symbol_size; re++)
|
||||
common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff;
|
||||
}
|
||||
else if (i>4) {
|
||||
for (re=0; re<fp->ofdm_symbol_size; re++)
|
||||
common_vars->beam_weights[eNB_id][i][j][re] = 0x00007fff/fp->nb_antennas_tx;
|
||||
}
|
||||
#ifdef DEBUG_PHY
|
||||
msg("[openair][LTE_PHY][INIT] lte_common_vars->beam_weights[%d][%d][%d] = %p (%zu bytes)\n",
|
||||
eNB_id,i,j,common_vars->beam_weights[eNB_id][i][j],
|
||||
fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// RX vars
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5) {
|
||||
common_vars->rxdata[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
}
|
||||
common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
|
||||
common_vars->rxdataF[eNB_id] = (int32_t**)malloc16(fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5) {
|
||||
common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*sizeof(int32_t) );
|
||||
}
|
||||
|
||||
common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) );
|
||||
if (eNB->node_function != NGFI_RCC_IF4p5) {
|
||||
// allocate 2 subframes of I/Q signal data (time) if not an RCC (no time-domain signals)
|
||||
common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) );
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF5)
|
||||
// allocate 2 subframes of I/Q signal data (time, 7.5 kHz offset)
|
||||
common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( 2*fp->samples_per_tti*2*sizeof(int32_t) );
|
||||
}
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF5)
|
||||
// allocate 2 subframes of I/Q signal data (frequency)
|
||||
common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->ofdm_symbol_size*fp->symbols_per_tti) );
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i]);
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata[eNB_id][i],fp->samples_per_tti*10*sizeof(int32_t));
|
||||
if (eNB->node_function != NGFI_RRU_IF5)
|
||||
printf("[openair][LTE_PHY][INIT] common_vars->rxdata_7_5kHz[%d][%d] = %p (%lu bytes)\n",eNB_id,i,common_vars->rxdata_7_5kHz[eNB_id][i],fp->samples_per_tti*2*sizeof(int32_t));
|
||||
#endif
|
||||
common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(fp->ofdm_symbol_size*fp->symbols_per_tti) );
|
||||
}
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF4p5) {
|
||||
// Channel estimates for SRS
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
|
||||
srs_vars[UE_id].srs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||
srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti );
|
||||
|
||||
|
||||
if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) {
|
||||
|
||||
// Channel estimates for SRS
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
|
||||
srs_vars[UE_id].srs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||
srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti );
|
||||
}
|
||||
} else { //UPLINK abstraction = 1
|
||||
} // abstraction_flag = 0
|
||||
else { //UPLINK abstraction = 1
|
||||
eNB->sinr_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) );
|
||||
}
|
||||
} //eNB_id
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (abstraction_flag==0) {
|
||||
if (eNB->node_function != NGFI_RRU_IF4p5) {
|
||||
if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) {
|
||||
generate_ul_ref_sigs_rx();
|
||||
|
||||
|
||||
// SRS
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
srs_vars[UE_id].srs = (int32_t*)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
srs_vars[UE_id].srs = (int32_t*)malloc16_clear(2*fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ULSCH VARS, skip if NFGI_RRU_IF4
|
||||
|
||||
if (eNB->node_function!=NGFI_RRU_IF4p5)
|
||||
|
||||
|
||||
if ((eNB->node_function!=NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5))
|
||||
|
||||
prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) );
|
||||
|
||||
|
||||
/* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */
|
||||
AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]),
|
||||
"nb_antennas_rx too large");
|
||||
@@ -1369,10 +1505,11 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
printf("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (eNB->node_function != NGFI_RRU_IF4p5) {
|
||||
|
||||
if ((eNB->node_function != NGFI_RRU_IF4p5)&&(eNB->node_function != NGFI_RRU_IF5)) {
|
||||
|
||||
AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->prach_ifft) / sizeof(prach_vars->prach_ifft[0]),
|
||||
"nb_antennas_rx too large");
|
||||
"nb_antennas_rx too large");
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t));
|
||||
#ifdef DEBUG_PHY
|
||||
@@ -1381,81 +1518,85 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
|
||||
}
|
||||
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
|
||||
|
||||
//FIXME
|
||||
pusch_vars[UE_id] = (LTE_eNB_PUSCH*)malloc16_clear( NUMBER_OF_UE_MAX*sizeof(LTE_eNB_PUSCH) );
|
||||
|
||||
|
||||
if (abstraction_flag==0) {
|
||||
for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
|
||||
pusch_vars[UE_id]->rxdataF_ext[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
// RK 2 times because of output format of FFT!
|
||||
// FIXME We should get rid of this
|
||||
pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||
pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
|
||||
pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
|
||||
}
|
||||
} //eNB_id
|
||||
|
||||
pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
|
||||
pusch_vars[UE_id]->rxdataF_ext[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
||||
// RK 2 times because of output format of FFT!
|
||||
// FIXME We should get rid of this
|
||||
pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size );
|
||||
pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
|
||||
pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
|
||||
pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 );
|
||||
}
|
||||
} //eNB_id
|
||||
|
||||
pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) );
|
||||
} // abstraction_flag
|
||||
} //UE_id
|
||||
|
||||
|
||||
|
||||
if (abstraction_flag==0) {
|
||||
if (is_secondary_eNB) {
|
||||
for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*));
|
||||
|
||||
if (eNB->dl_precoder_SeNB[eNB_id]) {
|
||||
for (eNB_id=0; eNB_id<3; eNB_id++) {
|
||||
eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*));
|
||||
|
||||
if (eNB->dl_precoder_SeNB[eNB_id]) {
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id,
|
||||
eNB->dl_precoder_SeNB[eNB_id]);
|
||||
printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id,
|
||||
eNB->dl_precoder_SeNB[eNB_id]);
|
||||
#endif
|
||||
} else {
|
||||
printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for (j=0; j<fp->nb_antennas_tx; j++) {
|
||||
eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(fp->ofdm_symbol_size)); // repeated format (hence the '2*')
|
||||
|
||||
if (eNB->dl_precoder_SeNB[eNB_id][j]) {
|
||||
} else {
|
||||
printf("[openair][SECSYS_PHY][INIT] eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for (j=0; j<fp->nb_antennas_tx; j++) {
|
||||
eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(fp->ofdm_symbol_size)); // repeated format (hence the '2*')
|
||||
|
||||
if (eNB->dl_precoder_SeNB[eNB_id][j]) {
|
||||
#ifdef DEBUG_PHY
|
||||
printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j,
|
||||
eNB->dl_precoder_SeNB[eNB_id][j]);
|
||||
printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j,
|
||||
eNB->dl_precoder_SeNB[eNB_id][j]);
|
||||
#endif
|
||||
memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(fp->ofdm_symbol_size));
|
||||
} else {
|
||||
printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j);
|
||||
return(-1);
|
||||
}
|
||||
} //for(j=...nb_antennas_tx
|
||||
|
||||
} //for(eNB_id...
|
||||
memset(eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(fp->ofdm_symbol_size));
|
||||
} else {
|
||||
printf("[openair][LTE_PHY][INIT] eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j);
|
||||
return(-1);
|
||||
}
|
||||
} //for(j=...nb_antennas_tx
|
||||
|
||||
} //for(eNB_id...
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
|
||||
eNB->UE_stats_ptr[UE_id] = &eNB->UE_stats[UE_id];
|
||||
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
|
||||
|
||||
//defaul value until overwritten by RRCConnectionReconfiguration
|
||||
if (fp->nb_antenna_ports_eNB==2)
|
||||
eNB->pdsch_config_dedicated->p_a = dBm3;
|
||||
else
|
||||
eNB->pdsch_config_dedicated->p_a = dB0;
|
||||
|
||||
init_prach_tables(839);
|
||||
} // node_function != NGFI_RRU_IF4p5
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
extern PHY_VARS_eNB *eNB;
|
||||
extern PHY_VARS_UE *UE;
|
||||
|
||||
void lte_param_init(unsigned char N_tx,
|
||||
void lte_param_init(unsigned char N_tx_port_eNB,
|
||||
unsigned char N_tx_phy,
|
||||
unsigned char N_rx,
|
||||
unsigned char transmission_mode,
|
||||
uint8_t extended_prefix_flag,
|
||||
@@ -70,9 +71,9 @@ void lte_param_init(unsigned char N_tx,
|
||||
frame_parms->Ncp_UL = extended_prefix_flag;
|
||||
frame_parms->Nid_cell = Nid_cell;
|
||||
frame_parms->nushift = Nid_cell%6;
|
||||
frame_parms->nb_antennas_tx = N_tx;
|
||||
frame_parms->nb_antennas_tx = N_tx_phy;
|
||||
frame_parms->nb_antennas_rx = N_rx;
|
||||
frame_parms->nb_antennas_tx_eNB = N_tx;
|
||||
frame_parms->nb_antenna_ports_eNB = N_tx_port_eNB;
|
||||
frame_parms->phich_config_common.phich_resource = oneSixth;
|
||||
frame_parms->phich_config_common.phich_duration = normal;
|
||||
frame_parms->tdd_config = tdd_config;
|
||||
@@ -81,7 +82,7 @@ void lte_param_init(unsigned char N_tx,
|
||||
// frame_parms->Bsrs = 0;
|
||||
// frame_parms->kTC = 0;44
|
||||
// frame_parms->n_RRC = 0;
|
||||
frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0;
|
||||
frame_parms->mode1_flag = (transmission_mode == 1 || transmission_mode ==7)? 1 : 0;
|
||||
|
||||
init_frame_parms(frame_parms,osf);
|
||||
|
||||
@@ -93,6 +94,9 @@ void lte_param_init(unsigned char N_tx,
|
||||
UE->frame_parms = *frame_parms;
|
||||
eNB->frame_parms = *frame_parms;
|
||||
|
||||
eNB->transmission_mode[0] = transmission_mode;
|
||||
UE->transmission_mode[0] = transmission_mode;
|
||||
|
||||
phy_init_lte_top(frame_parms);
|
||||
dump_frame_parms(frame_parms);
|
||||
|
||||
@@ -110,15 +114,16 @@ void lte_param_init(unsigned char N_tx,
|
||||
generate_phich_reg_mapping(&UE->frame_parms);
|
||||
|
||||
// DL power control init
|
||||
if (transmission_mode == 1) {
|
||||
//if (transmission_mode == 1) {
|
||||
if (transmission_mode == 1 || transmission_mode ==7) {
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((eNB->frame_parms).pdsch_config_common).p_b = 0;
|
||||
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
((UE->frame_parms).pdsch_config_common).p_b = 0;
|
||||
} else { // rho_a = rhob
|
||||
eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
eNB->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB
|
||||
((eNB->frame_parms).pdsch_config_common).p_b = 1;
|
||||
UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB
|
||||
UE->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB
|
||||
((UE->frame_parms).pdsch_config_common).p_b = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,23 @@
|
||||
#include "defs.h"
|
||||
#include "log.h"
|
||||
|
||||
uint16_t dl_S_table_normal[10]={3,9,10,11,12,3,9,10,11,6};
|
||||
uint16_t dl_S_table_extended[10]={3,8,9,10,3,8,9,5,0,0};
|
||||
|
||||
void set_S_config(LTE_DL_FRAME_PARMS *fp) {
|
||||
|
||||
int X = fp->srsX;
|
||||
|
||||
fp->ul_symbols_in_S_subframe=(1+X);
|
||||
|
||||
if ((fp->Ncp==EXTENDED) && (fp->tdd_config_S>7))
|
||||
AssertFatal(1==0,"Illegal S subframe configuration for Extended Prefix mode\n");
|
||||
|
||||
fp->dl_symbols_in_S_subframe = (fp->Ncp==NORMAL)?dl_S_table_normal[fp->tdd_config_S] : dl_S_table_extended[fp->tdd_config_S];
|
||||
|
||||
|
||||
}
|
||||
|
||||
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
||||
{
|
||||
|
||||
@@ -29,7 +46,7 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
||||
|
||||
LOG_I(PHY,"Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf);
|
||||
|
||||
if (frame_parms->Ncp==1) {
|
||||
if (frame_parms->Ncp==EXTENDED) {
|
||||
frame_parms->nb_prefix_samples0=512;
|
||||
frame_parms->nb_prefix_samples = 512;
|
||||
frame_parms->symbols_per_tti = 12;
|
||||
@@ -37,8 +54,10 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
||||
frame_parms->nb_prefix_samples0 = 160;
|
||||
frame_parms->nb_prefix_samples = 144;
|
||||
frame_parms->symbols_per_tti = 14;
|
||||
|
||||
}
|
||||
|
||||
|
||||
switch(osf) {
|
||||
case 1:
|
||||
log2_osf = 0;
|
||||
@@ -167,6 +186,8 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
||||
|
||||
printf("lte_parms.c: Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size);
|
||||
|
||||
if (frame_parms->frame_type == TDD) set_S_config(frame_parms);
|
||||
|
||||
// frame_parms->tdd_config=3;
|
||||
return(0);
|
||||
}
|
||||
@@ -184,7 +205,7 @@ void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms)
|
||||
printf("frame_parms->tdd_config=%d\n",frame_parms->tdd_config);
|
||||
printf("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S);
|
||||
printf("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag);
|
||||
printf("frame_parms->nb_antennas_tx_eNB(nb_antenna_ports)=%d\n",frame_parms->nb_antennas_tx_eNB);
|
||||
printf("frame_parms->nb_antenna_ports_eNB=%d\n",frame_parms->nb_antenna_ports_eNB);
|
||||
printf("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx);
|
||||
printf("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx);
|
||||
printf("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size);
|
||||
|
||||
59
openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m
Normal file
59
openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m
Normal file
@@ -0,0 +1,59 @@
|
||||
filt_len = 16;
|
||||
|
||||
F = -3/4:1/4:7/4;
|
||||
F_l = zeros(8,filt_len);
|
||||
F_r = zeros(8,filt_len);
|
||||
F_m = zeros(8,filt_len);
|
||||
|
||||
F2 =-3/5:1/5:8/5;
|
||||
|
||||
for i=0:3
|
||||
F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i) zeros(1,4)]);
|
||||
F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
|
||||
F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
for i=0:1
|
||||
F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i) zeros(1,4)]);
|
||||
F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i) zeros(1,4)]);
|
||||
F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
for i=2:3
|
||||
F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5) zeros(1,4)]);
|
||||
F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
|
||||
F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i) zeros(1,4)]);
|
||||
end
|
||||
|
||||
|
||||
fd = fopen("filt16_32.h","w");
|
||||
|
||||
for i=0:3
|
||||
fprintf(fd,"short filt%d_l%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_l(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_l(i+1,end));
|
||||
|
||||
fprintf(fd,"short filt%d_r%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_r(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_r(i+1,end));
|
||||
|
||||
fprintf(fd,"short filt%d_m%d[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_m(i+1,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_m(i+1,end));
|
||||
end
|
||||
|
||||
for i=0:3
|
||||
fprintf(fd,"short filt%d_l%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_l(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_l(i+5,end));
|
||||
|
||||
fprintf(fd,"short filt%d_r%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_r(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_r(i+5,end));
|
||||
|
||||
fprintf(fd,"short filt%d_m%d_dc[%d] = {\n",filt_len,i,filt_len);
|
||||
fprintf(fd,"%d,",F_m(i+5,1:end-1));
|
||||
fprintf(fd,"%d};\n\n",F_m(i+5,end));
|
||||
end
|
||||
|
||||
fclose(fd);
|
||||
@@ -34,7 +34,7 @@
|
||||
*/
|
||||
|
||||
/*!\brief Timing drift hysterisis in samples*/
|
||||
#define SYNCH_HYST 1
|
||||
#define SYNCH_HYST 2
|
||||
|
||||
/*!
|
||||
\brief This function is used for time-frequency scanning prior to complete cell search. It scans
|
||||
@@ -116,6 +116,12 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t l,
|
||||
uint8_t symbol);
|
||||
|
||||
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
module_id_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t Ns,
|
||||
uint8_t p,
|
||||
uint8_t symbol);
|
||||
|
||||
int lte_dl_msbfn_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
module_id_t eNB_id,
|
||||
@@ -174,6 +180,7 @@ This function computes the time domain channel response, finds the peak and adju
|
||||
void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
PHY_VARS_UE *phy_vars_ue,
|
||||
module_id_t eNb_id,
|
||||
uint8_t subframe,
|
||||
unsigned char clear,
|
||||
short coef);
|
||||
|
||||
@@ -181,7 +188,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
unsigned int subframe_offset,
|
||||
unsigned char N0_symbol,
|
||||
unsigned char abstraction_flag);
|
||||
unsigned char abstraction_flag,
|
||||
uint8_t subframe);
|
||||
|
||||
//! \brief This function performance RSRP/RSCP measurements
|
||||
void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
86
openair1/PHY/LTE_ESTIMATION/filt16_32.h
Normal file
86
openair1/PHY/LTE_ESTIMATION/filt16_32.h
Normal file
@@ -0,0 +1,86 @@
|
||||
short filt16_l0[16] = {
|
||||
16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r0[16] = {
|
||||
0,0,0,0,0,4096,8192,12288,16384,20480,24576,28672,0,0,0,0};
|
||||
|
||||
short filt16_m0[16] = {
|
||||
0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,-12288,0,0,0,0};
|
||||
|
||||
short filt16_l1[16] = {
|
||||
20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r1[16] = {
|
||||
0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0};
|
||||
|
||||
short filt16_m1[16] = {
|
||||
-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0};
|
||||
|
||||
short filt16_l2[16] = {
|
||||
24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r2[16] = {
|
||||
0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
|
||||
|
||||
short filt16_m2[16] = {
|
||||
-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0};
|
||||
|
||||
short filt16_l3[16] = {
|
||||
28672,24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r3[16] = {
|
||||
0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0};
|
||||
|
||||
short filt16_m3[16] = {
|
||||
-12288,-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0};
|
||||
|
||||
short filt16_l0_dc[16] = {
|
||||
16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r0_dc[16] = {
|
||||
0,0,0,0,0,3276,9830,13107,16384,19660,22937,26214,0,0,0,0};
|
||||
|
||||
short filt16_m0_dc[16] = {
|
||||
0,4096,8192,12288,16384,13107,6553,3276,0,-3277,-6554,-9831,0,0,0,0};
|
||||
|
||||
short filt16_l1_dc[16] = {
|
||||
16384,12288,8192,4096,0,-4096,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r1_dc[16] = {
|
||||
0,0,0,0,0,0,6553,9830,13107,16384,19660,22937,0,0,0,0};
|
||||
|
||||
short filt16_m1_dc[16] = {
|
||||
-4096,0,4096,8192,12288,16384,9830,6553,3276,0,-3277,-6554,0,0,0,0};
|
||||
|
||||
short filt16_l2_dc[16] = {
|
||||
26214,22937,19660,16384,13107,9830,6553,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r2_dc[16] = {
|
||||
0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
|
||||
|
||||
short filt16_m2_dc[16] = {
|
||||
-6554,-3277,0,3276,6553,6553,16384,12288,8192,4096,0,-4096,0,0,0,0};
|
||||
|
||||
short filt16_l3_dc[16] = {
|
||||
26214,22937,19660,16384,13107,9830,3276,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_r3_dc[16] = {
|
||||
0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0};
|
||||
|
||||
short filt16_m3_dc[16] = {
|
||||
-9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0};
|
||||
|
||||
short filt16_1[16] = {
|
||||
16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
|
||||
|
||||
short filt16_2l0[16] = {
|
||||
16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2r0[16] = {
|
||||
0,4096,8192,12288,16384,20480,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2l1[16] = {
|
||||
20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
||||
short filt16_2r1[16] = {
|
||||
-4096,0,4096,8192,12288,16384,0,0,0,0,0,0,0,0,0,0};
|
||||
@@ -34,6 +34,7 @@
|
||||
void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
PHY_VARS_UE *ue,
|
||||
unsigned char eNB_id,
|
||||
uint8_t subframe,
|
||||
unsigned char clear,
|
||||
short coef)
|
||||
{
|
||||
@@ -48,7 +49,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
ncoef = 32767 - coef;
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"frame %d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset);
|
||||
LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx%1024,subframe,ue->rx_offset);
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
|
||||
@@ -57,8 +58,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
temp = 0;
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
Re = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)ue->common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[(i<<2)];
|
||||
Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)];
|
||||
temp += (Re*Re/2) + (Im*Im/2);
|
||||
}
|
||||
|
||||
@@ -74,13 +75,15 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
else
|
||||
max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
|
||||
|
||||
// do not filter to have proactive timing adjustment
|
||||
max_pos_fil = max_pos;
|
||||
|
||||
diff = max_pos_fil - frame_parms->nb_prefix_samples/8;
|
||||
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
|
||||
|
||||
if ( diff > SYNCH_HYST )
|
||||
ue->rx_offset++;
|
||||
else if (diff < -SYNCH_HYST)
|
||||
ue->rx_offset--;
|
||||
if ( abs(diff) < SYNCH_HYST )
|
||||
ue->rx_offset = 0;
|
||||
else
|
||||
ue->rx_offset = diff;
|
||||
|
||||
if ( ue->rx_offset < 0 )
|
||||
ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES;
|
||||
@@ -91,8 +94,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
|
||||
#ifdef DEBUG_PHY
|
||||
LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n",
|
||||
ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp);
|
||||
LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d) target_pos %d \n",
|
||||
ue->proc.proc_rxtx[0].frame_rx,subframe,ue->rx_offset,max_pos,max_pos_fil,temp,(frame_parms->nb_prefix_samples>>3));
|
||||
#endif //DEBUG_PHY
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
|
||||
|
||||
743
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
Normal file
743
openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
Normal file
@@ -0,0 +1,743 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <string.h>
|
||||
#endif
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "filt16_32.h"
|
||||
//#define DEBUG_BF_CH
|
||||
|
||||
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
|
||||
uint8_t eNB_id,
|
||||
uint8_t eNB_offset,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
unsigned char symbol)
|
||||
{
|
||||
|
||||
unsigned short rb,nb_rb=0;
|
||||
unsigned char aarx,l,lprime,nsymb,skip_half=0,sss_symb,pss_symb=0,rb_alloc_ind,harq_pid,uespec_pilots=0;
|
||||
int beamforming_mode, ch_offset;
|
||||
uint8_t subframe;
|
||||
int8_t uespec_nushift, uespec_poffset=0, pil_offset=0;
|
||||
uint8_t pilot0,pilot1,pilot2,pilot3;
|
||||
|
||||
short ch[2], *pil, *rxF, *dl_bf_ch, *dl_bf_ch_prev;
|
||||
short *fl, *fm, *fr, *fl_dc, *fm_dc, *fr_dc, *f1, *f2l, *f2r;
|
||||
|
||||
unsigned int *rballoc;
|
||||
int **rxdataF;
|
||||
int32_t **dl_bf_ch_estimates;
|
||||
int uespec_pilot[300];
|
||||
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
|
||||
LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[eNB_id];
|
||||
LTE_DL_UE_HARQ_t *dlsch0_harq;
|
||||
|
||||
harq_pid = dlsch_ue[0]->current_harq_pid;
|
||||
dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
|
||||
|
||||
if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
|
||||
((frame_parms->Ncp == EXTENDED) && (symbol>=6)))
|
||||
rballoc = dlsch0_harq->rb_alloc_odd;
|
||||
else
|
||||
rballoc = dlsch0_harq->rb_alloc_even;
|
||||
|
||||
rxdataF = phy_vars_ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF;
|
||||
|
||||
dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[(Ns>>1)&0x1][eNB_id]->dl_bf_ch_estimates;
|
||||
beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0;
|
||||
|
||||
if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
|
||||
ch_offset = frame_parms->ofdm_symbol_size;
|
||||
else
|
||||
ch_offset = frame_parms->ofdm_symbol_size*symbol;
|
||||
|
||||
|
||||
uespec_nushift = frame_parms->Nid_cell%3;
|
||||
subframe = Ns>>1;
|
||||
|
||||
|
||||
//generate ue specific pilots
|
||||
lprime = symbol/3-1;
|
||||
lte_dl_ue_spec_rx(phy_vars_ue,uespec_pilot,Ns,5,lprime,0,dlsch0_harq->nb_rb);
|
||||
//write_output("uespec_pilot_rx.m","uespec_pilot",uespec_pilot,300,1,1);
|
||||
|
||||
if (frame_parms->Ncp==0){
|
||||
if (symbol==3 || symbol==6 || symbol==9 || symbol==12)
|
||||
uespec_pilots = 1;
|
||||
} else{
|
||||
if (symbol==4 || symbol==7 || symbol==10)
|
||||
uespec_pilots = 1;
|
||||
}
|
||||
|
||||
if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7))
|
||||
uespec_poffset = 2;
|
||||
|
||||
if (phy_vars_ue->frame_parms.Ncp == 0) { // normal prefix
|
||||
pilot0 = 3;
|
||||
pilot1 = 6;
|
||||
pilot2 = 9;
|
||||
pilot3 = 12;
|
||||
} else { // extended prefix
|
||||
pilot0 = 4;
|
||||
pilot1 = 7;
|
||||
pilot2 = 10;
|
||||
}
|
||||
|
||||
//define the filter
|
||||
pil_offset = (uespec_nushift+uespec_poffset)%3;
|
||||
// printf("symbol=%d,pil_offset=%d\n",symbol,pil_offset);
|
||||
switch (pil_offset) {
|
||||
case 0:
|
||||
fl = filt16_l0;
|
||||
fm = filt16_m0;
|
||||
fr = filt16_r0;
|
||||
fl_dc = filt16_l0;
|
||||
fm_dc = filt16_m0;
|
||||
fr_dc = filt16_r0;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l0;
|
||||
f2r = filt16_2r0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
fl = filt16_l1;
|
||||
fm = filt16_m1;
|
||||
fr = filt16_r1;
|
||||
fl_dc = filt16_l1;
|
||||
fm_dc = filt16_m1;
|
||||
fr_dc = filt16_r1;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l1;
|
||||
f2r = filt16_2r1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
fl = filt16_l2;
|
||||
fm = filt16_m2;
|
||||
fr = filt16_r2;
|
||||
fl_dc = filt16_l2;
|
||||
fm_dc = filt16_m2;
|
||||
fr_dc = filt16_r2;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l0;
|
||||
f2r = filt16_2r0;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
fl = filt16_l3;
|
||||
fm = filt16_m3;
|
||||
fr = filt16_r3;
|
||||
fl_dc = filt16_l3;
|
||||
fm_dc = filt16_m3;
|
||||
fr_dc = filt16_r3;
|
||||
f1 = filt16_1;
|
||||
f2l = filt16_2l1;
|
||||
f2r = filt16_2r1;
|
||||
break;
|
||||
}
|
||||
// beamforming mode extension
|
||||
/* }
|
||||
else if (beamforming_mode==0)
|
||||
msg("lte_dl_bf_channel_estimation:No beamforming is performed.\n");
|
||||
else
|
||||
msg("lte_dl_bf_channel_estimation:Beamforming mode not supported yet.\n");*/
|
||||
|
||||
|
||||
l=symbol;
|
||||
nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
|
||||
|
||||
if (frame_parms->frame_type == TDD) { //TDD
|
||||
sss_symb = nsymb-1;
|
||||
pss_symb = 2;
|
||||
} else {
|
||||
sss_symb = (nsymb>>1)-2;
|
||||
pss_symb = (nsymb>>1)-1;
|
||||
}
|
||||
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][pil_offset + frame_parms->first_carrier_offset + symbol*frame_parms->ofdm_symbol_size];
|
||||
pil = (short *)uespec_pilot;
|
||||
dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset];
|
||||
|
||||
memset(dl_bf_ch,0,4*(frame_parms->ofdm_symbol_size));
|
||||
//memset(dl_bf_ch,0,2*(frame_parms->ofdm_symbol_size));
|
||||
|
||||
if (phy_vars_ue->high_speed_flag==0) {
|
||||
// multiply previous channel estimate by ch_est_alpha
|
||||
if (frame_parms->Ncp==0){
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),
|
||||
phy_vars_ue->ch_est_alpha,dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),
|
||||
1,frame_parms->ofdm_symbol_size);
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation: beamforming channel estimation not supported for TM7 Extended CP.\n"); // phy_vars_ue->ch_est_beta should be defined equaling 1/3
|
||||
}
|
||||
}
|
||||
//estimation and interpolation
|
||||
|
||||
if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
|
||||
for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// For second half of RBs skip DC carrier
|
||||
if (rb==(frame_parms->N_RB_DL>>1)) {
|
||||
rxF = (short *)&rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
|
||||
}
|
||||
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c): transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
}
|
||||
} else { // Odd number of RBs
|
||||
for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) {
|
||||
skip_half=0;
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
|
||||
if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=1;
|
||||
else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=2;
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) &&
|
||||
(rb>((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(rb<((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)-3)) &&
|
||||
(l==sss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) &&
|
||||
(rb==((frame_parms->N_RB_DL>>1)+3)) &&
|
||||
(l==sss_symb))
|
||||
skip_half=2;
|
||||
|
||||
//PSS in subframe 0/5 if FDD
|
||||
if (frame_parms->frame_type == FDD) { //FDD
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
//printf("symbol=%d,pil_offset=%d\ni,rb_alloc_ind=%d,uespec_pilots=%d,beamforming_mode=%d,Ncp=%d,skip_half=%d\n",symbol,pil_offset,rb_alloc_ind,uespec_pilots,beamforming_mode,frame_parms->Ncp,skip_half);
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (skip_half==1) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
}
|
||||
} else if (skip_half==2) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
} // first half loop
|
||||
|
||||
// Do middle RB (around DC)
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) {
|
||||
//PSS
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//printf("DC rb %d (%p)\n",rb,rxF);
|
||||
if (rb_alloc_ind==1) {
|
||||
if (pil_offset<2) {
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[6] - (int)pil[1]*rxF[7])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[7] + (int)pil[1]*rxF[6])>>15);
|
||||
multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[3]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[6],rxF[7],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
} else {
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[2] - (int)pil[1]*rxF[3])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[3] + (int)pil[1]*rxF[2])>>15);
|
||||
multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[1]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[2],rxF[3],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[10] - (int)pil[1]*rxF[11])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[11] + (int)pil[1]*rxF[10])>>15);
|
||||
multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
//printf("symbol=%d,rxF[5]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[10],rxF[11],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;;
|
||||
}
|
||||
} // rballoc==1
|
||||
else {
|
||||
rxF = (short *)&rxdataF[aarx][pil_offset+((symbol*(frame_parms->ofdm_symbol_size)))];
|
||||
}
|
||||
|
||||
rxF+=14+2*pil_offset;
|
||||
dl_bf_ch+=24;
|
||||
rb++;
|
||||
|
||||
for (; rb<frame_parms->N_RB_DL; rb++) {
|
||||
skip_half=0;
|
||||
|
||||
if (rb < 32)
|
||||
rb_alloc_ind = (rballoc[0]>>rb) & 1;
|
||||
else if (rb < 64)
|
||||
rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1;
|
||||
else if (rb < 96)
|
||||
rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1;
|
||||
else if (rb < 100)
|
||||
rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1;
|
||||
else
|
||||
rb_alloc_ind = 0;
|
||||
|
||||
// PBCH
|
||||
if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
|
||||
if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=1;
|
||||
else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
|
||||
skip_half=2;
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//SSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb))
|
||||
skip_half=2;
|
||||
|
||||
if (frame_parms->frame_type == FDD) {
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
//PSS
|
||||
if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6
|
||||
if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
|
||||
rb_alloc_ind = 0;
|
||||
}
|
||||
|
||||
if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
|
||||
skip_half=1;
|
||||
else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
|
||||
skip_half=2;
|
||||
}
|
||||
|
||||
if (rb_alloc_ind==1) {
|
||||
if (uespec_pilots==1) {
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (skip_half==1) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
}
|
||||
} else if (skip_half==2) {
|
||||
if (pil_offset<2) {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16);
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15);
|
||||
multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15);
|
||||
multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15);
|
||||
ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15);
|
||||
multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16);
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]);
|
||||
#endif
|
||||
pil+=2;
|
||||
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n");
|
||||
}
|
||||
}
|
||||
nb_rb++;
|
||||
}
|
||||
|
||||
rxF+=24;
|
||||
dl_bf_ch+=24;
|
||||
} // second half of RBs
|
||||
} // odd number of RBs
|
||||
|
||||
// Temporal Interpolation
|
||||
if (phy_vars_ue->perfect_ce == 0) {
|
||||
|
||||
dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c]:symbol %d, dl_bf_ch (%d,%d)\n",symbol,dl_bf_ch[0],dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
if (phy_vars_ue->high_speed_flag == 0) {
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,
|
||||
32767-phy_vars_ue->ch_est_alpha,
|
||||
dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),0,frame_parms->ofdm_symbol_size);
|
||||
//printf("dlsch_bf_ch_est.c:symbol %d,dl_bf_ch (%d,%d)\n",symbol,*(dl_bf_ch-512*2),*(dl_bf_ch-512*2+1));
|
||||
} else { // high_speed_flag == 1
|
||||
if (beamforming_mode==7) {
|
||||
if (frame_parms->Ncp==0) {
|
||||
if (symbol == pilot0) {
|
||||
// printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
// dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(frame_parms->ofdm_symbol_size)];
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot3*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
// pilot spacing 5 symbols (1/5,2/5,3/5,4/5 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,26214,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,6554,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,19661,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,13107,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,13107,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,19661,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,6554,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,26214,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
} else if (symbol == pilot1) {
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot0*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
// pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
} else if (symbol == pilot2) {
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot1*(frame_parms->ofdm_symbol_size)];
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]);
|
||||
#endif
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
} else { // symbol == pilot3
|
||||
// printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp);
|
||||
dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot2*(frame_parms->ofdm_symbol_size)];
|
||||
|
||||
// pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size);
|
||||
}
|
||||
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation:temporal interpolation not supported for TM7 extented CP.\n");
|
||||
}
|
||||
} else {
|
||||
msg("lte_dl_bf_channel_estimation:temporal interpolation not supported for this beamforming mode.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} //aarx
|
||||
|
||||
#ifdef DEBUG_BF_CH
|
||||
printf("[dlsch_bf_ch_est.c]: dl_bf_estimates[0][600] %d, %d \n",*(short *)&dl_bf_ch_estimates[0][600],*(short*)&phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0][600]);
|
||||
#endif
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "defs.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "filt96_32.h"
|
||||
#include "T.h"
|
||||
//#define DEBUG_CH
|
||||
|
||||
int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
@@ -35,9 +36,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
unsigned char l,
|
||||
unsigned char symbol)
|
||||
{
|
||||
|
||||
|
||||
|
||||
int pilot[2][200] __attribute__((aligned(16)));
|
||||
unsigned char nu,aarx;
|
||||
unsigned short k;
|
||||
@@ -46,12 +44,14 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
int ch_offset,symbol_offset;
|
||||
// unsigned int n;
|
||||
// int i;
|
||||
static int interpolateS11S12 = 1;
|
||||
|
||||
uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
||||
|
||||
uint8_t nushift,pilot1,pilot2,pilot3;
|
||||
int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[eNB_offset];
|
||||
int **rxdataF=ue->common_vars.rxdataF;
|
||||
int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset];
|
||||
int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[((Ns>>1)+1)&0x1].dl_ch_estimates[eNB_offset];
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].rxdataF;
|
||||
|
||||
if (ue->frame_parms.Ncp == 0) { // normal prefix
|
||||
pilot1 = 4;
|
||||
@@ -640,13 +640,19 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
if (symbol == 0) {
|
||||
// printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp);
|
||||
// dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)];
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)];
|
||||
if(((Ns>>1)!=0) || ( ((Ns>>1)==0) && interpolateS11S12))
|
||||
{
|
||||
//LOG_D(PHY,"Interpolate s11-->s0 to get s12 and s13 Ns %d \n", Ns);
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates_previous[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
|
||||
interpolateS11S12 = 1;
|
||||
} // this is 1/3,2/3 combination for pilots spaced by 3 symbols
|
||||
else if (symbol == pilot1) {
|
||||
dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0];
|
||||
@@ -695,6 +701,38 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size);
|
||||
multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size);
|
||||
} // pilot spacing 3 symbols (1/3,2/3 combination)
|
||||
|
||||
if((ue->rx_offset_diff !=0) && ((Ns>>1) == 9))
|
||||
{
|
||||
//LOG_D(PHY,"Extrapolate s7-->s11 to get s12 and s13 Ns %d\n", Ns);
|
||||
interpolateS11S12 = 0;
|
||||
//LOG_E(PHY,"Interpolate s7--s11 s12 s13 pilot 3 Ns %d l %d symbol %d \n", Ns, l, symbol);
|
||||
int16_t *dlChEst_ofdm11 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)];
|
||||
int16_t *dlChEst_ofdm7 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
// interpolate ofdm s12: 5/4*ofdms11 + -1/4*ofdms7 5/4 q1.15 40960 -1/4 q1.15 8192
|
||||
int16_t *dlChEst_ofdm12 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][12*ue->frame_parms.ofdm_symbol_size];
|
||||
for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++)
|
||||
{
|
||||
int64_t tmp_mult = 0;
|
||||
tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 40960 - (int64_t)dlChEst_ofdm7[i] * 8192);
|
||||
|
||||
tmp_mult = tmp_mult >> 15;
|
||||
dlChEst_ofdm12[i] = tmp_mult;
|
||||
}
|
||||
|
||||
// interpolate ofdm s13: 3/2*ofdms11 + -1/2*ofdms7 3/2 q1.15 49152 1/2 q1.15 16384
|
||||
int16_t *dlChEst_ofdm13 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][13*ue->frame_parms.ofdm_symbol_size];
|
||||
for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++)
|
||||
{
|
||||
int64_t tmp_mult = 0;
|
||||
tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 49152 - (int64_t)dlChEst_ofdm7[i] * 16384);
|
||||
|
||||
tmp_mult = tmp_mult >> 15;
|
||||
dlChEst_ofdm13[i] = tmp_mult;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -735,12 +773,18 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue,
|
||||
|
||||
// do ifft of channel estimate
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
||||
for (p=0; p<ue->frame_parms.nb_antennas_tx_eNB; p++) {
|
||||
if (ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx])
|
||||
idft((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
|
||||
for (p=0; p<ue->frame_parms.nb_antenna_ports_eNB; p++) {
|
||||
if (ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx])
|
||||
idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
|
||||
}
|
||||
|
||||
#if T_TRACER
|
||||
T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(ue->Mod_id),
|
||||
T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx%1024), T_INT(ue->proc.proc_rxtx[(Ns>>1)&1].subframe_rx),
|
||||
T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4));
|
||||
#endif
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,8 +44,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
|
||||
// unsigned int n;
|
||||
// int i;
|
||||
|
||||
int **dl_ch_estimates=ue->common_vars.dl_ch_estimates[0];
|
||||
int **rxdataF=ue->common_vars.rxdataF;
|
||||
int **dl_ch_estimates=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0];
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF;
|
||||
|
||||
ch_offset = (l*(ue->frame_parms.ofdm_symbol_size));
|
||||
symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l;
|
||||
@@ -734,31 +734,31 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
|
||||
|
||||
// do ifft of channel estimate
|
||||
for (aa=0; aa<ue->frame_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) {
|
||||
if (ue->common_vars.dl_ch_estimates[eNB_offset][aa]) {
|
||||
if (ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa]) {
|
||||
switch (ue->frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
idft128((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft128((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 25:
|
||||
idft512((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft512((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 50:
|
||||
idft1024((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft1024((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 75:
|
||||
idft1536((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft1536((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
case 100:
|
||||
idft2048((int16_t*) &ue->common_vars.dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.dl_ch_estimates_time[eNB_offset][aa],
|
||||
idft2048((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_offset][aa][8],
|
||||
(int16_t*) ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates_time[eNB_offset][aa],
|
||||
1);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -510,14 +510,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
|
||||
|
||||
// perform a time domain correlation using the oversampled sync sequence
|
||||
|
||||
unsigned int n, ar, peak_val, peak_pos, mean_val;
|
||||
unsigned int n, ar, peak_val, peak_pos;
|
||||
uint64_t mean_val;
|
||||
int result;
|
||||
short *primary_synch_time;
|
||||
int eNB_id = frame_parms->Nid_cell%3;
|
||||
|
||||
// msg("[SYNC TIME] Calling sync_time_eNB(%p,%p,%d,%d)\n",rxdata,frame_parms,eNB_id,length);
|
||||
if (sync_corr_eNB == NULL) {
|
||||
msg("[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n");
|
||||
LOG_E(PHY,"[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
@@ -535,7 +536,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
|
||||
break;
|
||||
|
||||
default:
|
||||
msg("[SYNC TIME] Illegal eNB_id!\n");
|
||||
LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -567,7 +568,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
|
||||
peak_val);
|
||||
}
|
||||
*/
|
||||
mean_val += (sync_corr_eNB[n]>>10);
|
||||
mean_val += sync_corr_eNB[n];
|
||||
|
||||
if (sync_corr_eNB[n]>peak_val) {
|
||||
peak_val = sync_corr_eNB[n];
|
||||
@@ -575,17 +576,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
|
||||
}
|
||||
}
|
||||
|
||||
mean_val/=length;
|
||||
|
||||
*peak_val_out = peak_val;
|
||||
|
||||
if (peak_val <= (40*mean_val)) {
|
||||
#ifdef DEBUG_PHY
|
||||
msg("[SYNC TIME] No peak found (%u,%u,%u,%u)\n",peak_pos,peak_val,mean_val,40*mean_val);
|
||||
#endif
|
||||
if (peak_val <= (40*(uint32_t)mean_val)) {
|
||||
LOG_D(PHY,"[SYNC TIME] No peak found (%u,%u,%"PRIu64",%"PRIu64")\n",peak_pos,peak_val,mean_val,40*mean_val);
|
||||
return(-1);
|
||||
} else {
|
||||
#ifdef DEBUG_PHY
|
||||
msg("[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %u\n",peak_pos,peak_val,mean_val);
|
||||
#endif
|
||||
LOG_D(PHY,"[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %"PRIu64"\n",peak_pos,peak_val,mean_val);
|
||||
return(peak_pos);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
#define k1 ((long long int) 1000)
|
||||
#define k2 ((long long int) (1024-k1))
|
||||
|
||||
//#define DEBUG_MEAS
|
||||
//#define DEBUG_MEAS_RRC
|
||||
//#define DEBUG_MEAS_UE
|
||||
|
||||
#ifdef USER_MODE
|
||||
void print_shorts(char *s,short *x)
|
||||
@@ -165,23 +166,30 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs
|
||||
}
|
||||
|
||||
void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
uint8_t subframe,
|
||||
uint8_t abstraction_flag)
|
||||
uint8_t slot,
|
||||
uint8_t abstraction_flag)
|
||||
{
|
||||
|
||||
int aarx,rb;
|
||||
uint8_t subframe = slot>>1;
|
||||
int aarx,rb,n;
|
||||
int16_t *rxF,*rxF_pss,*rxF_sss;
|
||||
|
||||
uint16_t Nid_cell = ue->frame_parms.Nid_cell;
|
||||
uint8_t eNB_offset,nu,l,nushift,k;
|
||||
uint16_t off;
|
||||
|
||||
uint8_t isPss; // indicate if this is a slot for extracting PSS
|
||||
uint8_t isSss; // indicate if this is a slot for extracting SSS
|
||||
int32_t pss_ext[4][72]; // contain the extracted 6*12 REs for mapping the PSS
|
||||
int32_t sss_ext[4][72]; // contain the extracted 6*12 REs for mapping the SSS
|
||||
int32_t (*xss_ext)[72]; // point to either pss_ext or sss_ext for common calculation
|
||||
int16_t *re,*im; // real and imag part of each 32-bit xss_ext[][] value
|
||||
|
||||
for (eNB_offset = 0; eNB_offset<1+ue->measurements.n_adj_cells; eNB_offset++) {
|
||||
|
||||
if (eNB_offset==0) {
|
||||
ue->measurements.rssi = 0;
|
||||
ue->measurements.n0_power_tot = 0;
|
||||
//ue->measurements.n0_power_tot = 0;
|
||||
|
||||
if (abstraction_flag == 0) {
|
||||
if ((ue->frame_parms.frame_type == FDD) &&
|
||||
@@ -190,9 +198,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
if (ue->frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
//-ve spectrum from SSS
|
||||
// printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]);
|
||||
@@ -216,7 +223,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63]));
|
||||
// printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
// printf("pssm36 %d\n",ue->measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
@@ -225,24 +232,75 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63]));
|
||||
// printf("pssm32 %d\n",ue->measurements.n0_power[aarx]);
|
||||
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12);
|
||||
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
|
||||
}
|
||||
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
}
|
||||
} else {
|
||||
LOG_E(PHY, "Not yet implemented: noise power calculation when prefix length = EXTENDED\n");
|
||||
}
|
||||
}
|
||||
else if ((ue->frame_parms.frame_type == TDD) &&
|
||||
(subframe == 0)) { // TDD SSS, compute noise in DTX REs
|
||||
else if ((ue->frame_parms.frame_type == TDD) &&
|
||||
((slot == 2) || (slot == 12) || (slot == 1) || (slot == 11))) { // TDD PSS/SSS, compute noise in DTX REs // 2016-09-29 wilson fix incorrect noise power calculation
|
||||
|
||||
#if 1 // fixing REs extraction in noise power calculation
|
||||
|
||||
// check if this slot has a PSS or SSS sequence
|
||||
if ((slot == 2) || (slot == 12)) {
|
||||
isPss = 1;
|
||||
} else {
|
||||
isPss = 0;
|
||||
}
|
||||
if ((slot == 1) || (slot == 11)) {
|
||||
isSss = 1;
|
||||
} else {
|
||||
isSss = 0;
|
||||
}
|
||||
|
||||
if (isPss) {
|
||||
pss_only_extract(ue, pss_ext);
|
||||
xss_ext = pss_ext;
|
||||
}
|
||||
|
||||
if (isSss) {
|
||||
sss_only_extract(ue, sss_ext);
|
||||
xss_ext = sss_ext;
|
||||
}
|
||||
|
||||
// calculate noise power
|
||||
int num_tot=0; // number of REs totally used in calculating noise power
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
int num_per_rx=0; // number of REs used in caluclaing noise power for this RX antenna
|
||||
ue->measurements.n0_power[aarx] = 0;
|
||||
for (n=2; n<70; n++) { // skip the 2 REs next to PDSCH, i.e. n={0,1,70,71}
|
||||
if (n==5) {n=67;}
|
||||
|
||||
re = (int16_t*)(&(xss_ext[aarx][n]));
|
||||
im = re+1;
|
||||
ue->measurements.n0_power[aarx] += (*re)*(*re) + (*im)*(*im);
|
||||
num_per_rx++;
|
||||
num_tot++;
|
||||
}
|
||||
|
||||
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/(num_per_rx));
|
||||
ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx];
|
||||
}
|
||||
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(num_tot));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
#else
|
||||
if (ue->frame_parms.Ncp==NORMAL) {
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
rxF_sss = (int16_t *)&ue->common_vars.rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)];
|
||||
// note this is a dummy pointer, the pss is not really there!
|
||||
// in FDD the pss is in the symbol after the sss, but not in TDD
|
||||
rxF_pss = (int16_t *)&ue->common_vars.rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
|
||||
rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)];
|
||||
|
||||
//-ve spectrum from SSS
|
||||
// ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71]));
|
||||
ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69]));
|
||||
@@ -255,16 +313,17 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67]));
|
||||
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65]));
|
||||
// ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63]));
|
||||
|
||||
|
||||
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/(6));
|
||||
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||
}
|
||||
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||
}
|
||||
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(6*aarx));
|
||||
ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
// recompute nushift with eNB_offset corresponding to adjacent eNB on which to perform channel estimation
|
||||
@@ -286,13 +345,13 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
|
||||
for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) {
|
||||
k = (nu + nushift)%6;
|
||||
#ifdef DEBUG_MEAS
|
||||
#ifdef DEBUG_MEAS_RRC
|
||||
LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift,
|
||||
eNB_offset,k,l);
|
||||
#endif
|
||||
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
rxF = (int16_t *)&ue->common_vars.rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
|
||||
rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
|
||||
off = (ue->frame_parms.first_carrier_offset+k)<<1;
|
||||
|
||||
if (l==(4-ue->frame_parms.Ncp)) {
|
||||
@@ -305,7 +364,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
// if ((ue->frame_rx&0x3ff) == 0)
|
||||
// printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1])));
|
||||
|
||||
|
||||
|
||||
off+=12;
|
||||
|
||||
if (off>=(ue->frame_parms.ofdm_symbol_size<<1))
|
||||
@@ -364,7 +423,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
|
||||
}
|
||||
|
||||
#ifdef DEBUG_MEAS
|
||||
#ifdef DEBUG_MEAS_RRC
|
||||
|
||||
// if (slot == 0) {
|
||||
|
||||
@@ -398,7 +457,8 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
|
||||
void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
unsigned int subframe_offset,
|
||||
unsigned char N0_symbol,
|
||||
unsigned char abstraction_flag)
|
||||
unsigned char abstraction_flag,
|
||||
uint8_t subframe)
|
||||
{
|
||||
|
||||
|
||||
@@ -415,6 +475,14 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||
int nb_subbands,subband_size,last_subband_size;
|
||||
int N_RB_DL = frame_parms->N_RB_DL;
|
||||
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
|
||||
if (ue->transmission_mode[eNB_id]!=4)
|
||||
ue->measurements.rank[eNB_id] = 0;
|
||||
else
|
||||
ue->measurements.rank[eNB_id] = 1;
|
||||
// printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
|
||||
// printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
|
||||
|
||||
switch (N_RB_DL) {
|
||||
case 6:
|
||||
@@ -446,9 +514,9 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
// signal measurements
|
||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
|
||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
|
||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
||||
(signal_energy_nodc(&ue->common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
|
||||
(signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
|
||||
(N_RB_DL*12)));
|
||||
//- ue->measurements.n0_power[aarx];
|
||||
|
||||
@@ -498,10 +566,14 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
|
||||
ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
|
||||
ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
|
||||
#ifdef DEBUG_MEAS
|
||||
LOG_I(PHY,"[eNB %d] lte_ue_measurements: RSSI %d dBm, RSSI (digital) %d dB\n",
|
||||
eNB_id,ue->measurements.rx_rssi_dBm[eNB_id],
|
||||
ue->measurements.rx_power_avg_dB[eNB_id]);
|
||||
#ifdef DEBUG_MEAS_UE
|
||||
LOG_D(PHY,"[eNB %d] RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
|
||||
eNB_id,
|
||||
ue->measurements.rx_rssi_dBm[eNB_id],
|
||||
ue->measurements.rx_power_avg_dB[eNB_id],
|
||||
ue->measurements.wideband_cqi_avg[eNB_id],
|
||||
ue->measurements.rx_power_avg[eNB_id],
|
||||
ue->measurements.n0_power_avg);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -512,8 +584,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
// cqi/pmi information
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1 = &ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
|
||||
@@ -562,18 +634,19 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
}
|
||||
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
//printf("aarx=%d", aarx);
|
||||
// skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
|
||||
|
||||
dl_ch0_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (__m128i *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
#elif defined(__arm__)
|
||||
int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b;
|
||||
|
||||
dl_ch0_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (int16x8_t *)&ue->common_vars.dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
dl_ch0_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch1_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2+aarx][4];
|
||||
|
||||
#endif
|
||||
for (subband=0; subband<nb_subbands; subband++) {
|
||||
@@ -581,9 +654,11 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
|
||||
// pmi
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
pmi128_re = _mm_setzero_si128();
|
||||
pmi128_im = _mm_setzero_si128();
|
||||
|
||||
pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);
|
||||
pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);
|
||||
#elif defined(__arm__)
|
||||
|
||||
pmi128_re = vdupq_n_s32(0);
|
||||
pmi128_im = vdupq_n_s32(0);
|
||||
#endif
|
||||
@@ -596,18 +671,52 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
|
||||
for (i=0; i<limit; i++) {
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
|
||||
mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
|
||||
|
||||
// For each RE in subband perform ch0 * conj(ch1)
|
||||
// multiply by conjugated channel
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));//_MM_SHUFFLE(2,3,0,1)
|
||||
mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
|
||||
mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate[0]);
|
||||
mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[0]);
|
||||
// mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
|
||||
// print_ints("ch0",&dl_ch0_128[0]);
|
||||
// print_ints("ch1",&dl_ch1_128[0]);
|
||||
|
||||
mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
|
||||
// print_ints("re",&mmtmpPMI0);
|
||||
mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
|
||||
// print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
|
||||
// print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate[0]);
|
||||
// print_ints("_mm_sign_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[0]);
|
||||
// print_ints("mm_madd_epi16",&mmtmpPMI1);
|
||||
// mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
|
||||
pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
|
||||
// print_ints(" pmi128_re 0",&pmi128_re);
|
||||
pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
|
||||
// print_ints(" pmi128_im 0 ",&pmi128_im);
|
||||
|
||||
/* mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
|
||||
mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
|
||||
|
||||
mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[1],dl_ch1_128[1]);
|
||||
// print_ints("re",&mmtmpPMI0);
|
||||
mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1));
|
||||
// print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
|
||||
// print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate);
|
||||
// print_ints("_mm_sign_epi16",&mmtmpPMI1);
|
||||
mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[1]);
|
||||
// print_ints("mm_madd_epi16",&mmtmpPMI1);
|
||||
// mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
|
||||
pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
|
||||
// print_ints(" pmi128_re 1",&pmi128_re);
|
||||
pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
|
||||
//print_ints(" pmi128_im 1 ",&pmi128_im);*/
|
||||
|
||||
#elif defined(__arm__)
|
||||
|
||||
mmtmpPMI0 = vmull_s16(((int16x4_t*)dl_ch0_128)[0], ((int16x4_t*)dl_ch1_128)[0]);
|
||||
mmtmpPMI1 = vmull_s16(((int16x4_t*)dl_ch0_128)[1], ((int16x4_t*)dl_ch1_128)[1]);
|
||||
pmi128_re = vqaddq_s32(pmi128_re,vcombine_s32(vpadd_s32(vget_low_s32(mmtmpPMI0),vget_high_s32(mmtmpPMI0)),vpadd_s32(vget_low_s32(mmtmpPMI1),vget_high_s32(mmtmpPMI1))));
|
||||
@@ -631,7 +740,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
else {
|
||||
// cqi information only for mode 1
|
||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
dl_ch0 = &ue->common_vars.dl_ch_estimates[eNB_id][aarx][4];
|
||||
dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][aarx][4];
|
||||
|
||||
for (subband=0; subband<7; subband++) {
|
||||
|
||||
@@ -667,7 +776,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
|
||||
}
|
||||
}
|
||||
|
||||
ue->measurements.rank[eNB_id] = 0;
|
||||
//ue->measurements.rank[eNB_id] = 0;
|
||||
|
||||
for (i=0; i<nb_subbands; i++) {
|
||||
ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
|
||||
|
||||
@@ -78,7 +78,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
|
||||
int16_t ul_ch_estimates_re,ul_ch_estimates_im;
|
||||
int32_t rx_power_correction;
|
||||
|
||||
//uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB;
|
||||
//uint8_t nb_antennas_rx = frame_parms->nb_antenna_ports_eNB;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||
uint8_t cyclic_shift;
|
||||
|
||||
@@ -679,7 +679,7 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
int T_SFC,aa;
|
||||
int N_symb,symbol;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB;
|
||||
uint8_t nb_antennas_rx = frame_parms->nb_antenna_ports_eNB;
|
||||
#ifdef DEBUG_SRS
|
||||
char fname[40], vname[40];
|
||||
#endif
|
||||
@@ -720,10 +720,11 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
|
||||
//write_output("eNB_srs.m","srs_eNB",common_vars->srs,(frame_parms->ofdm_symbol_size),1,1);
|
||||
|
||||
mult_cpx_conj_vector((int16_t*) &common_vars->rxdataF[eNB_id][aa][2*frame_parms->ofdm_symbol_size*symbol],
|
||||
(int16_t*) srs_vars->srs,
|
||||
(int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
15);
|
||||
(int16_t*) srs_vars->srs,
|
||||
(int16_t*) srs_vars->srs_ch_estimates[eNB_id][aa],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
15,
|
||||
0);
|
||||
|
||||
//msg("SRS channel estimation cmult out\n");
|
||||
#ifdef USER_MODE
|
||||
|
||||
@@ -45,12 +45,15 @@ unsigned int lte_gold_generic(unsigned int *x1, unsigned int *x2, unsigned char
|
||||
|
||||
void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14],uint16_t Nid_cell);
|
||||
|
||||
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
|
||||
|
||||
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti);
|
||||
|
||||
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14.
|
||||
@param frame_parms LTE DL Frame parameters
|
||||
@param lte_gold_uespec_table pointer to table where sequences are stored
|
||||
@param Nid_cell Cell Id (to compute sequences for local and adjacent cells)
|
||||
@param n_idDMRS Scrambling identity for TM10*/
|
||||
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
|
||||
|
||||
void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_table[10][3][42],uint16_t Nid_MBSFN);
|
||||
|
||||
@@ -77,16 +80,18 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
@param output Output vector for OFDM symbol (Frequency Domain)
|
||||
@param amp Q15 amplitude
|
||||
@param Ns Slot number (0..19)
|
||||
@param lprime symbol (0,1)
|
||||
@param p antenna index
|
||||
@param SS_flag Flag to indicate special subframe
|
||||
*/
|
||||
int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
/*int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
|
||||
uint8_t UE_id,
|
||||
int32_t *output,
|
||||
short amp,
|
||||
uint8_t Ns,
|
||||
uint8_t lprime,
|
||||
uint8_t p,
|
||||
int SS_flag );
|
||||
int SS_flag);*/
|
||||
|
||||
/*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2)
|
||||
@param phy_vars_eNB Pointer to eNB variables
|
||||
@@ -116,6 +121,24 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
unsigned char l,
|
||||
unsigned char p);
|
||||
|
||||
/*!\brief This function generates the ue-specific reference signal
|
||||
* sequence (36-211, Sec 6.10.3.1) for beamforming channel estimation upon reception
|
||||
@param phy_vars_ue Pointer to UE variables
|
||||
@param output Output vector for OFDM symbol (Frequency Domain)
|
||||
@param Ns Slot number (0..19)
|
||||
@param p antenna port intex
|
||||
@param lprime symbol (0,1)
|
||||
@param SS_flag Flag to indicate special subframe
|
||||
@param nRB_PDSCH number of allocated PDSCH RBs
|
||||
*/
|
||||
int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int32_t *output,
|
||||
unsigned char Ns,
|
||||
unsigned char p,
|
||||
int lprime,
|
||||
int SS_flag,
|
||||
uint16_t nRB_PDSCH);
|
||||
|
||||
int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue,
|
||||
int *output,
|
||||
int subframe,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user