mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-18 15:10:29 +00:00
Compare commits
704 Commits
pusch-para
...
sl-eurecom
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
149034887c | ||
|
|
5917f0f2b8 | ||
|
|
6832959b0b | ||
|
|
e7b42f419b | ||
|
|
d629498b98 | ||
|
|
1c01343d49 | ||
|
|
f633fc8d96 | ||
|
|
5e28985954 | ||
|
|
af662183f4 | ||
|
|
efccb416cc | ||
|
|
4232baec52 | ||
|
|
2f19c2de4d | ||
|
|
b17e862742 | ||
|
|
d680bb83b2 | ||
|
|
9354a45235 | ||
|
|
0b6ba9d08f | ||
|
|
f5db0a881e | ||
|
|
e7bf3b83a5 | ||
|
|
b05d0ab91e | ||
|
|
0894a6bfe7 | ||
|
|
462ed76114 | ||
|
|
50923c7f80 | ||
|
|
5cbd83c4e6 | ||
|
|
7fae9eb2d8 | ||
|
|
5ee44e015a | ||
|
|
b2cc750587 | ||
|
|
b90448ae20 | ||
|
|
719752cad8 | ||
|
|
15e858270d | ||
|
|
9421fcc8b9 | ||
|
|
e9ded45428 | ||
|
|
c588facc1b | ||
|
|
5933f5ba53 | ||
|
|
da2ba65685 | ||
|
|
8ba201005f | ||
|
|
f328a6e181 | ||
|
|
bc68fcb32d | ||
|
|
b75d95626e | ||
|
|
375a11b119 | ||
|
|
a990cba81f | ||
|
|
3ea2afdca5 | ||
|
|
3e282f9573 | ||
|
|
8e30f99eee | ||
|
|
3eea99a312 | ||
|
|
67c7d52333 | ||
|
|
1eb4f857af | ||
|
|
ca30b9ee55 | ||
|
|
6ced3cd8a7 | ||
|
|
10b996f5db | ||
|
|
31a1003349 | ||
|
|
44bf62758a | ||
|
|
e7a8eb950e | ||
|
|
2a0142fb96 | ||
|
|
6d7d075d8c | ||
|
|
f2a8b5c41d | ||
|
|
6cc01f7cd9 | ||
|
|
fc01032915 | ||
|
|
db00336a2a | ||
|
|
7223ac8c9a | ||
|
|
a8879d3b9c | ||
|
|
3fbcdf4c5a | ||
|
|
d525849730 | ||
|
|
d9e38660ba | ||
|
|
38ec30559e | ||
|
|
082cf6146d | ||
|
|
149d27d55f | ||
|
|
b339460666 | ||
|
|
787170de83 | ||
|
|
84fa481e72 | ||
|
|
c126cbab77 | ||
|
|
7cfb6db48a | ||
|
|
bc0083c219 | ||
|
|
90e5db3728 | ||
|
|
c9bc86312f | ||
|
|
7221a5f736 | ||
|
|
629b2c9fe3 | ||
|
|
9f91dbd9bb | ||
|
|
a354ce01cf | ||
|
|
93d32eca45 | ||
|
|
594fb18cc8 | ||
|
|
5143133d33 | ||
|
|
c0f7e458bb | ||
|
|
15822a0a5d | ||
|
|
6022fe5acd | ||
|
|
224ef7921a | ||
|
|
4fdbcb0472 | ||
|
|
bbc9442fc8 | ||
|
|
418c6e23f0 | ||
|
|
94185df93e | ||
|
|
302f016650 | ||
|
|
053d8d938f | ||
|
|
cf4a22b58a | ||
|
|
75e9db0633 | ||
|
|
24bf0d8046 | ||
|
|
3c5468dd7d | ||
|
|
e31eacb386 | ||
|
|
361dfc3c9f | ||
|
|
8482cb62c4 | ||
|
|
d8627c91f3 | ||
|
|
ad8da84671 | ||
|
|
f0f1121e9c | ||
|
|
64b4fbe7f2 | ||
|
|
ae6db92dc2 | ||
|
|
99c620b8cc | ||
|
|
9b8eae2256 | ||
|
|
87d9517738 | ||
|
|
e140ac4bf7 | ||
|
|
b307044345 | ||
|
|
62a5c4996c | ||
|
|
d12e67b0bc | ||
|
|
8f85851a95 | ||
|
|
3b429c5399 | ||
|
|
7879afc010 | ||
|
|
053ef8fc44 | ||
|
|
24e4629eff | ||
|
|
aac2a062b3 | ||
|
|
b735f8bec6 | ||
|
|
8a10d1b222 | ||
|
|
9509bdfdc1 | ||
|
|
3eabc2fe01 | ||
|
|
01af5a1e2d | ||
|
|
2faca0fdba | ||
|
|
7f4e8f9220 | ||
|
|
63fc39dc3f | ||
|
|
3f1a52eb3e | ||
|
|
759d9df9bd | ||
|
|
6927eb12a6 | ||
|
|
cf67fcea6c | ||
|
|
62efab7262 | ||
|
|
8a9346dd27 | ||
|
|
9987ebf8aa | ||
|
|
6836582ca1 | ||
|
|
8b339bb659 | ||
|
|
b6feedc883 | ||
|
|
bfbb3a69ba | ||
|
|
b34e4d0a19 | ||
|
|
98f06c5907 | ||
|
|
5c426db6eb | ||
|
|
f798541e84 | ||
|
|
d510827e16 | ||
|
|
c63edad48b | ||
|
|
e9e347043e | ||
|
|
28741ed967 | ||
|
|
608aa3ebc4 | ||
|
|
a6e18fe06a | ||
|
|
46db3534b7 | ||
|
|
2f82aea100 | ||
|
|
b37b0e5c97 | ||
|
|
28fb7a37d7 | ||
|
|
db2aa3c8bd | ||
|
|
9eb1af6dc2 | ||
|
|
6a90266aff | ||
|
|
8c051201d6 | ||
|
|
26e469cbac | ||
|
|
7455bae459 | ||
|
|
a0b207fe6b | ||
|
|
fc17f3fdc7 | ||
|
|
abba6a6d8a | ||
|
|
1fefd730d6 | ||
|
|
56367dd07c | ||
|
|
6e5511b220 | ||
|
|
bf10230185 | ||
|
|
be5c3d7aa0 | ||
|
|
04451c7078 | ||
|
|
224c5538e4 | ||
|
|
ffe0630d93 | ||
|
|
5a153c502f | ||
|
|
1470d7637f | ||
|
|
69da6a5f5e | ||
|
|
1ae561b9cc | ||
|
|
41aadcc54f | ||
|
|
beef5461e5 | ||
|
|
51c4933258 | ||
|
|
8d07275496 | ||
|
|
852a6c4f28 | ||
|
|
ca4b438dd4 | ||
|
|
971bacb76f | ||
|
|
5d38a99955 | ||
|
|
e6488d1b62 | ||
|
|
c6a04db9a1 | ||
|
|
8292c4523e | ||
|
|
eb09a63001 | ||
|
|
8aa0aa4d40 | ||
|
|
296d930fba | ||
|
|
b62474bd83 | ||
|
|
c1a2b65697 | ||
|
|
d021fbd0b6 | ||
|
|
395ca4b4b0 | ||
|
|
44d5b37890 | ||
|
|
88e6d9df09 | ||
|
|
7cb50288ef | ||
|
|
1e30c0adba | ||
|
|
b9293754b8 | ||
|
|
2d1aa8425b | ||
|
|
d907cbd442 | ||
|
|
c744b01566 | ||
|
|
5761b60c60 | ||
|
|
f7181caf65 | ||
|
|
aa6468f95e | ||
|
|
a611d58d3b | ||
|
|
6c590b900a | ||
|
|
4b263c3fa5 | ||
|
|
a85fee5dca | ||
|
|
e49c6db2bf | ||
|
|
f4ed558cc5 | ||
|
|
3ca0f39088 | ||
|
|
41d9e775c9 | ||
|
|
f09fffdb2b | ||
|
|
376a9beb80 | ||
|
|
0b892acef3 | ||
|
|
ded8a3779d | ||
|
|
73907e5ee2 | ||
|
|
703047eca9 | ||
|
|
5cbad19d19 | ||
|
|
d1e1f56199 | ||
|
|
61435e9066 | ||
|
|
ee8af9dcfb | ||
|
|
b7f47aa70a | ||
|
|
066de7c3c5 | ||
|
|
fec2a15bdf | ||
|
|
8cbe4bb1d1 | ||
|
|
a54ca2c6e3 | ||
|
|
e79756d7ab | ||
|
|
39b73391d4 | ||
|
|
784be9d241 | ||
|
|
5d378b6416 | ||
|
|
b6e5b3594c | ||
|
|
f79ab7e087 | ||
|
|
c6c004b8aa | ||
|
|
2b193cded0 | ||
|
|
a07d4376d6 | ||
|
|
2f23bf1ea4 | ||
|
|
d8e92e93b3 | ||
|
|
6db9c37e47 | ||
|
|
f596c6907a | ||
|
|
d22d11d003 | ||
|
|
8bf5a0acf6 | ||
|
|
95fc447472 | ||
|
|
5a61145948 | ||
|
|
751f06b15e | ||
|
|
98d5c1691c | ||
|
|
678e3f9a01 | ||
|
|
ec1d5ead6a | ||
|
|
7cbfbd6c92 | ||
|
|
9338925b93 | ||
|
|
64b65cb5d9 | ||
|
|
7b2d0dbf39 | ||
|
|
ac4c4defd3 | ||
|
|
816532d86c | ||
|
|
a96d727409 | ||
|
|
624fc5353e | ||
|
|
d609f3f5ae | ||
|
|
bb525dc0ee | ||
|
|
1f432be612 | ||
|
|
b47cb76977 | ||
|
|
528e1d99d2 | ||
|
|
aba645dc93 | ||
|
|
468e7330de | ||
|
|
e7d04ec14f | ||
|
|
600399aa63 | ||
|
|
56b87424db | ||
|
|
7a1928dfd0 | ||
|
|
6c8112581b | ||
|
|
7e473ca971 | ||
|
|
7f40b90ceb | ||
|
|
7feb6ed41f | ||
|
|
6fbb4df0a3 | ||
|
|
89f11abe68 | ||
|
|
3362fa991f | ||
|
|
3614c221c4 | ||
|
|
298d822bd1 | ||
|
|
6775b577fd | ||
|
|
1283065946 | ||
|
|
50f4890faa | ||
|
|
03b75ed679 | ||
|
|
a91839e69c | ||
|
|
2e34ab0190 | ||
|
|
e6abb12fb1 | ||
|
|
a93da4a886 | ||
|
|
27e14a06c2 | ||
|
|
028f92a3e2 | ||
|
|
bf6b8442f1 | ||
|
|
0f90a7c24c | ||
|
|
0e84775e29 | ||
|
|
0e0fc7eab4 | ||
|
|
323f52aeb1 | ||
|
|
334fbb8879 | ||
|
|
39d54215bd | ||
|
|
bb580fae58 | ||
|
|
783e3d0da6 | ||
|
|
3fc1825e44 | ||
|
|
c0bf78efa0 | ||
|
|
c4f4a5d793 | ||
|
|
b6247b075b | ||
|
|
cfdfe6aaa7 | ||
|
|
709efd5da5 | ||
|
|
d9e487359d | ||
|
|
500069fcf0 | ||
|
|
99fb046474 | ||
|
|
c8ace3b540 | ||
|
|
6fc62b0184 | ||
|
|
085e84dc38 | ||
|
|
b1407040b6 | ||
|
|
88accf144e | ||
|
|
a7c5a0bb29 | ||
|
|
2949d00083 | ||
|
|
8378127c2c | ||
|
|
e1d9d15b2c | ||
|
|
53eb37e674 | ||
|
|
682b1be022 | ||
|
|
f4047b7aa4 | ||
|
|
34d80d4754 | ||
|
|
5dc3663f16 | ||
|
|
de54ec5b8b | ||
|
|
ce07b567d0 | ||
|
|
4ee9a6d8c6 | ||
|
|
39726e3274 | ||
|
|
0d5dcbbccb | ||
|
|
684f762fd9 | ||
|
|
b95722b670 | ||
|
|
b431e042fc | ||
|
|
43e8dcd7b6 | ||
|
|
5ea2e6d029 | ||
|
|
7cdf6847f1 | ||
|
|
1483d53e28 | ||
|
|
8727d12d18 | ||
|
|
6f6a314ab6 | ||
|
|
77f069c1af | ||
|
|
6a2f5664b8 | ||
|
|
6d51179357 | ||
|
|
720b2669fd | ||
|
|
9ffe2b7851 | ||
|
|
6befa6b3b0 | ||
|
|
d497806c6c | ||
|
|
475f99195e | ||
|
|
e1c152fbcf | ||
|
|
0db28d4f5a | ||
|
|
e344d531f9 | ||
|
|
433f3d1507 | ||
|
|
7e7b00e58b | ||
|
|
9b03282972 | ||
|
|
b5a2dab4e9 | ||
|
|
0f22e2a2d8 | ||
|
|
9fe8a273f2 | ||
|
|
e95d6e28fc | ||
|
|
71f52d180f | ||
|
|
0c048b28bd | ||
|
|
0a38dbb7be | ||
|
|
40a2ee85aa | ||
|
|
c61ab7fb7e | ||
|
|
9591a5bef5 | ||
|
|
f95c3f92ed | ||
|
|
0a6e7eb898 | ||
|
|
26a52906df | ||
|
|
0f8bb964a4 | ||
|
|
937c7119ae | ||
|
|
3e028a43b5 | ||
|
|
c501e448ca | ||
|
|
8313896093 | ||
|
|
87436a1884 | ||
|
|
34d508ae23 | ||
|
|
ffb6ca5934 | ||
|
|
682721cf57 | ||
|
|
1a627782dd | ||
|
|
28688065e2 | ||
|
|
21b766912b | ||
|
|
774b8ef6e9 | ||
|
|
aefe918f9f | ||
|
|
1dbe99316a | ||
|
|
b0ca489e60 | ||
|
|
5d270d63ac | ||
|
|
22063a35ec | ||
|
|
d39997d8b0 | ||
|
|
74998221e8 | ||
|
|
c468bd519b | ||
|
|
385243f521 | ||
|
|
0453ef25dd | ||
|
|
a909589185 | ||
|
|
064b05aee8 | ||
|
|
4f34b5f97a | ||
|
|
9c2c8067ef | ||
|
|
ca86a8a5ac | ||
|
|
4708a7d81c | ||
|
|
1d730cd8e2 | ||
|
|
e20bd2edaa | ||
|
|
fc236e4bd3 | ||
|
|
2ebef66785 | ||
|
|
4cd71874c0 | ||
|
|
c19ffff075 | ||
|
|
1c50671296 | ||
|
|
611c98f6f1 | ||
|
|
a66d7fcafc | ||
|
|
c6a972f65e | ||
|
|
28290c792d | ||
|
|
aa2e0319d0 | ||
|
|
0cce63fae9 | ||
|
|
f4bd344b9b | ||
|
|
565f6e13b0 | ||
|
|
30e6cc01c6 | ||
|
|
f9f8e21b55 | ||
|
|
bb1699e4d6 | ||
|
|
853f2737a4 | ||
|
|
7f3242a2b4 | ||
|
|
f2e678375b | ||
|
|
6444ee9aee | ||
|
|
5fc0e53cc8 | ||
|
|
147b5af7fe | ||
|
|
fa5fb4e49b | ||
|
|
d98f09825f | ||
|
|
74c075a751 | ||
|
|
f6815c381a | ||
|
|
7268877512 | ||
|
|
9114cd36cd | ||
|
|
530a5a3f01 | ||
|
|
1a9148ae2f | ||
|
|
e74d9c8aea | ||
|
|
662d453bf5 | ||
|
|
00885ccfd6 | ||
|
|
2e17b65004 | ||
|
|
df3a7bab95 | ||
|
|
c96851dc0d | ||
|
|
8c528798ad | ||
|
|
c065dc89bb | ||
|
|
f339b8b1e7 | ||
|
|
24cec4d5ba | ||
|
|
0d769760fd | ||
|
|
8fb5f5a350 | ||
|
|
9ffc7359b4 | ||
|
|
e6d200befe | ||
|
|
e079c43485 | ||
|
|
5f200844a4 | ||
|
|
6a4aa58c2e | ||
|
|
679bcc4365 | ||
|
|
9f056450d6 | ||
|
|
27994e444d | ||
|
|
9d11486431 | ||
|
|
e6ed641079 | ||
|
|
99bdc94279 | ||
|
|
a86559bdce | ||
|
|
971bb3bfc0 | ||
|
|
c387aa0f0d | ||
|
|
10ec942d67 | ||
|
|
91338a7439 | ||
|
|
a5ff057b69 | ||
|
|
d04291d66d | ||
|
|
4b9bc61748 | ||
|
|
a0a0e32f68 | ||
|
|
8167d64bcb | ||
|
|
e6b101d7da | ||
|
|
3689def55f | ||
|
|
a8c79ebf3b | ||
|
|
12f240c7e5 | ||
|
|
e1fc0a4d6b | ||
|
|
1c602f0e92 | ||
|
|
f5ad65cd2e | ||
|
|
4fe865a30f | ||
|
|
4ba390adfc | ||
|
|
ebfa50dce4 | ||
|
|
3d1631a673 | ||
|
|
7ea1501058 | ||
|
|
6fe163f4c4 | ||
|
|
38cccc73f0 | ||
|
|
75d0b6116e | ||
|
|
acb3a50768 | ||
|
|
e51ce1d232 | ||
|
|
e23e81425c | ||
|
|
14234e9eca | ||
|
|
5dd561743e | ||
|
|
264ab2ddd2 | ||
|
|
1e3932fbe1 | ||
|
|
51b8271ee9 | ||
|
|
c6d13e8d73 | ||
|
|
8a8c5275b0 | ||
|
|
a884e37625 | ||
|
|
dc84deafea | ||
|
|
23adfc132a | ||
|
|
be8bed3602 | ||
|
|
a8cb993e56 | ||
|
|
43da8296cf | ||
|
|
3462053a08 | ||
|
|
5e21c904ae | ||
|
|
26395fa2c2 | ||
|
|
f62ea2b3e0 | ||
|
|
f70097d9c9 | ||
|
|
47c400da03 | ||
|
|
a01a5f06ed | ||
|
|
d8a53795fe | ||
|
|
42991ff0ca | ||
|
|
087318f333 | ||
|
|
c2c574f153 | ||
|
|
96b7930292 | ||
|
|
789b639bbe | ||
|
|
7b5eb7e1b7 | ||
|
|
04d35e8d7e | ||
|
|
bef8362087 | ||
|
|
d80ba9b649 | ||
|
|
fdd75c4a36 | ||
|
|
31beafbd04 | ||
|
|
b203c79d87 | ||
|
|
18188b6f39 | ||
|
|
3e8ad6e26c | ||
|
|
6ef808cae1 | ||
|
|
bc2fe3db05 | ||
|
|
400447825a | ||
|
|
75f52cef4a | ||
|
|
4bec2f496d | ||
|
|
39c6b07820 | ||
|
|
f2cf9f0bd1 | ||
|
|
38b1b41682 | ||
|
|
68638ae67c | ||
|
|
9000f91f7e | ||
|
|
46b1cf6dc9 | ||
|
|
a74d7fa54f | ||
|
|
cdec2dd204 | ||
|
|
f98be66eda | ||
|
|
af5c062638 | ||
|
|
6ca28a9931 | ||
|
|
ce10596a13 | ||
|
|
d9a8108a15 | ||
|
|
1b5005277c | ||
|
|
ee9b35bec7 | ||
|
|
d82ab58c24 | ||
|
|
dbcc558f04 | ||
|
|
54f8add2de | ||
|
|
6e11362b75 | ||
|
|
59310feb4b | ||
|
|
8017cb16f3 | ||
|
|
be32f71b1a | ||
|
|
193720a376 | ||
|
|
865dd7984d | ||
|
|
d31d050dd5 | ||
|
|
3ae4e95775 | ||
|
|
1450ffd015 | ||
|
|
0ff5045410 | ||
|
|
e6a68d8cf2 | ||
|
|
a093745aa1 | ||
|
|
0af95f24fc | ||
|
|
6d1462712c | ||
|
|
048782bbec | ||
|
|
7397fca459 | ||
|
|
3dfb02e876 | ||
|
|
7e31ec9994 | ||
|
|
594811b9e6 | ||
|
|
c18da15703 | ||
|
|
c7c30d26b5 | ||
|
|
b2cf3f5270 | ||
|
|
1ebc4643e9 | ||
|
|
e77818daf8 | ||
|
|
eb6068cc1f | ||
|
|
fbec6c1261 | ||
|
|
2b05e90a57 | ||
|
|
028166428d | ||
|
|
fccae8a158 | ||
|
|
9e8f3f8c67 | ||
|
|
5886bb2b6a | ||
|
|
a999ce41ce | ||
|
|
d911c83c56 | ||
|
|
471df37f73 | ||
|
|
fab708d74e | ||
|
|
96583ee109 | ||
|
|
d3dd8af4cc | ||
|
|
f9642228af | ||
|
|
7a30b607e5 | ||
|
|
042b9e3c85 | ||
|
|
e57d62184e | ||
|
|
0139c38786 | ||
|
|
81c5c06414 | ||
|
|
8e702ad0d0 | ||
|
|
8a06717f95 | ||
|
|
123bf7e339 | ||
|
|
0bfaeac94b | ||
|
|
81a2d3854b | ||
|
|
e6bcd4e559 | ||
|
|
0d78000ca3 | ||
|
|
175579f8e2 | ||
|
|
05d2c538ea | ||
|
|
28a78f02a8 | ||
|
|
9de72b2e7e | ||
|
|
c6a892c15d | ||
|
|
618ea544c2 | ||
|
|
4ed69e515e | ||
|
|
124715d93e | ||
|
|
26553dfdad | ||
|
|
844d683915 | ||
|
|
47c429e8c3 | ||
|
|
33d9f68cda | ||
|
|
8618b6ad60 | ||
|
|
893ca2a4cb | ||
|
|
ef09160447 | ||
|
|
1ab09a6fa8 | ||
|
|
0134d8c914 | ||
|
|
ac0ec7b314 | ||
|
|
9350e05ad6 | ||
|
|
76797a5e86 | ||
|
|
6163143cfe | ||
|
|
60bcbb230f | ||
|
|
57824f4f02 | ||
|
|
9642337729 | ||
|
|
c265a6ec6a | ||
|
|
0558d55259 | ||
|
|
c2328793a3 | ||
|
|
e1300914da | ||
|
|
713f6632f9 | ||
|
|
9e8bd87501 | ||
|
|
b508ea71f8 | ||
|
|
be5a93b29a | ||
|
|
972256cd6e | ||
|
|
b5c2634151 | ||
|
|
992aa392a9 | ||
|
|
6b751b2874 | ||
|
|
034b64c895 | ||
|
|
61a93c2374 | ||
|
|
73c8012b52 | ||
|
|
eca4415287 | ||
|
|
a5c67fac57 | ||
|
|
b0d1b9d44f | ||
|
|
4d7958414e | ||
|
|
4d122d5d7c | ||
|
|
5228c18981 | ||
|
|
7b39aa61a9 | ||
|
|
d785a95a5f | ||
|
|
ff43319fdb | ||
|
|
4167066f04 | ||
|
|
61232c4557 | ||
|
|
5f8b20761b | ||
|
|
4ad9d66a3c | ||
|
|
5d4ad105b7 | ||
|
|
fa8bc0b57c | ||
|
|
1341cc35b9 | ||
|
|
173b4722fc | ||
|
|
515093ca29 | ||
|
|
013e70d22d | ||
|
|
640ce7beed | ||
|
|
d704dbec15 | ||
|
|
33989c3551 | ||
|
|
6470165730 | ||
|
|
fc33a75f22 | ||
|
|
0645690f3d | ||
|
|
e9a541a096 | ||
|
|
ec253251bc | ||
|
|
ae72632b85 | ||
|
|
b69a4aaa9b | ||
|
|
fc56972a35 | ||
|
|
f898a1724c | ||
|
|
ef37bcf170 | ||
|
|
31437e3185 | ||
|
|
fb98755a48 | ||
|
|
b2c07b620d | ||
|
|
d3cda4816d | ||
|
|
8aaa384193 | ||
|
|
2eed6f18e4 | ||
|
|
c79b681480 | ||
|
|
15b6259dcc | ||
|
|
d3e96c6769 | ||
|
|
eef2fb907b | ||
|
|
29a68836fa | ||
|
|
4b5cf91125 | ||
|
|
e66640f5ab | ||
|
|
01921cf9f0 | ||
|
|
d30b232aeb | ||
|
|
f9d93403d0 | ||
|
|
2c84fdbea3 | ||
|
|
61ebbc3403 | ||
|
|
4d8615c4fa | ||
|
|
55eb112ab0 | ||
|
|
9fa16cd5b9 | ||
|
|
6101792f4a | ||
|
|
b931c1b008 | ||
|
|
6aa1ad83a6 | ||
|
|
634f7dc1e6 | ||
|
|
80420d7cba | ||
|
|
b62d2fcf08 | ||
|
|
e5f851b01e | ||
|
|
12cecf668a | ||
|
|
f92a972aa5 | ||
|
|
756ff02fb7 | ||
|
|
1acb2fe894 | ||
|
|
4694664470 | ||
|
|
10c992bb27 | ||
|
|
5c443ee7a5 | ||
|
|
2785c83a90 | ||
|
|
a7f35bba02 | ||
|
|
cb5f8919e4 | ||
|
|
16371a8f5d | ||
|
|
98ac49f1bb | ||
|
|
5006fd48d8 | ||
|
|
a389eb8fd6 | ||
|
|
c68640f6f7 | ||
|
|
2695df5f31 | ||
|
|
fd4dbbfb35 | ||
|
|
5902aaf138 | ||
|
|
fc2ba4f4bd | ||
|
|
d50dae5005 | ||
|
|
e883528dd1 | ||
|
|
b1f721503e | ||
|
|
c0e71341a5 | ||
|
|
f2b9d369bd | ||
|
|
b1a1d1d0dd | ||
|
|
51e56f74d8 | ||
|
|
a34ce559a4 | ||
|
|
8bf7e77b0e | ||
|
|
7b633b141f | ||
|
|
95dbe3089e | ||
|
|
ee2f7c8a5c |
@@ -189,12 +189,17 @@ elseif(${CPUARCH} NOT STREQUAL "x86_64")
|
||||
message(FATAL_ERROR "Cannot compile for CPU architecture ${CPUARCH}")
|
||||
endif()
|
||||
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -fno-var-tracking-assignments -march=native")
|
||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
|
||||
|
||||
# add autotools definitions that were maybe used!
|
||||
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
|
||||
|
||||
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
|
||||
set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing")
|
||||
# GNU C/C++ Compiler might throw many warnings without packed-bitfield-compat, see man page
|
||||
# also, we need -rdynamic to incorporate all symbols in shared objects, again, see man page
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
set(commonOpts "${commonOpts} -Wno-packed-bitfield-compat -rdynamic")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_FLAGS
|
||||
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu11 -funroll-loops")
|
||||
@@ -770,7 +775,6 @@ add_library(UTIL
|
||||
|
||||
set(SECU_OSA_SRC
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eea.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c
|
||||
@@ -1173,7 +1177,6 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/filt16a_32.c
|
||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_measurements_gNB.c
|
||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
||||
@@ -1200,10 +1203,15 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pss_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/sss_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pss_nr_sl.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/sss_nr_sl.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_generate_psbch_dmrs_sl.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/psbch_nr_sl.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/cic_filter_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_psbch.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
|
||||
@@ -1224,7 +1232,6 @@ set(PHY_SRC_UE
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold_ue.c
|
||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/filt16a_32.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
|
||||
${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
|
||||
@@ -1350,7 +1357,6 @@ set(NR_PDCP_SRC
|
||||
#of reusing code of osa_stream_eia.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c
|
||||
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
|
||||
)
|
||||
|
||||
set(NR_SDAP_SRC
|
||||
@@ -1513,6 +1519,7 @@ set (MAC_NR_SRC_UE
|
||||
${NR_UE_MAC_DIR}/nr_ue_scheduler.c
|
||||
${NR_UE_MAC_DIR}/nr_ue_dci_configuration.c
|
||||
${NR_UE_MAC_DIR}/nr_ra_procedures.c
|
||||
${NR_UE_MAC_DIR}/nr_ue_power_procedures.c
|
||||
)
|
||||
|
||||
set (ENB_APP_SRC
|
||||
@@ -2434,7 +2441,19 @@ target_link_libraries(nr_pbchsim PRIVATE
|
||||
target_link_libraries(nr_pbchsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
|
||||
#PUCCH ---> Prashanth
|
||||
add_executable(nr_psbchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/psbchsim.c
|
||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||
${T_SOURCE}
|
||||
${SHLIB_LOADER_SOURCES}
|
||||
)
|
||||
target_link_libraries(nr_psbchsim PRIVATE
|
||||
-Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
|
||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
|
||||
)
|
||||
target_link_libraries(nr_psbchsim PRIVATE asn1_nr_rrc asn1_lte_rrc)
|
||||
|
||||
|
||||
add_executable(nr_pucchsim
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
|
||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/nr_dummy_functions.c
|
||||
@@ -2565,7 +2584,7 @@ if (${T_TRACER})
|
||||
lte-softmodem lte-uesoftmodem nr-softmodem
|
||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_psbchsim nr_pucchsim
|
||||
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
||||
#all "add_library" definitions
|
||||
ITTI lte_rrc nr_rrc s1ap x2ap m2ap m3ap f1ap
|
||||
|
||||
@@ -36,7 +36,6 @@ pipeline {
|
||||
label nodeExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
timestamps()
|
||||
gitLabConnection('OAI GitLab')
|
||||
ansiColor('xterm')
|
||||
@@ -405,28 +404,46 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//avra is offline, re-enable once it is available
|
||||
//stage ("T1-Offload-Test") {
|
||||
// when { expression {do5Gtest} }
|
||||
// steps {
|
||||
// script {
|
||||
// triggerSlaveJob ('RAN-T1-Offload-Test', 'T1-Offload-Test')
|
||||
// }
|
||||
// }
|
||||
// post {
|
||||
// always {
|
||||
// script {
|
||||
// finalizeSlaveJob('RAN-T1-Offload-Test')
|
||||
// }
|
||||
// }
|
||||
// failure {
|
||||
// script {
|
||||
// currentBuild.result = 'FAILURE'
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
stage ("SA-AW2S-CN5G") {
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-SA-AW2S-CN5G', 'SA-AW2S-CN5G')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-SA-AW2S-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Interop-F1") {
|
||||
when { expression {do5Gtest} }
|
||||
steps {
|
||||
script {
|
||||
triggerSlaveJob ('RAN-Interop-F1', 'Interop-F1')
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-Interop-F1')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("DockerHub-Push") {
|
||||
|
||||
@@ -61,7 +61,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
timestamps()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
|
||||
@@ -55,7 +55,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
timestamps()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
@@ -211,10 +210,16 @@ pipeline {
|
||||
script {
|
||||
dir ('ci-scripts') {
|
||||
// Zipping all archived log files
|
||||
sh "zip -r -qq physim_deploytest_logs_${env.BUILD_ID}.zip physim_test_logs_*/*"
|
||||
sh "rm -rf physim_test_logs_*/"
|
||||
if (fileExists("physim_deploytest_logs_${env.BUILD_ID}.zip")) {
|
||||
archiveArtifacts artifacts: "physim_deploytest_logs_${env.BUILD_ID}.zip"
|
||||
sh "mkdir test_logs"
|
||||
sh "mv *.log* test_logs || true"
|
||||
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
|
||||
sh "rm -rf *test_log*/"
|
||||
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
|
||||
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
|
||||
}
|
||||
if (fileExists("test_logs_CN.zip")){
|
||||
sh "mv test_logs_CN.zip test_logs_CN_${env.BUILD_ID}.zip"
|
||||
archiveArtifacts artifacts: "test_logs_CN_${env.BUILD_ID}.zip"
|
||||
}
|
||||
if (fileExists("test_results.html")) {
|
||||
sh "mv test_results.html test_results-${env.JOB_NAME}.html"
|
||||
|
||||
@@ -36,7 +36,6 @@ pipeline {
|
||||
label nodeExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -50,7 +50,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -52,7 +52,6 @@ def StatusForDb = ""
|
||||
pipeline {
|
||||
agent {label pythonExecutor}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -63,7 +63,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -63,7 +63,6 @@ pipeline {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
@@ -197,6 +197,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM,CLUST
|
||||
SCA.eNBSourceCodePath=matchReg.group(1)
|
||||
PHYSIM.eNBSourceCodePath=matchReg.group(1)
|
||||
CLUSTER.eNBSourceCodePath=matchReg.group(1)
|
||||
EPC.eNBSourceCodePath=matchReg.group(1)
|
||||
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||
RAN.eNB1SourceCodePath=matchReg.group(1)
|
||||
@@ -219,10 +220,10 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM,CLUST
|
||||
EPC.SourceCodePath=matchReg.group(1)
|
||||
elif re.match('^\-\-EPCType=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-EPCType=(.+)$', myArgv, re.IGNORECASE)
|
||||
if re.match('OAI', matchReg.group(1), re.IGNORECASE) or re.match('ltebox', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-CUPS', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-Docker', matchReg.group(1), re.IGNORECASE):
|
||||
if re.match('OAI', matchReg.group(1), re.IGNORECASE) or re.match('ltebox', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-CUPS', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-Docker', matchReg.group(1), re.IGNORECASE) or re.match('OC-OAI-CN5G', matchReg.group(1), re.IGNORECASE):
|
||||
EPC.Type=matchReg.group(1)
|
||||
else:
|
||||
sys.exit('Invalid EPC Type: ' + matchReg.group(1) + ' -- (should be OAI or ltebox or OAI-Rel14-CUPS or OAI-Rel14-Docker)')
|
||||
sys.exit('Invalid EPC Type: ' + matchReg.group(1) + ' -- (should be OAI or ltebox or OAI-Rel14-CUPS or OAI-Rel14-Docker or OC-OAI-CN5G)')
|
||||
elif re.match('^\-\-EPCContainerPrefix=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-EPCContainerPrefix=(.+)$', myArgv, re.IGNORECASE)
|
||||
EPC.ContainerPrefix=matchReg.group(1)
|
||||
@@ -260,14 +261,17 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM,CLUST
|
||||
matchReg = re.match('^\-\-OCUserName=(.+)$', myArgv, re.IGNORECASE)
|
||||
PHYSIM.OCUserName = matchReg.group(1)
|
||||
CLUSTER.OCUserName = matchReg.group(1)
|
||||
EPC.OCUserName = matchReg.group(1)
|
||||
elif re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-OCPassword=(.+)$', myArgv, re.IGNORECASE)
|
||||
PHYSIM.OCPassword = matchReg.group(1)
|
||||
CLUSTER.OCPassword = matchReg.group(1)
|
||||
EPC.OCPassword = matchReg.group(1)
|
||||
elif re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE)
|
||||
PHYSIM.OCProjectName = matchReg.group(1)
|
||||
CLUSTER.OCProjectName = matchReg.group(1)
|
||||
EPC.OCProjectName = matchReg.group(1)
|
||||
elif re.match('^\-\-OCUrl=(.+)$', myArgv, re.IGNORECASE):
|
||||
matchReg = re.match('^\-\-OCUrl=(.+)$', myArgv, re.IGNORECASE)
|
||||
CLUSTER.OCUrl = matchReg.group(1)
|
||||
|
||||
183
ci-scripts/as_ue/aw2s-asue.cfg
Normal file
183
ci-scripts/as_ue/aw2s-asue.cfg
Normal file
@@ -0,0 +1,183 @@
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
|
||||
log_options: "all.level=warn,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue1.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and
|
||||
allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: 20,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:627360,
|
||||
ssb_nr_arfcn:627360,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 1,
|
||||
"imsi": "001010000000100",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 2,
|
||||
"imsi": "001010000000101",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 3,
|
||||
"imsi": "001010000000102",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, sd: 66051, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, sd: 66051, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 4,
|
||||
"imsi": "001010000000103",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, sd: 66051, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, sd: 66051, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 5,
|
||||
"imsi": "001010000000104",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, sd: 66051, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, sd: 66051, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 6,
|
||||
"imsi": "001010000000105",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, sd: 66051, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, sd: 66051, },
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
/* UE capabilities */
|
||||
|
||||
/* USIM data */
|
||||
"ue_id" : 7,
|
||||
"imsi": "001010000000106",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, sd: 66051, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, sd: 66051, },
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
280
ci-scripts/as_ue/aw2s-multi-20897.cfg
Normal file
280
ci-scripts/as_ue/aw2s-multi-20897.cfg
Normal file
@@ -0,0 +1,280 @@
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 2
|
||||
#define TDD 1
|
||||
|
||||
log_options: "all.level=warn,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and
|
||||
allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: 20,
|
||||
band: 78,
|
||||
dl_nr_arfcn:627360,
|
||||
ssb_nr_arfcn:627360,
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
ue_list: [
|
||||
{
|
||||
"ue_id" : 1,
|
||||
"imsi": "208970000000111",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 2,
|
||||
"imsi": "208970000000112",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 3,
|
||||
"imsi": "208970000000113",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 4,
|
||||
"imsi": "208970000000114",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 5,
|
||||
"imsi": "208970000000115",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 6,
|
||||
"imsi": "208970000000116",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 7,
|
||||
"imsi": "208970000000117",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 8,
|
||||
"imsi": "208970000000118",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 9,
|
||||
"imsi": "208970000000119",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 10,
|
||||
"imsi": "208970000000120",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 11,
|
||||
"imsi": "208970000000121",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 12,
|
||||
"imsi": "208970000000122",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 13,
|
||||
"imsi": "208970000000123",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 14,
|
||||
"imsi": "208970000000124",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 15,
|
||||
"imsi": "208970000000125",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
{
|
||||
"ue_id" : 16,
|
||||
"imsi": "208970000000126",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [ { sst: 1, }, ],
|
||||
default_pdu_session_snssai: { sst: 1, },
|
||||
tun_setup_script: "ue-ifup",
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 40
|
||||
#define UE_COUNT 3 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue0.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:621312,
|
||||
ssb_nr_arfcn:621312,
|
||||
|
||||
//band: 41,
|
||||
//dl_nr_arfcn:517020,
|
||||
//ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 0,
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
}, /*end UE object 0*/
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 1,
|
||||
"imsi": "208970100001128",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
}, /*end UE object 1*/
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 2,
|
||||
"imsi": "208970100001129",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
} /*end UE object 2*/
|
||||
],/*end UE list*/
|
||||
}/*end json*/
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 40
|
||||
#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue0.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:621312,
|
||||
ssb_nr_arfcn:621312,
|
||||
|
||||
//band: 41,
|
||||
//dl_nr_arfcn:517020,
|
||||
//ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 1,
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
}, /*end UE object 0*/
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 2,
|
||||
"imsi": "208970100001128",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 15,
|
||||
end_time: 25,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
} /*end UE object 1*/
|
||||
],/*end UE list*/
|
||||
}/*end json*/
|
||||
@@ -1,150 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 40
|
||||
#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue0.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:621312,
|
||||
ssb_nr_arfcn:621312,
|
||||
|
||||
//band: 41,
|
||||
//dl_nr_arfcn:517020,
|
||||
//ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 1,
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 15,
|
||||
end_time: 25,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
}, /*end UE object 0*/
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 2,
|
||||
"imsi": "208970100001128",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 15,
|
||||
end_time: 25,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}
|
||||
] /*end sim events */
|
||||
} /*end UE object 1*/
|
||||
],/*end UE list*/
|
||||
}/*end json*/
|
||||
@@ -1,150 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 40
|
||||
#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue0.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: true,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:621312,
|
||||
ssb_nr_arfcn:621312,
|
||||
|
||||
//band: 41,
|
||||
//dl_nr_arfcn:517020,
|
||||
//ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 1,
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 20,
|
||||
end_time: 30,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 60,
|
||||
}
|
||||
] /*end sim events */
|
||||
}, /*end UE object 0*/
|
||||
{
|
||||
/* UE capabilities */
|
||||
/* USIM data */
|
||||
"ue_id" : 2,
|
||||
"imsi": "208970100001128",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
sim_events: [
|
||||
{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
},
|
||||
{
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 40,
|
||||
end_time: 50,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 60,
|
||||
}
|
||||
] /*end sim events */
|
||||
} /*end UE object 1*/
|
||||
],/*end UE list*/
|
||||
}/*end json*/
|
||||
@@ -1,113 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 40
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue1.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and
|
||||
allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: false,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
band: 78,
|
||||
dl_nr_arfcn:621312,
|
||||
ssb_nr_arfcn:621312,
|
||||
|
||||
//band: 41,
|
||||
//dl_nr_arfcn:517020,
|
||||
//ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
|
||||
/* USIM data */
|
||||
|
||||
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
],
|
||||
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 66051,
|
||||
},
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
|
||||
sim_events: [{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
}, {
|
||||
"tag": "ping",
|
||||
"prog":"oai_ext_app.sh",
|
||||
start_time: 15,
|
||||
end_time: 25,
|
||||
"args":["ping 192.168.70.136"],
|
||||
"event":"ext_app"
|
||||
|
||||
},
|
||||
{
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}]
|
||||
}
|
||||
],
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
/* UE simulator configuration */
|
||||
|
||||
|
||||
|
||||
/* UE simulator configuration file version 2021-06-17
|
||||
* LTE / 5G Non StandAlone
|
||||
* Copyright (C) 2019-2021 Amarisoft
|
||||
*/
|
||||
{
|
||||
#define N_ANTENNA_DL 1
|
||||
#define TDD 1
|
||||
#define CELL_BANDWIDTH 20
|
||||
|
||||
|
||||
log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
|
||||
log_filename: "/tmp/ue0.log",
|
||||
|
||||
/* Enable remote API and Web interface */
|
||||
com_addr: "0.0.0.0:9002",
|
||||
|
||||
include "rf_driver/1chan.cfg",
|
||||
|
||||
/* If true, allow the simulation of several UEs at the same time and
|
||||
allow dynamic UE creation from remote API */
|
||||
|
||||
cell_groups: [{
|
||||
group_type: "nr",
|
||||
multi_ue: false,
|
||||
cells: [{
|
||||
rf_port: 0,
|
||||
bandwidth: CELL_BANDWIDTH,
|
||||
#if TDD == 1
|
||||
// band: 78,
|
||||
// dl_nr_arfcn:621312,
|
||||
// ssb_nr_arfcn:621312,*/
|
||||
|
||||
band: 41,
|
||||
dl_nr_arfcn:517020,
|
||||
ssb_nr_arfcn:516990,
|
||||
#else
|
||||
band: 7,
|
||||
dl_nr_arfcn: 536020,
|
||||
ssb_nr_arfcn: 535930,
|
||||
ssb_subcarrier_spacing: 15,
|
||||
#endif
|
||||
subcarrier_spacing: 30,
|
||||
n_antenna_dl: N_ANTENNA_DL,
|
||||
n_antenna_ul: 1,
|
||||
rx_to_tx_latency:2,
|
||||
}],
|
||||
}],
|
||||
|
||||
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_bind_addr: "127.0.10.11",
|
||||
|
||||
ue_list: [
|
||||
{
|
||||
/* UE capabilities */
|
||||
|
||||
/* USIM data */
|
||||
|
||||
"imsi": "208970100001127",
|
||||
"K": "fec86ba6eb707ed08905757b1bb44b8f",
|
||||
"sim_algo":"milenage",
|
||||
"op": "1006020f0a478bf6b699f15c062e42b3",
|
||||
|
||||
|
||||
as_release: 15,
|
||||
ue_category: "nr",
|
||||
apn:"oai",
|
||||
attach_pdn_type:"ipv4",
|
||||
default_nssai: [
|
||||
{
|
||||
sst: 1,
|
||||
sd: 1,
|
||||
},
|
||||
],
|
||||
|
||||
default_pdu_session_snssai: {
|
||||
sst: 1,
|
||||
sd: 1,
|
||||
},
|
||||
|
||||
|
||||
/* Enable it to allow sim_events to be handled remotely */
|
||||
//rue_addr: "127.1.0.0",
|
||||
|
||||
/* Enable it to create a TUN interface for each UE PDN */
|
||||
tun_setup_script: "ue-ifup",
|
||||
|
||||
sim_events: [{
|
||||
event: "power_on",
|
||||
start_time: 5,
|
||||
}, {
|
||||
event: "ext_app",
|
||||
start_time: 15,
|
||||
end_time: 25,
|
||||
prog: "ext_app.sh",
|
||||
args: ["iperf", " -c 172.21.10.5", " -u"," -b 1M"," -i 1"," -t 10"]
|
||||
}, {
|
||||
event: "power_off",
|
||||
start_time: 30,
|
||||
}]
|
||||
}
|
||||
],
|
||||
}
|
||||
@@ -49,75 +49,75 @@ adb_ue_2:
|
||||
|
||||
amarisoft_ue:
|
||||
Host: amariue
|
||||
InitScript: nohup /root/NV18-06-2022/ue/lteue /root/NV18-06-2022/ue/config/oaicicd-ue-ci-test.cfg &
|
||||
TermScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"quit"}'
|
||||
InitScript: /root/NV18-06-2022/lteue-linux-2023-03-17/lteue /root/oaicicd/ran_sa_aw2s_asue/aw2s-multi-20897.cfg &
|
||||
TermScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"quit"}'
|
||||
amarisoft_ue_1:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":1}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":1}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":1}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":1}'
|
||||
UENetworkScript: ip netns exec ue1 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue1
|
||||
MTU: 1500
|
||||
amarisoft_ue_2:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":2}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":2}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":2}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":2}'
|
||||
UENetworkScript: ip netns exec ue2 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue2
|
||||
MTU: 1500
|
||||
amarisoft_ue_3:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":3}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":3}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":3}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":3}'
|
||||
UENetworkScript: ip netns exec ue3 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue3
|
||||
MTU: 1500
|
||||
amarisoft_ue_4:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":4}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":4}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":4}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":4}'
|
||||
UENetworkScript: ip netns exec ue4 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue4
|
||||
MTU: 1500
|
||||
amarisoft_ue_5:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":5}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":5}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":5}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":5}'
|
||||
UENetworkScript: ip netns exec ue5 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue5
|
||||
MTU: 1500
|
||||
amarisoft_ue_6:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":6}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":6}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":6}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":6}'
|
||||
UENetworkScript: ip netns exec ue6 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue6
|
||||
MTU: 1500
|
||||
amarisoft_ue_7:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":7}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":7}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":7}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":7}'
|
||||
UENetworkScript: ip netns exec ue7 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue7
|
||||
MTU: 1500
|
||||
amarisoft_ue_8:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":8}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":8}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":8}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":8}'
|
||||
UENetworkScript: ip netns exec ue8 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue8
|
||||
MTU: 1500
|
||||
amarisoft_ue_9:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":9}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":9}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":9}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":9}'
|
||||
UENetworkScript: ip netns exec ue9 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue9
|
||||
MTU: 1500
|
||||
amarisoft_ue_10:
|
||||
Host: amariue
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":10}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2022-06-18/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":10}'
|
||||
AttachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":10}'
|
||||
DetachScript: /root/NV18-06-2022/lteue-linux-2023-03-17/doc/ws.js 127.0.0.1:9002 '{"message":"power_off","ue_id":10}'
|
||||
UENetworkScript: ip netns exec ue10 ip a show dev pdn0
|
||||
CmdPrefix: ip netns exec ue10
|
||||
MTU: 1500
|
||||
|
||||
@@ -40,6 +40,29 @@ import cls_cmd
|
||||
|
||||
IMAGE_REGISTRY_SERVICE_NAME = "image-registry.openshift-image-registry.svc"
|
||||
NAMESPACE = "oaicicd-ran"
|
||||
OCUrl = "https://api.oai.cs.eurecom.fr:6443"
|
||||
OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/"
|
||||
|
||||
|
||||
def OC_login(cmd, ocUserName, ocPassword, ocProjectName):
|
||||
if ocUserName == '' or ocPassword == '' or ocProjectName == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
sys.exit('Insufficient Parameter: no OC Credentials')
|
||||
if OCRegistry.startswith("http") and not self.OCRegistry.endswith("/"):
|
||||
sys.exit(f'ocRegistry {OCRegistry} should not start with http:// or https:// and end on a slash /')
|
||||
ret = cmd.run(f'oc login -u {ocUserName} -p {ocPassword} --server {OCUrl}')
|
||||
if ret.returncode != 0:
|
||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||
return False
|
||||
ret = cmd.run(f'oc project {ocProjectName}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'\u001B[1mUnable to access OC project {ocProjectName}\u001B[0m')
|
||||
OC_logout(cmd)
|
||||
return False
|
||||
return True
|
||||
|
||||
def OC_logout(cmd):
|
||||
cmd.run(f'oc logout')
|
||||
|
||||
class Cluster:
|
||||
def __init__(self):
|
||||
@@ -57,7 +80,7 @@ class Cluster:
|
||||
self.ranAllowMerge = False
|
||||
self.ranTargetBranch = ""
|
||||
self.cmd = None
|
||||
|
||||
self.imageToPull = ''
|
||||
|
||||
def _recreate_entitlements(self):
|
||||
# recreating entitlements, don't care if deletion fails
|
||||
@@ -170,11 +193,47 @@ class Cluster:
|
||||
def _undeploy_pod(self, filename):
|
||||
self.cmd.run(f'oc delete -f {filename}')
|
||||
|
||||
def PullClusterImage(self, HTML, RAN):
|
||||
if self.imageToPull == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
HELP.EPCSrvHelp(self.imageToPull)
|
||||
sys.exit('Insufficient eNB Parameters')
|
||||
lIpAddr = self.eNBIPAddress
|
||||
self.testCase_id = HTML.testCase_id
|
||||
cmd = cls_cmd.getConnection(lIpAddr)
|
||||
succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, self.OCProjectName)
|
||||
if not succeeded:
|
||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
ret = cmd.run(f'oc whoami -t | docker login -u oaicicd --password-stdin {self.OCRegistry}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'\u001B[1m Unable to access OC project {ocProjectName}\u001B[0m')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
for image in self.imageToPull:
|
||||
imagePrefix = f'{self.OCRegistry}{self.OCProjectName}'
|
||||
imageTag = cls_containerize.ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
ret = cmd.run(f'docker pull {imagePrefix}/{imageTag}')
|
||||
if ret.returncode != 0:
|
||||
logging.error(f'Could not pull {image} from local registry : {self.OCRegistry}')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
cmd.run(f'docker tag {imagePrefix}/{imageTag} oai-ci/{imageTag}')
|
||||
cmd.run(f'docker rmi {imagePrefix}/{imageTag}')
|
||||
OC_logout(cmd)
|
||||
cmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
|
||||
def BuildClusterImage(self, HTML):
|
||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
sys.exit(f'Insufficient Parameter: ranRepository {self.ranRepository} ranBranch {ranBranch} ranCommitID {self.ranCommitID}')
|
||||
|
||||
lIpAddr = self.eNBIPAddress
|
||||
lSourcePath = self.eNBSourceCodePath
|
||||
if lIpAddr == '' or lSourcePath == '':
|
||||
@@ -204,7 +263,6 @@ class Cluster:
|
||||
|
||||
baseTag = 'develop'
|
||||
forceBaseImageBuild = False
|
||||
imageTag = 'develop'
|
||||
if self.ranAllowMerge: # merging MR branch into develop -> temporary image
|
||||
imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}'
|
||||
if self.ranTargetBranch == 'develop':
|
||||
@@ -214,6 +272,7 @@ class Cluster:
|
||||
forceBaseImageBuild = True
|
||||
baseTag = 'ci-temp'
|
||||
else:
|
||||
imageTag = f'develop-{self.ranCommitID[0:8]}'
|
||||
forceBaseImageBuild = True
|
||||
|
||||
# logging to OC Cluster and then switch to corresponding project
|
||||
@@ -273,11 +332,18 @@ class Cluster:
|
||||
ranbuild_job = self._start_build('ran-build')
|
||||
attemptedImages += ['ran-build']
|
||||
|
||||
wait = ranbuild_job is not None and physim_job is not None and self._wait_build_end([ranbuild_job, physim_job], 1200)
|
||||
if not wait: logging.error('error during build of ranbuild_job or physim_job')
|
||||
self._recreate_is_tag('oai-clang', imageTag, 'openshift/oai-clang-is.yaml')
|
||||
self._recreate_bc('oai-clang', imageTag, 'openshift/oai-clang-bc.yaml')
|
||||
self._retag_image_statement('ran-base', 'image-registry.openshift-image-registry.svc:5000/oaicicd-ran/ran-base', baseTag, 'docker/Dockerfile.clang.rhel8.2')
|
||||
clang_job = self._start_build('oai-clang')
|
||||
attemptedImages += ['oai-clang']
|
||||
|
||||
wait = ranbuild_job is not None and physim_job is not None and clang_job is not None and self._wait_build_end([ranbuild_job, physim_job, clang_job], 1200)
|
||||
if not wait: logging.error('error during build of ranbuild_job or physim_job or clang_job')
|
||||
status = status and wait
|
||||
self.cmd.run(f'oc logs {ranbuild_job} &> cmake_targets/log/ran-build.log')
|
||||
self.cmd.run(f'oc logs {physim_job} &> cmake_targets/log/oai-physim.log')
|
||||
self.cmd.run(f'oc logs {clang_job} &> cmake_targets/log/oai-clang.log')
|
||||
self.cmd.run(f'oc get pods.metrics.k8s.io &>> cmake_targets/log/build-metrics.log', '\$', 10)
|
||||
|
||||
if status:
|
||||
|
||||
@@ -31,6 +31,9 @@ import subprocess as sp
|
||||
import os
|
||||
import paramiko
|
||||
import uuid
|
||||
import sys
|
||||
|
||||
SSHTIMEOUT=7
|
||||
|
||||
# helper that returns either LocalCmd or RemoteCmd based on passed host name
|
||||
def getConnection(host, d=None):
|
||||
@@ -123,13 +126,21 @@ class LocalCmd(Cmd):
|
||||
|
||||
class RemoteCmd(Cmd):
|
||||
def __init__(self, hostname, d=None):
|
||||
cIdx = 0
|
||||
logging.getLogger('paramiko').setLevel(logging.ERROR) # prevent spamming through Paramiko
|
||||
self.client = paramiko.SSHClient()
|
||||
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
cfg = RemoteCmd._lookup_ssh_config(hostname)
|
||||
self.client.connect(**cfg)
|
||||
self.cwd = d
|
||||
self.cp = sp.CompletedProcess(args='', returncode=0, stdout='')
|
||||
while cIdx < 3:
|
||||
try:
|
||||
self.client.connect(**cfg)
|
||||
return
|
||||
except:
|
||||
logging.error(f'Could not connect to {hostname}, tried for {cIdx} time')
|
||||
cIdx +=1
|
||||
raise Exception ("Error: max retries, did not connect to host")
|
||||
|
||||
def _lookup_ssh_config(hostname):
|
||||
ssh_config = paramiko.SSHConfig()
|
||||
@@ -142,7 +153,7 @@ class RemoteCmd(Cmd):
|
||||
ucfg = ssh_config.lookup(hostname)
|
||||
if 'identityfile' not in ucfg or 'user' not in ucfg:
|
||||
raise KeyError(f'no identityfile or user in SSH config for host {hostname}')
|
||||
cfg = {'hostname':hostname, 'username':ucfg['user'], 'key_filename':ucfg['identityfile']}
|
||||
cfg = {'hostname':hostname, 'username':ucfg['user'], 'key_filename':ucfg['identityfile'], 'timeout':SSHTIMEOUT}
|
||||
if 'hostname' in ucfg:
|
||||
cfg['hostname'] = ucfg['hostname'] # override user-given hostname with what is in config
|
||||
if 'port' in ucfg:
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
#-----------------------------------------------------------
|
||||
# Import
|
||||
#-----------------------------------------------------------
|
||||
import sys # arg
|
||||
import re # reg
|
||||
import sys # arg
|
||||
import re # reg
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
@@ -47,6 +47,7 @@ from zipfile import ZipFile
|
||||
#-----------------------------------------------------------
|
||||
# OAI Testing modules
|
||||
#-----------------------------------------------------------
|
||||
import cls_cluster as OC
|
||||
import cls_cmd
|
||||
import sshconnection as SSH
|
||||
import helpreadme as HELP
|
||||
@@ -90,6 +91,15 @@ def CreateWorkspace(sshSession, sourcePath, ranRepository, ranCommitID, ranTarge
|
||||
logging.debug(f'Merging with the target branch: {ranTargetBranch}')
|
||||
sshSession.command(f'git merge --ff origin/{ranTargetBranch} -m "Temporary merge for CI"', '\$', 30)
|
||||
|
||||
def ImageTagToUse(imageName, ranCommitID, ranBranch, ranAllowMerge):
|
||||
shortCommit = ranCommitID[0:8]
|
||||
if ranAllowMerge:
|
||||
tagToUse = f'{ranBranch}-{shortCommit}'
|
||||
else:
|
||||
tagToUse = f'develop-{shortCommit}'
|
||||
fullTag = f'{imageName}:{tagToUse}'
|
||||
return fullTag
|
||||
|
||||
def CopyLogsToExecutor(cmd, sourcePath, log_name):
|
||||
cmd.cd(f'{sourcePath}/cmake_targets')
|
||||
cmd.run(f'rm -f {log_name}.zip')
|
||||
@@ -306,7 +316,6 @@ class Containerize():
|
||||
self.registrySvrId = ''
|
||||
self.testSvrId = ''
|
||||
self.imageToPull = []
|
||||
|
||||
#checkers from xml
|
||||
self.ran_checkers={}
|
||||
|
||||
@@ -383,7 +392,7 @@ class Containerize():
|
||||
|
||||
CreateWorkspace(cmd, lSourcePath, self.ranRepository, self.ranCommitID, self.ranTargetBranch, self.ranAllowMerge)
|
||||
|
||||
# if asterix, copy the entitlement and subscription manager configurations
|
||||
# if asterix, copy the entitlement and subscription manager configurations
|
||||
if self.host == 'Red Hat':
|
||||
cmd.run('mkdir -p ./etc-pki-entitlement ./rhsm-conf ./rhsm-ca')
|
||||
cmd.run('cp /etc/rhsm/rhsm.conf ./rhsm-conf/')
|
||||
@@ -649,15 +658,6 @@ class Containerize():
|
||||
HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
|
||||
HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize)
|
||||
|
||||
def ImageTagToUse(self, imageName):
|
||||
shortCommit = self.ranCommitID[0:8]
|
||||
if self.ranAllowMerge:
|
||||
tagToUse = f'{self.ranBranch}-{shortCommit}'
|
||||
else:
|
||||
tagToUse = f'develop-{shortCommit}'
|
||||
fullTag = f'porcepix.sboai.cs.eurecom.fr/{imageName}:{tagToUse}'
|
||||
return fullTag
|
||||
|
||||
def Push_Image_to_Local_Registry(self, HTML):
|
||||
if self.registrySvrId == '0':
|
||||
lIpAddr = self.eNBIPAddress
|
||||
@@ -680,8 +680,8 @@ class Containerize():
|
||||
logging.debug('Pushing images from server: ' + lIpAddr)
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||
|
||||
mySSH.command('docker login -u oaicicd -p oaicicd porcepix.sboai.cs.eurecom.fr', '\$', 5)
|
||||
imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
|
||||
mySSH.command(f'docker login -u oaicicd -p oaicicd {imagePrefix}', '\$', 5)
|
||||
if re.search('Login Succeeded', mySSH.getBefore()) is None:
|
||||
msg = 'Could not log into local registry'
|
||||
logging.error(msg)
|
||||
@@ -694,9 +694,9 @@ class Containerize():
|
||||
orgTag = 'ci-temp'
|
||||
imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru', 'oai-nr-cuup']
|
||||
for image in imageNames:
|
||||
tagToUse = self.ImageTagToUse(image)
|
||||
mySSH.command(f'docker image tag {image}:{orgTag} {tagToUse}', '\$', 5)
|
||||
mySSH.command(f'docker push {tagToUse}', '\$', 120)
|
||||
tagToUse = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
mySSH.command(f'docker image tag {image}:{orgTag} {imagePrefix}/{tagToUse}', '\$', 5)
|
||||
mySSH.command(f'docker push {imagePrefix}/{tagToUse}', '\$', 120)
|
||||
if re.search(': digest:', mySSH.getBefore()) is None:
|
||||
logging.debug(mySSH.getBefore())
|
||||
msg = f'Could not push {image} to local registry : {tagToUse}'
|
||||
@@ -704,9 +704,9 @@ class Containerize():
|
||||
mySSH.close()
|
||||
HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
mySSH.command(f'docker rmi {tagToUse} {image}:{orgTag}', '\$', 30)
|
||||
mySSH.command(f'docker rmi {imagePrefix}/{tagToUse} {image}:{orgTag}', '\$', 30)
|
||||
|
||||
mySSH.command('docker logout porcepix.sboai.cs.eurecom.fr', '\$', 5)
|
||||
mySSH.command(f'docker logout {imagePrefix}', '\$', 5)
|
||||
if re.search('Removing login credentials', mySSH.getBefore()) is None:
|
||||
msg = 'Could not log off from local registry'
|
||||
logging.error(msg)
|
||||
@@ -739,25 +739,18 @@ class Containerize():
|
||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
sys.exit('Insufficient Parameter')
|
||||
if lIpAddr != 'none':
|
||||
logging.debug('Pulling images onto server: ' + lIpAddr)
|
||||
myCmd = cls_cmd.RemoteCmd(lIpAddr)
|
||||
else:
|
||||
logging.debug('Pulling images locally')
|
||||
myCmd = cls_cmd.LocalCmd()
|
||||
|
||||
cmd = 'docker login -u oaicicd -p oaicicd porcepix.sboai.cs.eurecom.fr'
|
||||
response = myCmd.run(cmd)
|
||||
myCmd = cls_cmd.getConnection(lIpAddr)
|
||||
imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
|
||||
response = myCmd.run(f'docker login -u oaicicd -p oaicicd {imagePrefix}')
|
||||
if response.returncode != 0:
|
||||
msg = 'Could not log into local registry'
|
||||
logging.error(msg)
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
|
||||
for image in self.imageToPull:
|
||||
tagToUse = self.ImageTagToUse(image)
|
||||
cmd = f'docker pull {tagToUse}'
|
||||
tagToUse = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
cmd = f'docker pull {imagePrefix}/{tagToUse}'
|
||||
response = myCmd.run(cmd, timeout=120)
|
||||
if response.returncode != 0:
|
||||
logging.debug(response)
|
||||
@@ -766,16 +759,15 @@ class Containerize():
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
|
||||
cmd = 'docker logout porcepix.sboai.cs.eurecom.fr'
|
||||
response = myCmd.run(cmd)
|
||||
myCmd.run(f'docker tag {imagePrefix}/{tagToUse} oai-ci/{tagToUse}')
|
||||
myCmd.run(f'docker rmi {imagePrefix}/{tagToUse}')
|
||||
response = myCmd.run(f'docker logout {imagePrefix}')
|
||||
if response.returncode != 0:
|
||||
msg = 'Could not log off from local registry'
|
||||
logging.error(msg)
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return False
|
||||
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
return True
|
||||
@@ -810,7 +802,8 @@ class Containerize():
|
||||
|
||||
imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru', 'oai-nr-cuup']
|
||||
for image in imageNames:
|
||||
cmd = f'docker rmi {self.ImageTagToUse(image)}'
|
||||
imageTag = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
cmd = f'docker rmi oai-ci/{imageTag}'
|
||||
myCmd.run(cmd, reportNonZero=False)
|
||||
|
||||
myCmd.close()
|
||||
@@ -845,10 +838,10 @@ class Containerize():
|
||||
|
||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||
mySSH.command('cp docker-compose.y*ml ci-docker-compose.yml', '\$', 5)
|
||||
imagesList = ['oai-enb', 'oai-gnb', 'oai-nr-cuup']
|
||||
imagesList = ['oai-enb', 'oai-gnb', 'oai-nr-cuup', 'oai-gnb-aw2s']
|
||||
for image in imagesList:
|
||||
imageToUse = self.ImageTagToUse(image)
|
||||
mySSH.command(f'sed -i -e "s#image: {image}:latest#image: {imageToUse}#" ci-docker-compose.yml', '\$', 2)
|
||||
imageTag = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
mySSH.command(f'sed -i -e "s#image: {image}:latest#image: oai-ci/{imageTag}#" ci-docker-compose.yml', '\$', 2)
|
||||
localMmeIpAddr = EPC.MmeIPAddress
|
||||
mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2)
|
||||
|
||||
@@ -966,6 +959,7 @@ class Containerize():
|
||||
logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m')
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||
|
||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||
|
||||
svcName = self.services[self.eNB_instance]
|
||||
@@ -981,7 +975,7 @@ class Containerize():
|
||||
for s in allServices:
|
||||
mySSH.command(f'docker-compose -f ci-docker-compose.yml ps --all -- {s}', '\$', 5, silent=False)
|
||||
running = mySSH.getBefore().split('\r\n')[2:-1]
|
||||
#logging.debug(f'running services: {running}')
|
||||
logging.debug(f'running services: {running}')
|
||||
if len(running) > 0: # something is running for that service
|
||||
services.append(s)
|
||||
logging.info(f'stopping services {services}')
|
||||
@@ -1050,13 +1044,12 @@ class Containerize():
|
||||
myCmd.close()
|
||||
HTML.CreateHtmlTestRow('SVC not Found', 'KO', CONST.ALL_PROCESSES_OK)
|
||||
return
|
||||
|
||||
cmd = 'cp docker-compose.y*ml docker-compose-ci.yml'
|
||||
myCmd.run(cmd, silent=self.displayedNewTags)
|
||||
imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru', 'oai-nr-cuup']
|
||||
for image in imageNames:
|
||||
tagToUse = self.ImageTagToUse(image)
|
||||
cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml'
|
||||
tagToUse = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@oai-ci/{tagToUse}@" docker-compose-ci.yml'
|
||||
myCmd.run(cmd, silent=self.displayedNewTags)
|
||||
self.displayedNewTags = True
|
||||
|
||||
@@ -1193,13 +1186,12 @@ class Containerize():
|
||||
ymlPath = self.yamlPath[0].split('/')
|
||||
logPath = '../cmake_targets/log/' + ymlPath[1]
|
||||
myCmd = cls_cmd.LocalCmd(d = self.yamlPath[0])
|
||||
|
||||
cmd = 'cp docker-compose.y*ml docker-compose-ci.yml'
|
||||
myCmd.run(cmd, silent=self.displayedNewTags)
|
||||
imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru', 'oai-nr-cuup']
|
||||
for image in imageNames:
|
||||
tagToUse = self.ImageTagToUse(image)
|
||||
cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml'
|
||||
tagToUse = ImageTagToUse(image, self.ranCommitID, self.ranBranch, self.ranAllowMerge)
|
||||
cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@oai-ci/{tagToUse}@" docker-compose-ci.yml'
|
||||
myCmd.run(cmd, silent=self.displayedNewTags)
|
||||
self.displayedNewTags = True
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ class Module_UE:
|
||||
c = cls_cmd.RemoteCmd(self.host)
|
||||
response = c.run(cmd, silent=silent)
|
||||
c.close()
|
||||
return response.stdout
|
||||
return response
|
||||
|
||||
#-----------------$
|
||||
#PUBLIC Methods$
|
||||
@@ -95,7 +95,11 @@ class Module_UE:
|
||||
if self.cmd_dict["detach"]:
|
||||
self._command(self.cmd_dict["detach"], silent=True)
|
||||
self._command(self.cmd_dict["terminate"], silent=True)
|
||||
self._command(self.cmd_dict["initialize"])
|
||||
ret = self._command(self.cmd_dict["initialize"])
|
||||
logging.info(f'For command: {ret.args} | return output: {ret.stdout} | Code: {ret.returncode}')
|
||||
# Here each UE returns differently for the successful initialization, requires check based on UE
|
||||
return ret.returncode == 0
|
||||
|
||||
|
||||
def terminate(self):
|
||||
self._command(self.cmd_dict["terminate"])
|
||||
@@ -122,9 +126,9 @@ class Module_UE:
|
||||
self._command(self.cmd_dict["detach"])
|
||||
time.sleep(5)
|
||||
if ip:
|
||||
logging.debug(f'\u001B[1mUE IP Address is {ip}\u001B[0m')
|
||||
logging.debug(f'\u001B[1mUE IP Address for UE {self.module_name} is {ip}\u001B[0m')
|
||||
else:
|
||||
logging.debug('\u001B[1;37;41mUE IP Address Not Found!\u001B[0m')
|
||||
logging.debug(f'\u001B[1;37;41mUE IP Address for UE {self.module_name} Not Found!\u001B[0m')
|
||||
return ip
|
||||
|
||||
def detach(self):
|
||||
@@ -133,7 +137,7 @@ class Module_UE:
|
||||
def check(self):
|
||||
cmd = self.cmd_dict["check"]
|
||||
if cmd:
|
||||
return self._command(cmd)
|
||||
return self._command(cmd).stdout
|
||||
else:
|
||||
logging.warning(f"requested status check of UE {self.getName()}, but operation is not supported")
|
||||
return f"UE {self.getName()} does not support status checking"
|
||||
@@ -160,7 +164,7 @@ class Module_UE:
|
||||
|
||||
def getIP(self):
|
||||
output = self._command(self.cmd_dict["getNetwork"], silent=True)
|
||||
result = re.search('inet (?P<ip>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', output)
|
||||
result = re.search('inet (?P<ip>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', output.stdout)
|
||||
if result and result.group('ip'):
|
||||
ip = result.group('ip')
|
||||
return ip
|
||||
@@ -168,12 +172,12 @@ class Module_UE:
|
||||
|
||||
def checkMTU(self):
|
||||
output = self._command(self.cmd_dict["getNetwork"], silent=True)
|
||||
result = re.search('mtu (?P<mtu>[0-9]+)', output)
|
||||
result = re.search('mtu (?P<mtu>[0-9]+)', output.stdout)
|
||||
if result and result.group('mtu') and int(result.group('mtu')) == self.MTU:
|
||||
logging.debug('\u001B[1mUE Module NIC MTU is ' + str(self.MTU) + ' as expected\u001B[0m')
|
||||
logging.debug(f'\u001B[1mUE Module {self.module_name} NIC MTU is {self.MTU} as expected\u001B[0m')
|
||||
return True
|
||||
else:
|
||||
logging.debug('\u001B[1;37;41m Incorrect Module NIC MTU or MTU not found! Expected: ' + str(self.MTU) + '\u001B[0m')
|
||||
logging.debug(f'\u001B[1;37;41m UE module {self.module_name} has incorrect Module NIC MTU or MTU not found! Expected: {self.MTU} \u001B[0m')
|
||||
return False
|
||||
|
||||
def getName(self):
|
||||
|
||||
@@ -295,10 +295,13 @@ class OaiCiTest():
|
||||
|
||||
def InitializeUE(self, HTML):
|
||||
ues = [cls_module_ue.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
messages = []
|
||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||
futures = [executor.submit(ue.initialize) for ue in ues]
|
||||
for f, ue in zip(futures, ues):
|
||||
uename = f'UE {ue.getName()}'
|
||||
messages.append(f'{uename}: initialized' if f.result() else f'{uename}: ERROR during Initialization')
|
||||
[f.result() for f in futures]
|
||||
messages = [f'UE {ue.getName()}: initialized' for ue in ues]
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'OK', messages)
|
||||
|
||||
|
||||
@@ -605,6 +608,8 @@ class OaiCiTest():
|
||||
Target = EPC.MmeIPAddress
|
||||
elif re.match('OAICN5G', EPC.Type, re.IGNORECASE):
|
||||
Target = EPC.MmeIPAddress
|
||||
elif re.match('OC-OAI-CN5G', EPC.Type, re.IGNORECASE):
|
||||
Target = "172.21.6.100"
|
||||
else:
|
||||
Target = EPC.IPAddress
|
||||
#ping from module NIC rather than IP address to make sure round trip is over the air
|
||||
@@ -1271,7 +1276,7 @@ class OaiCiTest():
|
||||
logging.debug("Iperf in UL requested")
|
||||
cmd = cls_cmd.getConnection(EPC.IPAddress)
|
||||
cmd.run(f'rm {EPC.SourceCodePath}/{server_filename}')
|
||||
cmd.run(f'{cn_iperf_prefix} iperf -s {udpSwitch} -1 -t {iperf_time * 1.5} {port} &> {EPC.SourceCodePath}/{server_filename} &')
|
||||
cmd.run(f'{cn_iperf_prefix} iperf -s {udpSwitch} -t {iperf_time * 1.5} {port} &> {EPC.SourceCodePath}/{server_filename} &')
|
||||
cmd.close()
|
||||
|
||||
cmd = cls_cmd.getConnection(ue.getHost())
|
||||
|
||||
@@ -114,7 +114,7 @@ class PhySim:
|
||||
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 30)
|
||||
else:
|
||||
imageTag = "develop"
|
||||
imageTag = f'develop-{self.ranCommitID[0:8]}'
|
||||
|
||||
# logging to OC Cluster and then switch to corresponding project
|
||||
mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server https://api.oai.cs.eurecom.fr:6443', '\$', 30)
|
||||
|
||||
281
ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf
Normal file
281
ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf
Normal file
@@ -0,0 +1,281 @@
|
||||
Active_gNBs = ( "gNB-Eurecom-n78_20");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
#device :{
|
||||
# name = "aw2sori_transpro";
|
||||
#}
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_CU_ID = 0xe00;
|
||||
|
||||
gNB_name = "gNB-Eurecom-n78_20";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 0x1;
|
||||
plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst =0x1; }) });
|
||||
|
||||
nr_cellid = 12345678L
|
||||
|
||||
////////// Physical parameters:
|
||||
pdsch_AntennaPorts_XP = 2;
|
||||
pusch_AntennaPorts = 2;
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 0;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 11;
|
||||
searchSpaceZero = 0;
|
||||
}
|
||||
);
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3410.4 MHz => 301 REs from PointA 25 PRBs + 1 RE
|
||||
absoluteFrequencySSB = 627360;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3410.4 - (51*12*30e-3/2) = 3401.22 MHz
|
||||
dl_absoluteFrequencyPointA = 626748;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 51;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=0,L=50 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11; # this means shift of 14, so Coreset is in PRBs 1..48, SSB starts at PRB 15
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
#pdsch-ConfigCommon
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 51;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 13750;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 15;
|
||||
preambleReceivedTargetPower = -104;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-96;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -96;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 5;
|
||||
nrofDownlinkSlots = 2;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -10;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "172.21.6.100";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "eno33np0";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.124/20";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "eno33np0";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.124/20";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 200;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 10;
|
||||
ul_max_mcs = 15;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 50;
|
||||
pusch_dtx_threshold = 10;
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_if_name = "ens7f3";
|
||||
remote_address = "192.168.80.239";
|
||||
local_address = "192.168.80.24";
|
||||
local_portc = 50000;
|
||||
remote_portc = 55444;
|
||||
local_portd = 52001;
|
||||
remote_portd = 52183;
|
||||
local_rf = "no"
|
||||
tr_preference = "udp_ecpri_if5"
|
||||
nb_tx = 2
|
||||
nb_rx = 2
|
||||
att_tx = 16
|
||||
att_rx = 0;
|
||||
num_tp_cores = 4;
|
||||
rxfh_core_id = 9;
|
||||
txfh_core_id = 10;
|
||||
tp_cores = [11,12,13,14];
|
||||
nr_flag = 1;
|
||||
eNB_instances = [0];
|
||||
bands = [78];
|
||||
sl_ahead = 5;
|
||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||
bf_weights = [0x00007fff, 0x0000];
|
||||
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||
## beamforming 2x2 matrix:
|
||||
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||
## beamforming 4x4 matrix:
|
||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
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";
|
||||
f1ap_log_level ="debug";
|
||||
f1ap_log_verbosity ="medium";
|
||||
ngap_log_level ="debug";
|
||||
ngap_log_verbosity ="medium";
|
||||
};
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
#-----------------------------------------------------------
|
||||
# Import
|
||||
#-----------------------------------------------------------
|
||||
import sys # arg
|
||||
import re # reg
|
||||
import sys # arg
|
||||
import re # reg
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
@@ -46,10 +46,13 @@ from multiprocessing import Process, Lock, SimpleQueue
|
||||
import sshconnection as SSH
|
||||
import helpreadme as HELP
|
||||
import constants as CONST
|
||||
|
||||
import cls_cluster as OC
|
||||
import cls_cmd
|
||||
#-----------------------------------------------------------
|
||||
# Class Declaration
|
||||
#-----------------------------------------------------------
|
||||
|
||||
|
||||
class EPCManagement():
|
||||
|
||||
def __init__(self):
|
||||
@@ -68,7 +71,13 @@ class EPCManagement():
|
||||
self.isMagmaUsed = False
|
||||
self.cfgDeploy = '--type start-mini --scenario 1 --capture /tmp/oai-cn5g-v1.5.pcap' #from xml, 'mini' is default normal for docker-network.py
|
||||
self.cfgUnDeploy = '--type stop-mini --scenario 1' #from xml, 'mini' is default normal for docker-network.py
|
||||
|
||||
self.OCUrl = "https://api.oai.cs.eurecom.fr:6443"
|
||||
self.OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/"
|
||||
self.OCUserName = ''
|
||||
self.OCPassword = ''
|
||||
self.OCProjectName = ''
|
||||
self.imageToPull = ''
|
||||
self.eNBSourceCodePath = ''
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# EPC management functions
|
||||
@@ -235,8 +244,7 @@ class EPCManagement():
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
||||
sys.exit('Insufficient EPC Parameters')
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
mySSH = cls_cmd.getConnection(self.IPAddress)
|
||||
html_cell = ''
|
||||
if re.match('ltebox', self.Type, re.IGNORECASE):
|
||||
logging.debug('Using the SABOX simulated HSS')
|
||||
@@ -286,6 +294,40 @@ class EPCManagement():
|
||||
if res4 is not None:
|
||||
html_cell += '(' + res4.group('date') + ')'
|
||||
html_cell += '\n'
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
self.testCase_id = HTML.testCase_id
|
||||
imageNames = ["oai-nrf", "oai-amf", "oai-smf", "oai-spgwu-tiny", "oai-ausf", "oai-udm", "oai-udr", "mysql","oai-traffic-server"]
|
||||
logging.debug('Deploying OAI CN5G on Openshift Cluster')
|
||||
lIpAddr = self.IPAddress
|
||||
lSourcePath = self.SourceCodePath
|
||||
succeeded = OC.OC_login(mySSH, self.OCUserName, self.OCPassword, self.OCProjectName)
|
||||
if not succeeded:
|
||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
for ii in imageNames:
|
||||
mySSH.run(f'helm uninstall {ii}', reportNonZero=False)
|
||||
mySSH.run(f'helm spray {lSourcePath}/ci-scripts/charts/oai-5g-basic/.')
|
||||
ret = mySSH.run(f'oc get pods', silent=True)
|
||||
if ret.stdout.count('Running') != 9:
|
||||
logging.error('\u001B[1m Deploying 5GCN Failed using helm chart on OC Cluster\u001B[0m')
|
||||
for ii in imageNames:
|
||||
mySSH.run('helm uninstall '+ ii)
|
||||
ret = mySSH.run(f'oc get pods')
|
||||
if re.search('No resources found', ret.stdout):
|
||||
logging.debug('All pods uninstalled')
|
||||
OC.OC_logout(mySSH)
|
||||
mySSH.close()
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL)
|
||||
return False
|
||||
ret = mySSH.run(f'oc get pods', silent=True)
|
||||
for line in ret.stdout.split('\n')[1:]:
|
||||
columns = line.strip().split()
|
||||
name = columns[0]
|
||||
status = columns[2]
|
||||
html_cell += status + ' ' + name
|
||||
html_cell += '\n'
|
||||
OC.OC_logout(mySSH)
|
||||
else:
|
||||
logging.error('This option should not occur!')
|
||||
mySSH.close()
|
||||
@@ -311,6 +353,10 @@ class EPCManagement():
|
||||
else:
|
||||
logging.error('no container with name oai-amf found, could not retrieve AMF IP address')
|
||||
mySSH.close()
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
response=mySSH.command3('oc pods ls -f name=oai-amf', 10)
|
||||
|
||||
def CheckHSSProcess(self, status_queue):
|
||||
try:
|
||||
@@ -513,8 +559,9 @@ class EPCManagement():
|
||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||
|
||||
def Terminate5GCN(self, HTML):
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
imageNames = ["mysql", "oai-nrf", "oai-amf", "oai-smf", "oai-spgwu-tiny", "oai-ausf", "oai-udm", "oai-udr", "oai-traffic-server"]
|
||||
containerInPods = ["", "-c nrf", "-c amf", "-c smf", "-c spgwu", "-c ausf", "-c udm", "-c udr", ""]
|
||||
mySSH = cls_cmd.getConnection(self.IPAddress)
|
||||
message = ''
|
||||
if re.match('ltebox', self.Type, re.IGNORECASE):
|
||||
logging.debug('Terminating SA BOX')
|
||||
@@ -545,6 +592,37 @@ class EPCManagement():
|
||||
else:
|
||||
message = 'No Tracking area update request'
|
||||
logging.debug(message)
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
logging.debug('Terminating OAI CN5G on Openshift Cluster')
|
||||
lIpAddr = self.IPAddress
|
||||
lSourcePath = self.SourceCodePath
|
||||
mySSH.run(f'rm -Rf {lSourcePath}/logs')
|
||||
mySSH.run(f'mkdir -p {lSourcePath}/logs')
|
||||
logging.debug('OC OAI CN5G - Collecting Log files to workspace')
|
||||
succeeded = OC.OC_login(mySSH, self.OCUserName, self.OCPassword, self.OCProjectName)
|
||||
if not succeeded:
|
||||
logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
|
||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||
return False
|
||||
mySSH.run(f'oc describe pod &> {lSourcePath}/logs/describe-pods-post-test.log')
|
||||
mySSH.run(f'oc get pods.metrics.k8s &> {lSourcePath}/logs/nf-resource-consumption.log')
|
||||
for ii, ci in zip(imageNames, containerInPods):
|
||||
podName = mySSH.run(f"oc get pods | grep {ii} | awk \'{{print $1}}\'").stdout.strip()
|
||||
if not podName:
|
||||
logging.debug(f'{ii} pod not found!')
|
||||
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||
HTML.CreateHtmlTabFooter(False)
|
||||
mySSH.run(f'oc logs -f {podName} {ci} &> {lSourcePath}/logs/{ii}.log &')
|
||||
mySSH.run(f'helm uninstall {ii}')
|
||||
podName = ''
|
||||
mySSH.run(f'cd {lSourcePath}/logs && zip -r -qq test_logs_CN.zip *.log')
|
||||
mySSH.copyin(f'{lSourcePath}/logs/test_logs_CN.zip','test_logs_CN.zip')
|
||||
ret = mySSH.run(f'oc get pods', silent=True)
|
||||
res = re.search('No resources found in oaicicd-ran namespace.', ret.stdout)
|
||||
if res is not None:
|
||||
logging.debug('OC OAI CN5G components uninstalled')
|
||||
message = 'OC OAI CN5G components uninstalled'
|
||||
OC.OC_logout(mySSH)
|
||||
else:
|
||||
logging.error('This should not happen!')
|
||||
mySSH.close()
|
||||
@@ -784,6 +862,8 @@ class EPCManagement():
|
||||
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
||||
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||
logging.debug('LogCollect is bypassed for that variant')
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
logging.debug('LogCollect is bypassed for that variant')
|
||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
|
||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
|
||||
@@ -798,10 +878,13 @@ class EPCManagement():
|
||||
mySSH.close()
|
||||
|
||||
def LogCollectMME(self):
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||
mySSH.command('rm -f mme.log.zip', '\$', 5)
|
||||
if self.Type != 'OC-OAI-CN5G':
|
||||
mySSH = SSH.SSHConnection()
|
||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||
mySSH.command('rm -f mme.log.zip', '\$', 5)
|
||||
else:
|
||||
mySSH = cls_cmd.getConnection(self.IPAddress)
|
||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||
mySSH.command('docker inspect prod-oai-mme', '\$', 10)
|
||||
result = re.search('No such object', mySSH.getBefore())
|
||||
@@ -819,6 +902,10 @@ class EPCManagement():
|
||||
mySSH.command('cp -f /tmp/oai-cn5g-v1.5.pcap .','\$', 30)
|
||||
mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap','\$', 30)
|
||||
mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
mySSH.run('cd ' + self.SourceCodePath + '/logs')
|
||||
mySSH.run('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap')
|
||||
mySSH.run('mv mme.log.zip ' + self.SourceCodePath + '/scripts')
|
||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
|
||||
@@ -852,6 +939,10 @@ class EPCManagement():
|
||||
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
||||
mySSH.command('zip spgw.log.zip oai-smf.log oai-spgwu.log','\$', 30)
|
||||
mySSH.command('mv spgw.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||
elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE):
|
||||
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
||||
mySSH.command('zip spgw.log.zip oai-smf.log oai-spgwu.log','\$', 30)
|
||||
mySSH.command('mv spgw.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
|
||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
|
||||
|
||||
@@ -38,12 +38,12 @@ import helpreadme as HELP
|
||||
import constants as CONST
|
||||
|
||||
|
||||
import cls_oaicitest #main class for OAI CI test framework
|
||||
import cls_physim #class PhySim for physical simulators build and test
|
||||
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||
import cls_static_code_analysis #class for static code analysis
|
||||
import cls_physim1 #class PhySim for physical simulators deploy and run
|
||||
import cls_cluster # class for building/deploying on cluster
|
||||
import cls_oaicitest #main class for OAI CI test framework
|
||||
import cls_physim #class PhySim for physical simulators build and test
|
||||
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||
import cls_static_code_analysis #class for static code analysis
|
||||
import cls_physim1 #class PhySim for physical simulators deploy and run
|
||||
import cls_cluster # class for building/deploying on cluster
|
||||
|
||||
import sshconnection
|
||||
import epc
|
||||
@@ -430,7 +430,11 @@ def GetParametersFromXML(action):
|
||||
RAN.node = test.findtext('node')
|
||||
RAN.command = test.findtext('command')
|
||||
RAN.command_fail = test.findtext('command_fail') in ['True', 'true', 'Yes', 'yes']
|
||||
|
||||
elif action == 'Pull_Cluster_Image':
|
||||
# CLUSTER.imageToPull.clear()
|
||||
string_field = test.findtext('images_to_pull')
|
||||
if (string_field is not None):
|
||||
CLUSTER.imageToPull = string_field.split()
|
||||
else:
|
||||
logging.warning(f"unknown action {action} from option-parsing point-of-view")
|
||||
|
||||
@@ -829,6 +833,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
HTML=ldpc.Run_NRulsimTest(HTML,CONST,id)
|
||||
if ldpc.exitStatus==1:
|
||||
RAN.prematureExit = True
|
||||
elif action == 'Pull_Cluster_Image':
|
||||
if not CLUSTER.PullClusterImage(HTML,RAN):
|
||||
RAN.prematureExit = True
|
||||
elif action == 'Build_Cluster_Image':
|
||||
if not CLUSTER.BuildClusterImage(HTML):
|
||||
RAN.prematureExit = True
|
||||
|
||||
@@ -263,7 +263,7 @@ class RANManagement():
|
||||
cmd = cls_cmd.getConnection(self.node)
|
||||
ret = cmd.run(self.command)
|
||||
cmd.close()
|
||||
logging.debug(f'CustomCommand: {self.command} returnCode: {ret.returncode}')
|
||||
logging.debug(f"Custum command : {self.command} on node : {self.node} returnCode : {ret.returncode}")
|
||||
status = 'OK'
|
||||
message = []
|
||||
if ret.returncode != 0 and not self.command_fail:
|
||||
|
||||
341
ci-scripts/run_sl_test.py
Executable file
341
ci-scripts/run_sl_test.py
Executable file
@@ -0,0 +1,341 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Automated tests for running 5G NR Sidelink SyncRef UE and/or Nearby UE.
|
||||
# The following is an example to run remote machine (nearby) three times.
|
||||
# The syncref UE is launched on the current machine, and a single
|
||||
# nearby UE is launched on the machine specified by the --host and
|
||||
# --user flags. The -r will enable this simulation to be repeated
|
||||
# three times.
|
||||
#
|
||||
# python3 run_sl_test.py --user account --host 10.1.1.68 -r 3
|
||||
#
|
||||
# The following is an example to run just a Sidelink Nearby UE.
|
||||
# By specifying -l nearby, only the nearby UE will be launched
|
||||
# on the machine specified by the --host and --user flags.
|
||||
# The -r will enable this simulation to be repeated two times.
|
||||
#
|
||||
# python3 run_sl_test.py -l nearby --user account --host 10.1.1.68 -r 2
|
||||
#
|
||||
# See `--help` for more information.
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import logging
|
||||
import time
|
||||
import re
|
||||
import glob
|
||||
import subprocess
|
||||
from subprocess import Popen
|
||||
import threading
|
||||
from typing import Dict
|
||||
from queue import *
|
||||
from sl_check_log import LogChecker
|
||||
|
||||
HOME_DIR = os.path.expanduser( '~' )
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Command line argument parsing
|
||||
|
||||
parser = argparse.ArgumentParser(description="""
|
||||
Automated tests for 5G NR Sidelink simulations
|
||||
""")
|
||||
|
||||
parser.add_argument('--launch', '-l', default='both', choices='syncref nearby both'.split(), help="""
|
||||
Sidelink UE type to launch test scenario (default: %(default)s)
|
||||
""")
|
||||
|
||||
parser.add_argument('--host', default='10.1.1.80', type=str, help="""
|
||||
Nearby Host IP (default: %(default)s)
|
||||
""")
|
||||
|
||||
parser.add_argument('--user', '-u', default='zaid', type=str, help="""
|
||||
User id in Nearby Host (default: %(default)s)
|
||||
""")
|
||||
|
||||
parser.add_argument('--repeat', '-r', default=1, type=int, help="""
|
||||
The number of repeated test iterations (default: %(default)s)
|
||||
""")
|
||||
|
||||
parser.add_argument('--basic', '-b', action='store_true', help="""
|
||||
Basic test with basic shell commands
|
||||
""")
|
||||
|
||||
parser.add_argument('--commands', default='sl_cmds.txt', help="""
|
||||
The USRP Commands .txt file (default: %(default)s)
|
||||
""")
|
||||
|
||||
parser.add_argument('--duration', '-d', metavar='SECONDS', type=int, default=30, help="""
|
||||
How long to run the test before stopping to examine the logs
|
||||
""")
|
||||
|
||||
parser.add_argument('--nid1', type=int, default=10, help="""
|
||||
Nid1 value
|
||||
""")
|
||||
|
||||
parser.add_argument('--nid2', type=int, default=1, help="""
|
||||
Nid2 value
|
||||
""")
|
||||
|
||||
parser.add_argument('--log-dir', default=HOME_DIR, help="""
|
||||
Where to store log files
|
||||
""")
|
||||
|
||||
parser.add_argument('--compress', action='store_true', help="""
|
||||
Compress the log files in the --log-dir
|
||||
""")
|
||||
|
||||
parser.add_argument('--no-run', '-n', action='store_true', help="""
|
||||
Don't run the test, only examine the logs in the --log-dir
|
||||
directory from a previous run of the test
|
||||
""")
|
||||
|
||||
parser.add_argument('--debug', action='store_true', help="""
|
||||
Enable debug logging (for this script only)
|
||||
""")
|
||||
|
||||
parser.add_argument('--test', '-t', default='usrp', choices='psbchsim rfsim usrp'.split(), help="""
|
||||
The kind of test scenario to run. The options include psbchsim, rfsim, or usrp. (default: %(default)s)
|
||||
""")
|
||||
|
||||
OPTS = parser.parse_args()
|
||||
del parser
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG if OPTS.debug else logging.INFO,
|
||||
format='>>> %(name)s: %(levelname)s: %(message)s')
|
||||
LOGGER = logging.getLogger(os.path.basename(sys.argv[0]))
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
def redirect_output(cmd: str, filename: str) -> str:
|
||||
cmd += ' >{} 2>&1'.format(filename)
|
||||
return cmd
|
||||
|
||||
def thread_delay(thread_name: str, delay: int) -> None:
|
||||
count = 0
|
||||
while count < 1:
|
||||
time.sleep(delay)
|
||||
count += 1
|
||||
|
||||
class Command:
|
||||
"""
|
||||
Parsing USRP commands file
|
||||
"""
|
||||
def __init__(self, filename) -> None:
|
||||
self.check_user()
|
||||
self.filename = self.check_file(filename)
|
||||
self.parse_commands()
|
||||
|
||||
def check_user(self) -> None:
|
||||
if OPTS.test != 'usrp': return
|
||||
if OPTS.launch != 'syncref' and OPTS.user == '':
|
||||
LOGGER.error("--user followed by [user id] is mandatory to connect to remote machine")
|
||||
sys.exit(1)
|
||||
|
||||
def check_file(self, filename) -> str:
|
||||
data_file = glob.glob(filename)
|
||||
if data_file:
|
||||
return filename
|
||||
else:
|
||||
LOGGER.error(f'The file {filename} does not exist!')
|
||||
sys.exit(1)
|
||||
|
||||
def parse_commands(self) -> None:
|
||||
"""
|
||||
Scan the provided commands file.
|
||||
"""
|
||||
self.launch_cmds: Dict[str, str] = {}
|
||||
if OPTS.test == 'usrp':
|
||||
launch_cmds_re = re.compile(r'^\s*(\S*)usrp\S*\s*=\s*((\S+\s*)*)')
|
||||
elif OPTS.test == 'rfsim':
|
||||
launch_cmds_re = re.compile(r'^\s*(\S*)rfsim\S*\s*=\s*((\S+\s*)*)')
|
||||
elif OPTS.test == 'psbchsim':
|
||||
launch_cmds_re = re.compile(r'^\s*(\S*)psbchsim\S*\s*=\s*((\S+\s*)*)')
|
||||
else:
|
||||
LOGGER.error("Provided test option not valid! %s", OPTS.test)
|
||||
exit(1)
|
||||
|
||||
with open(self.filename, 'rt') as fh:
|
||||
nearby_cmd_continued = False
|
||||
syncref_cmd_continued = False
|
||||
for line in fh:
|
||||
if line == '\n': continue
|
||||
match = launch_cmds_re.match(line)
|
||||
if match:
|
||||
host_role = match.group(1)
|
||||
launch_cmds = match.group(2)
|
||||
if host_role.lower().startswith('nearby'):
|
||||
nearby_cmd_continued = True
|
||||
continue
|
||||
if host_role.lower().startswith('syncref'):
|
||||
syncref_cmd_continued = True
|
||||
continue
|
||||
elif nearby_cmd_continued:
|
||||
launch_cmds += line
|
||||
if not line.strip().endswith('\\'):
|
||||
self.launch_cmds['nearby'] = launch_cmds
|
||||
LOGGER.debug('Nearby cmd is %s', launch_cmds)
|
||||
nearby_cmd_continued = False
|
||||
continue
|
||||
elif syncref_cmd_continued:
|
||||
launch_cmds += line
|
||||
if not line.strip().endswith('\\'):
|
||||
self.launch_cmds['syncref'] = launch_cmds
|
||||
LOGGER.debug('Syncref cmd is %s', launch_cmds)
|
||||
syncref_cmd_continued = False
|
||||
continue
|
||||
else:
|
||||
LOGGER.debug('Unmatched line %r', line)
|
||||
continue
|
||||
if self.launch_cmds == {}:
|
||||
LOGGER.error(f'usrp commands are not found in file: {self.filename} ')
|
||||
exit()
|
||||
|
||||
class TestThread(threading.Thread):
|
||||
"""
|
||||
Represents TestThread
|
||||
"""
|
||||
def __init__(self, queue, commands, passed, log_agent):
|
||||
threading.Thread.__init__(self)
|
||||
self.queue = queue
|
||||
self.commands = commands
|
||||
self.passed = passed
|
||||
self.delay = 0
|
||||
self.log_file = log_agent.txlog_file_path
|
||||
self.log_agent = log_agent
|
||||
|
||||
def run(self):
|
||||
if self.queue.empty() == True:
|
||||
LOGGER.error("Queue is empty!")
|
||||
sys.exit(1)
|
||||
try:
|
||||
while not self.queue.empty():
|
||||
job = self.queue.get()
|
||||
if "nearby" == job:
|
||||
thread_delay(job, delay = 0)
|
||||
self.launch_nearby(job)
|
||||
if "syncref" == job and not OPTS.no_run:
|
||||
thread_delay(job, delay = self.delay)
|
||||
self.launch_syncref(job)
|
||||
self.queue.task_done()
|
||||
except Exception as inst:
|
||||
LOGGER.info(f"Failed to operate on job with type {type(inst)} and args {inst.args}")
|
||||
|
||||
def launch_syncref(self, job) -> Popen:
|
||||
LOGGER.info('Launching SyncRef UE')
|
||||
if OPTS.basic: cmd = redirect_output('uname -a', self.log_file)
|
||||
else: cmd = self.commands.launch_cmds[job]
|
||||
proc = Popen(cmd, shell=True)
|
||||
LOGGER.info(f"syncref_proc = {proc}")
|
||||
if not OPTS.basic and not OPTS.no_run:
|
||||
LOGGER.info(f"Process running... {job}")
|
||||
time.sleep(OPTS.duration)
|
||||
self.kill_process("syncref", proc)
|
||||
|
||||
def launch_nearby(self, job, host=OPTS.host, user=OPTS.user) -> Popen:
|
||||
LOGGER.info('#' * 42)
|
||||
LOGGER.info('Launching Nearby UE')
|
||||
if OPTS.basic: cmd = redirect_output('uname -a', self.log_file)
|
||||
else: cmd = self.commands.launch_cmds[job]
|
||||
if OPTS.test == 'usrp':
|
||||
cmd = cmd[:-1] + f' -d {OPTS.duration} --nid1 {OPTS.nid1} --nid2 {OPTS.nid2}'
|
||||
proc = Popen(["ssh", f"{user}@{host}", cmd],
|
||||
shell=False,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
LOGGER.info(f"nearby_proc = {proc}")
|
||||
remote_output = proc.stdout.readlines()
|
||||
if remote_output == []:
|
||||
nearby_result = proc.stderr.readlines()
|
||||
else:
|
||||
nearby_result = remote_output
|
||||
self.kill_process("nearby", proc)
|
||||
if nearby_result:
|
||||
self.find_nearby_result_metric(nearby_result)
|
||||
else:
|
||||
proc = Popen(cmd, shell=True)
|
||||
LOGGER.info(f"nearby_proc = {proc}")
|
||||
if not OPTS.basic and not OPTS.no_run:
|
||||
LOGGER.info(f"Process running... {job}")
|
||||
time.sleep(OPTS.duration)
|
||||
self.kill_process("nearby", proc)
|
||||
nearby_result = self.log_agent.analyze_nearby_logs(OPTS.nid1, OPTS.nid2)
|
||||
if nearby_result:
|
||||
self.find_nearby_result_metric(nearby_result)
|
||||
|
||||
def find_nearby_result_metric(self, remote_log):
|
||||
result_metric = None
|
||||
for line in remote_log:
|
||||
if type(line) is not str:
|
||||
line = line.decode()
|
||||
if OPTS.test == 'usrp':
|
||||
LOGGER.info(line.strip())
|
||||
# 'SyncRef UE found. RSRP: -100 dBm/RE. It took {delta_time_s} seconds'
|
||||
if 'SyncRef UE found' in line:
|
||||
fields = line.split(maxsplit=12)
|
||||
if len(fields) > 6:
|
||||
ssb_rsrp = float(fields[-6])
|
||||
sync_duration = float(fields[-2])
|
||||
counting_duration = sync_duration - self.delay
|
||||
result_metric = (ssb_rsrp, sync_duration, counting_duration)
|
||||
self.passed += [result_metric]
|
||||
return
|
||||
|
||||
def kill_process(self, job: str, proc: Popen) -> None:
|
||||
# Wait for the processes to end
|
||||
LOGGER.info(f'kill main simulation processes... {job}')
|
||||
cmd = ['sudo', 'killall']
|
||||
cmd.append('-KILL')
|
||||
if proc:
|
||||
cmd.append('nr-uesoftmodem')
|
||||
if "syncref" == job:
|
||||
subprocess.run(cmd)
|
||||
LOGGER.info(f'Waiting for PID proc.pid for {job}')
|
||||
proc.kill()
|
||||
proc.wait()
|
||||
LOGGER.info(f'kill main simulation processes...done for {job}')
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
def main() -> int:
|
||||
commands = Command(OPTS.commands)
|
||||
log_agent = LogChecker(OPTS, LOGGER)
|
||||
LOGGER.debug(f'Number of iterations {OPTS.repeat}')
|
||||
if commands.launch_cmds is not None:
|
||||
for role, cmd in commands.launch_cmds.items():
|
||||
LOGGER.debug(f'{role} UE: {cmd}')
|
||||
jobs = ['nearby', 'syncref'] if OPTS.launch == 'both' else [OPTS.launch]
|
||||
passed_metric = []
|
||||
num_tx_ssb = []
|
||||
num_passed = 0
|
||||
for i in range(OPTS.repeat):
|
||||
threads = []
|
||||
queue = Queue()
|
||||
for job in jobs:
|
||||
queue.put(job)
|
||||
th = TestThread(queue, commands, passed_metric, log_agent)
|
||||
th.setDaemon(True)
|
||||
th.start()
|
||||
threads.append(th)
|
||||
for th in threads:
|
||||
th.join()
|
||||
if num_passed != len(passed_metric):
|
||||
# Examine the logs to determine if the test passed
|
||||
(ssb_rsrp, sync_duration, counting_duration) = passed_metric[-1]
|
||||
num_ssb = log_agent.analyze_syncref_logs(counting_duration)
|
||||
num_tx_ssb += [num_ssb]
|
||||
LOGGER.info(f"Trial {i+1}/{OPTS.repeat} PASSED. {num_ssb} SSB(s) were generated. Measured {ssb_rsrp} RSRP (dbm/RE)")
|
||||
else:
|
||||
LOGGER.info(f"Failure detected during {i+1}/{OPTS.repeat} trial(s).")
|
||||
num_passed = len(passed_metric)
|
||||
|
||||
LOGGER.info('#' * 42)
|
||||
LOGGER.info(f"Number of passed = {len(passed_metric)}/{OPTS.repeat}")
|
||||
if len(num_tx_ssb) > 0:
|
||||
LOGGER.info(f"Avg number of SSB = {sum(num_tx_ssb) / len(num_tx_ssb)} ({num_tx_ssb})")
|
||||
if len(passed_metric) > 0:
|
||||
LOGGER.info(f"Avg SSB RSRP = {sum([result[0] for result in passed_metric]) / len(passed_metric)}")
|
||||
LOGGER.info(f"Avg Sync duration (seconds) = {sum([result[1] for result in passed_metric]) / len(passed_metric)}")
|
||||
return 0
|
||||
|
||||
sys.exit(main())
|
||||
112
ci-scripts/sl_check_log.py
Executable file
112
ci-scripts/sl_check_log.py
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import bz2
|
||||
import logging
|
||||
from typing import Optional, List, Generator
|
||||
|
||||
class LogChecker():
|
||||
def __init__(self, OPTS, LOGGER):
|
||||
self.OPTS = OPTS
|
||||
self.LOGGER = LOGGER
|
||||
self.rxlog_file_path = os.path.join(OPTS.log_dir, 'rx.log')
|
||||
self.txlog_file_path = os.path.join(OPTS.log_dir, 'tx.log')
|
||||
|
||||
def get_lines(self, filename: str) -> Generator[str, None, None]:
|
||||
"""
|
||||
Yield each line of the given log file (.bz2 compressed log file if -c flag is used.)
|
||||
"""
|
||||
fh = bz2.open(filename, 'rb') if self.OPTS.compress else open(filename, 'rb')
|
||||
for line_bytes in fh:
|
||||
line = line_bytes.decode('utf-8', 'backslashreplace')
|
||||
line = line.rstrip('\r\n')
|
||||
yield line
|
||||
|
||||
def get_analysis_messages_nearby(self, filename: str) -> Generator[str, None, None]:
|
||||
"""
|
||||
Finding all logs in the log file with X fields for log parsing optimization
|
||||
"""
|
||||
self.LOGGER.info('Scanning %s', filename)
|
||||
for line in self.get_lines(filename):
|
||||
#796821.854505 [NR_PHY] SyncRef UE found with Nid1 10 and Nid2 1 SS-RSRP 100 dBm/RE
|
||||
#796811.532881 [NR_PHY] nrUE configured
|
||||
fields = line.split(maxsplit=10)
|
||||
if len(fields) == 11 or len(fields) == 4:
|
||||
yield line
|
||||
|
||||
def analyze_nearby_logs(self, exp_nid1: int, exp_nid2: int) -> bool:
|
||||
found = set()
|
||||
est_nid1, est_nid2, time_start_s, time_end_s = -1, -1, -1, -1
|
||||
ssb_rsrp = 0
|
||||
log_file = self.rxlog_file_path
|
||||
result = None
|
||||
|
||||
if self.OPTS.compress:
|
||||
log_file = f'{log_file}.bz2'
|
||||
for line in self.get_analysis_messages_nearby(log_file):
|
||||
#796821.854505 [NR_PHY] SyncRef UE found with Nid1 10 and Nid2 1 SS-RSRP -100 dBm/RE
|
||||
#796811.532881 [NR_PHY] nrUE configured
|
||||
if 'SyncRef UE found' in line and 'Nid1' in line and 'Nid2' in line:
|
||||
num_split = 13 if 'RSRP' in line else 10
|
||||
fields = line.split(maxsplit=num_split)
|
||||
est_nid1 = int(fields[7])
|
||||
est_nid2 = int(fields[10])
|
||||
if 'RSRP' in line:
|
||||
ssb_rsrp = int(fields[12])
|
||||
found.add('found')
|
||||
time_end_s = float(fields[0])
|
||||
break
|
||||
if time_start_s == -1 and 'nrUE configured' in line:
|
||||
fields = line.split(maxsplit=3)
|
||||
time_start_s = float(fields[0])
|
||||
|
||||
|
||||
self.LOGGER.debug('found: %r', found)
|
||||
if len(found) != 1:
|
||||
self.LOGGER.error(f'Failed -- No SyncRef UE found.')
|
||||
return
|
||||
elif exp_nid1 != est_nid1 or exp_nid2 != est_nid2:
|
||||
self.LOGGER.error(f'Failed -- found SyncRef UE Nid1 {est_nid1}, Ni2 {est_nid2}, expecting Nid1 {exp_nid1}, Nid2 {exp_nid2}')
|
||||
return
|
||||
if time_start_s == -1:
|
||||
self.LOGGER.error(f'Failed -- No start time found! Fix log and re-run!')
|
||||
return
|
||||
|
||||
delta_time_s = time_end_s - time_start_s
|
||||
result = f'SyncRef UE found. RSRP: {ssb_rsrp} dBm/RE. It took {delta_time_s} seconds'
|
||||
self.LOGGER.info(result)
|
||||
return [result]
|
||||
|
||||
|
||||
def get_analysis_messages_syncref(self, filename: str) -> Generator[str, None, None]:
|
||||
"""
|
||||
Finding all logs in the log file with X fields for log parsing optimization
|
||||
"""
|
||||
self.LOGGER.info('Scanning %s', filename)
|
||||
for line in self.get_lines(filename):
|
||||
#796811.532881 [NR_PHY] nrUE configured
|
||||
#796821.854505 [NR_PHY] PSBCH SL generation started
|
||||
fields = line.split(maxsplit=5)
|
||||
if len(fields) == 4 or len(fields) == 6 :
|
||||
yield line
|
||||
|
||||
def analyze_syncref_logs(self, counting_delta: float) -> int:
|
||||
time_start_s, time_end_s = -1, -1
|
||||
log_file = self.txlog_file_path
|
||||
sum_ssb = 0
|
||||
|
||||
if self.OPTS.compress:
|
||||
tx_log_file = f'{log_file}.bz2'
|
||||
for line in self.get_analysis_messages_syncref(log_file):
|
||||
#796811.532881 [NR_PHY] nrUE configured
|
||||
#796821.854505 [NR_PHY] PSBCH SL generation started
|
||||
if time_start_s == -1 and 'nrUE configured' in line:
|
||||
fields = line.split(maxsplit=2)
|
||||
time_start_s = float(fields[0])
|
||||
time_end_s = time_start_s + counting_delta
|
||||
if 'PSBCH SL generation started' in line:
|
||||
fields = line.split(maxsplit=2)
|
||||
time_st = float(''.join([ch for ch in fields[0] if ch.isnumeric() or ch =='.']))
|
||||
if time_st < time_end_s:
|
||||
sum_ssb += 1
|
||||
return sum_ssb
|
||||
45
ci-scripts/sl_cmds.txt
Normal file
45
ci-scripts/sl_cmds.txt
Normal file
@@ -0,0 +1,45 @@
|
||||
# The lines containing 'usrp' and starts with 'syncref' or 'nearby' will be valid until it does not contain backspace.
|
||||
|
||||
####################
|
||||
#### USRP ####
|
||||
####################
|
||||
|
||||
### RX Nearby UE ###
|
||||
nearby_usrp_cmd = cd $HOME/openairinterface5g/ci-scripts; \
|
||||
python3 sl_rx_agent.py --cmd \
|
||||
'sudo -E LD_LIBRARY_PATH=$HOME/openairinterface5g/cmake_targets/ran_build/build:$LD_LIBRARY_PATH \
|
||||
$HOME/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
--sl-mode 2 -r 106 --numerology 1 --band 38 --SLC 2600000000 --ue-rxgain 90 \
|
||||
--usrp-args "type=n3xx,addr=192.168.20.2,subdev=A:0,master_clock_rate=122.88e6" \
|
||||
--log_config.global_log_options time,nocolor \
|
||||
> ~/rx.log 2>&1'
|
||||
|
||||
### TX SyncRef UE ###
|
||||
|
||||
syncref_usrp_cmd = \
|
||||
sudo -E LD_LIBRARY_PATH=$HOME/openairinterface5g/cmake_targets/ran_build/build:$LD_LIBRARY_PATH \
|
||||
$HOME/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
--sl-mode 2 --sync-ref -r 106 --numerology 1 --band 38 --SLC 2600000000 --ue-txgain 8 \
|
||||
--usrp-args "type=n3xx,addr=192.168.10.2,subdev=A:0,master_clock_rate=122.88e6" \
|
||||
--log_config.global_log_options time,nocolor\
|
||||
> ~/tx.log 2>&1
|
||||
|
||||
####################
|
||||
#### RFSIM ####
|
||||
####################
|
||||
|
||||
### RX Nearby UE ###
|
||||
nearby_rfsim_cmd = \
|
||||
sudo -E RFSIMULATOR=127.0.0.1 \
|
||||
$HOME/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
--rfsim --sl-mode 2 --rfsimulator.serverport 4048 \
|
||||
--log_config.global_log_options time,nocolor \
|
||||
> ~/rx.log 2>&1
|
||||
|
||||
### TX SyncRef UE ###
|
||||
syncref_rfsim_cmd = \
|
||||
sudo -E RFSIMULATOR=server \
|
||||
$HOME/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
--sync-ref --rfsim --sl-mode 2 --rfsimulator.serverport 4048 \
|
||||
--log_config.global_log_options time,nocolor \
|
||||
> ~/tx.log 2>&1
|
||||
218
ci-scripts/sl_rx_agent.py
Executable file
218
ci-scripts/sl_rx_agent.py
Executable file
@@ -0,0 +1,218 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Automated tests for running 5G NR Sidelink Nearby UE.
|
||||
# The following is an example to run this script.
|
||||
#
|
||||
# python3 sl_rx_agent.py \
|
||||
# --cmd 'sudo -E LD_LIBRARY_PATH=$HOME/openairinterface5g/cmake_targets/ran_build/build:$LD_LIBRARY_PATH \
|
||||
# $HOME/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
# --sl-mode 2 -r 106 --numerology 1 --band 38 -C 2600000000 --ue-rxgain 90 \
|
||||
# --usrp-args "type=n3xx,addr=192.168.20.2,subdev=A:0,master_clock_rate=122.88e6" \
|
||||
# > ~/rx.log 2>&1' \
|
||||
# --nid1 10 --nid2 1
|
||||
#
|
||||
# See `--help` for more information.
|
||||
#
|
||||
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import logging
|
||||
import time
|
||||
import glob
|
||||
import bz2
|
||||
import subprocess
|
||||
from subprocess import Popen
|
||||
from typing import Optional, List
|
||||
from sl_check_log import LogChecker
|
||||
|
||||
HOME_DIR = os.path.expanduser( '~' )
|
||||
# ----------------------------------------------------------------------------
|
||||
# Command line argument parsing
|
||||
|
||||
parser = argparse.ArgumentParser(description="""
|
||||
Automated tests for 5G NR Sidelink Rx simulations
|
||||
""")
|
||||
|
||||
parser.add_argument('--duration', '-d', metavar='SECONDS', type=int, default=30, help="""
|
||||
How long to run the test before stopping to examine the logs
|
||||
""")
|
||||
|
||||
parser.add_argument('--cmd', type=str, default='', help="""
|
||||
Commands
|
||||
""")
|
||||
|
||||
parser.add_argument('--nid1', type=int, default=10, help="""
|
||||
Nid1 value
|
||||
""")
|
||||
|
||||
parser.add_argument('--nid2', type=int, default=1, help="""
|
||||
Nid2 value
|
||||
""")
|
||||
|
||||
parser.add_argument('--log-dir', default=HOME_DIR, help="""
|
||||
Where to store log files
|
||||
""")
|
||||
|
||||
parser.add_argument('--compress', '-c', action='store_true', help="""
|
||||
Compress the log files in the --log-dir
|
||||
""")
|
||||
|
||||
parser.add_argument('--no-run', '-n', action='store_true', help="""
|
||||
Don't run the test, only examine the logs in the --log-dir
|
||||
directory from a previous run of the test
|
||||
""")
|
||||
|
||||
parser.add_argument('--debug', action='store_true', help="""
|
||||
Enable debug logging (for this script only)
|
||||
""")
|
||||
|
||||
OPTS = parser.parse_args()
|
||||
del parser
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG if OPTS.debug else logging.INFO,
|
||||
format='>>> %(name)s: %(levelname)s: %(message)s')
|
||||
LOGGER = logging.getLogger(os.path.basename(sys.argv[0]))
|
||||
|
||||
log_file_path = os.path.join(OPTS.log_dir, 'rx.log')
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
def compress(from_name: str, to_name: Optional[str]=None, remove_original: bool=False) -> None:
|
||||
"""
|
||||
Compress the file `from_name` and store it as `to_name`.
|
||||
`to_name` defaults to `from_name` with `.bz2` appended.
|
||||
If `remove_original` is True, removes `from_name` when the compress finishes.
|
||||
"""
|
||||
if to_name is None:
|
||||
to_name = from_name
|
||||
if not to_name.endswith('.bz2'):
|
||||
to_name += '.bz2'
|
||||
LOGGER.info('Compress %s to %s', from_name, to_name)
|
||||
with bz2.open(to_name, 'w') as outh, \
|
||||
open(from_name, 'rb') as inh:
|
||||
while True:
|
||||
data = inh.read(10240)
|
||||
if not data:
|
||||
break
|
||||
outh.write(data)
|
||||
if remove_original:
|
||||
LOGGER.debug('Remove %s', from_name)
|
||||
os.remove(from_name)
|
||||
|
||||
|
||||
class CompressJobs:
|
||||
"""
|
||||
Allow multiple invocations of `compress` to run in parallel
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.kids: List[int] = []
|
||||
|
||||
def compress(self, from_name: str, to_name: Optional[str]=None, remove_original: bool=False) -> None:
|
||||
if not os.path.exists(from_name):
|
||||
# It's not necessarily an error if the log file does not exist.
|
||||
# For example, if nfapi_trace never gets invoked (e.g., because
|
||||
# NFAPI_TRACE_LEVEL is set to none), then the log file nfapi.log
|
||||
# will not get created.
|
||||
LOGGER.warning('No file: %s', from_name)
|
||||
return
|
||||
kid = os.fork()
|
||||
if kid != 0:
|
||||
self.kids.append(kid)
|
||||
else:
|
||||
LOGGER.debug('in pid %d compress %s...', os.getpid(), from_name)
|
||||
compress(from_name, to_name, remove_original)
|
||||
LOGGER.debug('in pid %d compress %s...done', os.getpid(), from_name)
|
||||
sys.exit()
|
||||
|
||||
def wait(self) -> None:
|
||||
LOGGER.debug('wait %s...', self.kids)
|
||||
failed = []
|
||||
for kid in self.kids:
|
||||
LOGGER.debug('waitpid %d', kid)
|
||||
_pid, status = os.waitpid(kid, 0)
|
||||
if status != 0:
|
||||
failed.append(kid)
|
||||
if failed:
|
||||
raise Exception('compression failed: %s', failed)
|
||||
LOGGER.debug('wait...done')
|
||||
|
||||
|
||||
class TestNearby():
|
||||
"""
|
||||
Represents TestNearby
|
||||
"""
|
||||
def __init__(self):
|
||||
self.cmd = None
|
||||
self.delay = 0 # seconds
|
||||
|
||||
def run(self, cmd: str) -> bool:
|
||||
self.cmd = cmd
|
||||
job = "nearby"
|
||||
time.sleep(self.delay)
|
||||
proc = self.launch_nearby(job)
|
||||
LOGGER.info(f"nearby_proc = {proc}")
|
||||
LOGGER.info(f"Process running... {job}")
|
||||
time.sleep(OPTS.duration)
|
||||
passed = self.kill_process("nearby", proc)
|
||||
if OPTS.compress:
|
||||
self.compress_log_file(proc)
|
||||
return passed
|
||||
|
||||
def launch_nearby(self, job) -> Popen:
|
||||
LOGGER.info('Launching Nearby UE: %s', log_file_path)
|
||||
cmd = self.cmd
|
||||
proc = Popen(cmd, shell=True)
|
||||
time.sleep(1)
|
||||
return proc
|
||||
|
||||
def kill_process(self, job: str, proc: Popen) -> bool:
|
||||
passed = True
|
||||
if proc:
|
||||
status = proc.poll()
|
||||
if status is None:
|
||||
LOGGER.info('process is still running, which is good')
|
||||
else:
|
||||
#passed = False
|
||||
LOGGER.info('process ended early: %r', status)
|
||||
LOGGER.info(f'kill main simulation processes... {job}')
|
||||
cmd = ['sudo', 'killall']
|
||||
cmd.append('-KILL')
|
||||
if proc:
|
||||
cmd.append('nr-uesoftmodem')
|
||||
if "nearby" == job:
|
||||
subprocess.run(cmd)
|
||||
LOGGER.info(f'Waiting for PID proc.pid for {job}')
|
||||
proc.kill()
|
||||
proc.wait()
|
||||
LOGGER.info(f'kill main simulation processes...done for {job}')
|
||||
return passed
|
||||
|
||||
def compress_log_file(self, proc: Popen):
|
||||
jobs = CompressJobs()
|
||||
jobs.compress(log_file_path)
|
||||
jobs.wait()
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
def main(argv) -> int:
|
||||
test_agent = TestNearby()
|
||||
log_agent = LogChecker(OPTS, LOGGER)
|
||||
|
||||
passed = True
|
||||
if not OPTS.no_run:
|
||||
passed = test_agent.run(OPTS.cmd)
|
||||
|
||||
# Examine the logs to determine if the test passed
|
||||
if not log_agent.analyze_nearby_logs(exp_nid1=OPTS.nid1, exp_nid2=OPTS.nid2):
|
||||
passed = False
|
||||
|
||||
if not passed:
|
||||
LOGGER.critical('FAILED')
|
||||
return 1
|
||||
|
||||
LOGGER.info('PASSED')
|
||||
return 0
|
||||
|
||||
sys.exit(main(sys.argv))
|
||||
@@ -1,5 +1,6 @@
|
||||
- Build_Proxy
|
||||
- Build_Cluster_Image
|
||||
- Pull_Cluster_Image
|
||||
- Build_PhySim
|
||||
- Run_LDPCTest
|
||||
- Run_LDPCt1Test
|
||||
|
||||
74
ci-scripts/xml_files/container_5g_rfsim_f1_accelleran.xml
Normal file
74
ci-scripts/xml_files/container_5g_rfsim_f1_accelleran.xml
Normal file
@@ -0,0 +1,74 @@
|
||||
<!--
|
||||
|
||||
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.1 (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
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-f1-accelleran</htmlTabRef>
|
||||
<htmlTabName>F1 DU Interop Accelleran CU</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
000020
|
||||
000021
|
||||
020021
|
||||
100021
|
||||
100022
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000020">
|
||||
<class>DeployGenObject</class>
|
||||
<desc>Deploy OAI-DU</desc>
|
||||
<yaml_path>yaml_files/5g_rfsimulator_accelleran</yaml_path>
|
||||
<services>oai-du</services>
|
||||
<nb_healthy>1</nb_healthy>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000021">
|
||||
<class>DeployGenObject</class>
|
||||
<desc>Deploy nrUE</desc>
|
||||
<yaml_path>yaml_files/5g_rfsimulator_accelleran</yaml_path>
|
||||
<services>oai-nr-ue</services>
|
||||
<nb_healthy>2</nb_healthy>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020021">
|
||||
<class>PingFromContainer</class>
|
||||
<desc>Test Connectivity (ping)</desc>
|
||||
<container_name>rfsim5g-oai-nr-ue</container_name>
|
||||
<options>-I oaitun_ue1 -c 20 12.1.1.1</options>
|
||||
<loss_threshold>0</loss_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100022">
|
||||
<class>UndeployGenObject</class>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<yaml_path>yaml_files/5g_rfsimulator_accelleran</yaml_path>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -0,0 +1,45 @@
|
||||
<!--
|
||||
|
||||
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.1 (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
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-down-f1-accelleran</htmlTabRef>
|
||||
<htmlTabName>CleanUp</htmlTabName>
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100022
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="100022">
|
||||
<class>UndeployGenObject</class>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<yaml_path>yaml_files/5g_rfsimulator_accelleran</yaml_path>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<test_svr_id>0</test_svr_id>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -69,8 +69,8 @@
|
||||
<class>Custom_Command</class>
|
||||
<desc>Reset USRP</desc>
|
||||
<node>nepes</node>
|
||||
<command>sudo -S b2xx_fx3_utils --reset-device</command>
|
||||
</testCase>
|
||||
<command>sudo -S /usr/lib/uhd/utils/b2xx_fx3_utils --reset-device</command>
|
||||
</testCase>
|
||||
|
||||
<testCase id="200000">
|
||||
<class>Custom_Command</class>
|
||||
|
||||
122
ci-scripts/xml_files/container_sa_aw2s_asue.xml
Normal file
122
ci-scripts/xml_files/container_sa_aw2s_asue.xml
Normal file
@@ -0,0 +1,122 @@
|
||||
<!--
|
||||
|
||||
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.1 (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
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>TEST-5G-AW2S</htmlTabRef>
|
||||
<htmlTabName>20 MHz TDD SA</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<repeatCount>1</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
010000
|
||||
001000
|
||||
020000
|
||||
002000
|
||||
002002
|
||||
000100
|
||||
000200
|
||||
003000
|
||||
004000
|
||||
000002
|
||||
030000
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="010000">
|
||||
<class>Pull_Cluster_Image</class>
|
||||
<desc>Pull Images from Cluster</desc>
|
||||
<images_to_pull>oai-gnb-aw2s</images_to_pull>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020000">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy gNB (TDD/Band78/20MHz/aw2s) in a container</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/sa_aw2s_gnb</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
</testCase>
|
||||
|
||||
<testCase id="001000">
|
||||
<class>Initialize_UE</class>
|
||||
<desc>Initialize Amarisoft UE</desc>
|
||||
<id>amarisoft_ue</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="002000">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach UE</desc>
|
||||
<id>amarisoft_ue_1</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="002002">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach UE</desc>
|
||||
<id>amarisoft_ue_2</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000100">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 20pings in 20sec</desc>
|
||||
<id>amarisoft_ue_1 amarisoft_ue_2</id>
|
||||
<ping_args>-c 20</ping_args>
|
||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000200">
|
||||
<class>Ping</class>
|
||||
<desc>Ping: 100pings in 20sec</desc>
|
||||
<id>amarisoft_ue_1 amarisoft_ue_2</id>
|
||||
<ping_args>-c 100 -i 0.2</ping_args>
|
||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||
</testCase>
|
||||
|
||||
<testCase id="003000">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach UE</desc>
|
||||
<id>amarisoft_ue_1 amarisoft_ue_2</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="004000">
|
||||
<class>Terminate_UE</class>
|
||||
<desc>Terminate UE</desc>
|
||||
<id>amarisoft_ue</id>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="030000">
|
||||
<class>Undeploy_Object</class>
|
||||
<desc>Undeploy gNB</desc>
|
||||
<yaml_path>ci-scripts/yaml_files/sa_aw2s_gnb</yaml_path>
|
||||
<eNB_instance>0</eNB_instance>
|
||||
<eNB_serverId>0</eNB_serverId>
|
||||
<d_retx_th>20,100,100,100</d_retx_th>
|
||||
<u_retx_th>20,100,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
version: '3.8'
|
||||
services:
|
||||
oai-du:
|
||||
image: oaisoftwarealliance/oai-gnb:develop
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-du
|
||||
network_mode: "host"
|
||||
environment:
|
||||
RFSIMULATOR: server
|
||||
USE_VOLUMED_CONF: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --sa --rfsim --MACRLCs.[0].local_n_address 172.21.16.109 --MACRLCs.[0].remote_n_address 172.21.6.22 --log_config.global_log_options level,nocolor,time
|
||||
volumes:
|
||||
- ../../conf_files/gnb-du.band78.106prb.rfsim.conf:/opt/oai-gnb/etc/mounted.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
oai-nr-ue:
|
||||
image: oaisoftwarealliance/oai-nr-ue:develop
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
network_mode: "host"
|
||||
environment:
|
||||
RFSIMULATOR: 127.0.0.1
|
||||
FULL_IMSI: '208990100001140'
|
||||
FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
|
||||
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||
DNN: oai
|
||||
NSSAI_SST: 1
|
||||
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 106 --numerology 1 -C 3619200000 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-du
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
18
ci-scripts/yaml_files/sa_aw2s_gnb/docker-compose.yml
Normal file
18
ci-scripts/yaml_files/sa_aw2s_gnb/docker-compose.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
version: '3.8'
|
||||
services:
|
||||
oai-gnb:
|
||||
image: oai-gnb-aw2s:latest
|
||||
privileged: true
|
||||
network_mode: "host"
|
||||
container_name: oai-gnb-aw2s
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
USE_VOLUMED_CONF: 'yes'
|
||||
USE_ADDITIONAL_OPTIONS: --sa
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf:/opt/oai-gnb-aw2s/etc/mounted.conf
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@@ -82,7 +82,7 @@ endif()
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel)
|
||||
|
||||
#
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat ")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops")
|
||||
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")
|
||||
|
||||
|
||||
@@ -147,6 +147,18 @@
|
||||
<nruns>3</nruns>
|
||||
</testCase>
|
||||
|
||||
<testCase id="nr_psbchsim.106rb">
|
||||
<desc>nr_psbchsim Test cases. (Test1: PSBCH and synchronization, 106PBR),
|
||||
(Test2: PSBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc>
|
||||
<main_exec>nr_psbchsim</main_exec>
|
||||
<main_exec_args>-s-11 -S2 -n1 -I -R106
|
||||
-s-11 -S2 -n1 -I -R106 -O6</main_exec_args>
|
||||
<tags>test1 test2 test3</tags>
|
||||
<search_expr_true>PSBCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
</testCase>
|
||||
|
||||
<testCase id="nr_dlsim.basic">
|
||||
<desc>nr_dlsim Test cases. (Test1: 106 PRB),
|
||||
(Test2: 217 PRB),
|
||||
@@ -289,11 +301,13 @@
|
||||
(Test10: Format 2 9-bit 2/106 PRB),
|
||||
(Test11: Format 2 10-bit 2/106 PRB),
|
||||
(Test12: Format 2 11-bit 2/106 PRB),
|
||||
(Test13: Format 2 12-bit 8/106 PRB),
|
||||
(Test14: Format 2 19-bit 8/106 PRB),
|
||||
(Test15: Format 2 32-bit 8/106 PRB),
|
||||
(Test16: Format 2 32-bit 16/106 PRB),
|
||||
(Test17: Format 2 64-bit 16/106 PRB)</desc>
|
||||
(Test13: Format 2 12-bit 4/106 PRB),
|
||||
(Test14: Format 2 19-bit 4/106 PRB),
|
||||
(Test15: Format 2 12-bit 8/106 PRB),
|
||||
(Test16: Format 2 19-bit 8/106 PRB),
|
||||
(Test17: Format 2 32-bit 8/106 PRB),
|
||||
(Test18: Format 2 32-bit 16/106 PRB),
|
||||
(Test19: Format 2 64-bit 16/106 PRB)</desc>
|
||||
<main_exec>nr_pucchsim</main_exec>
|
||||
<main_exec_args>-R 106 -i 1 -P 0 -b 1 -s-2 -n1000
|
||||
-R 106 -i 1 -P 0 -b 2 -s-2 -n1000
|
||||
@@ -307,12 +321,14 @@
|
||||
-R 106 -i 1 -P 2 -b 9 -s5 -n1000
|
||||
-R 106 -i 1 -P 2 -b 10 -s6 -n1000
|
||||
-R 106 -i 1 -P 2 -b 11 -s6 -n1000
|
||||
-R 106 -i 1 -P 2 -q4 -b 12 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q4 -b 19 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 12 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 19 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 32 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q16 -b 32 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17</tags>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19</tags>
|
||||
<search_expr_true>PUCCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -351,22 +367,24 @@
|
||||
</testCase>
|
||||
|
||||
<testCase id="nr_ulsim.misc">
|
||||
<desc>nr_ulsim Test cases. (Test1: MCS 9, 106 PRBs),
|
||||
(Test2: MCS 16, 50 PRBs),
|
||||
(Test3: MCS 28, 50 PRBs),
|
||||
(Test4: MCS 9, 217 PRBs),
|
||||
(Test5: MCS 9, 273 PRBs),
|
||||
(Test6: PUSCH Type A, 2 DMRS Symbols),
|
||||
(Test7: PUSCH Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
|
||||
(Test8: PUSCH Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
||||
(Test9: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
||||
(Test10: 25 PRBs, 15 kHz SCS),
|
||||
(Test11: MCS 0, low SNR performance)
|
||||
(Test12: MCS 28, 106 PRBs, Time shift 8)</desc>
|
||||
<desc>nr_ulsim Test cases. (Test1: MCS 9 106 PRBs),
|
||||
(Test2: MCS 16 50 PRBs),
|
||||
(Test3: MCS 28 50 PRBs),
|
||||
(Test4: MCS 27 50 PRBs 256QAM),
|
||||
(Test5: MCS 9 217 PRBs),
|
||||
(Test6: MCS 9 273 PRBs),
|
||||
(Test7: PUSCH Type A, 2 DMRS Symbols),
|
||||
(Test8: PUSCH Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
|
||||
(Test9: PUSCH Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
|
||||
(Test10: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
||||
(Test11: 25 PRBs, 15 kHz SCS),
|
||||
(Test12: MCS 0, low SNR performance)
|
||||
(Test13: MCS 28, 106 PRBs, Time shift 8)</desc>
|
||||
<main_exec>nr_ulsim</main_exec>
|
||||
<main_exec_args>-n100 -m9 -r106 -s5
|
||||
-n100 -m16 -s10
|
||||
-n100 -m28 -s20
|
||||
-n100 -m27 -s25 -q1
|
||||
-n100 -m9 -R217 -r217 -s5
|
||||
-n100 -m9 -R273 -r273 -s5
|
||||
-n100 -s5 -U 0,1,1,1
|
||||
@@ -376,7 +394,7 @@
|
||||
-n100 -u0 -m0 -R25 -r25 -i 1,0
|
||||
-n100 -m0 -S -0.6 -i 1,0
|
||||
-n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12</tags>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13</tags>
|
||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -443,7 +461,10 @@
|
||||
(Test22: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test),
|
||||
(Test23: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test),
|
||||
(Test24: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test),
|
||||
(Test25: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers)</desc>
|
||||
(Test25: 3GPP G-FR1-A3-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers),
|
||||
(Test26: 3GPP G-FR1-A3-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test, 2 layers),
|
||||
(Test27: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers),
|
||||
(Test28: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test, 2 layers)</desc>
|
||||
<main_exec>nr_ulsim</main_exec>
|
||||
<main_exec_args>-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z2 -s12.4 -S12.4
|
||||
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z4 -s8.5 -S8.5
|
||||
@@ -469,8 +490,11 @@
|
||||
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z2 -s13.1 -S13.1
|
||||
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z4 -s9.2 -S9.2
|
||||
-n100 -b14 -I8 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z8 -s5.9 -S5.9
|
||||
-n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s18.7 -S18.7</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24 test25</tags>
|
||||
-n100 -b14 -I15 -i 0,1 -g B,l -t70 -u 1 -m2 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s1.7 -S1.7
|
||||
-n100 -b14 -I15 -i 0,1 -g B,l -t70 -u 1 -m2 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z4 -s-2.1 -S-2.1
|
||||
-n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s18.7 -S18.7
|
||||
-n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z4 -s11.2 -S11.2</main_exec_args>
|
||||
<tags>test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24 test25 test26 test27 test28</tags>
|
||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
|
||||
@@ -508,7 +508,7 @@ function main() {
|
||||
[[ "$UE" == 1 ]] && execlist="$execlist lte-uesoftmodem"
|
||||
[[ "$nrUE" == 1 ]] && execlist="$execlist nr-uesoftmodem"
|
||||
# TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim
|
||||
[[ "$SIMUS_PHY" == "1" ]] && execlist="$execlist dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim"
|
||||
[[ "$SIMUS_PHY" == "1" ]] && execlist="$execlist dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_psbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim"
|
||||
[[ "$BUILD_OPTLIB" != "" ]] && execlist="$execlist $BUILD_OPTLIB"
|
||||
[[ "$execlist" != "" ]] && execlist="$execlist params_libconfig coding rfsimulator"
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ add_definitions(-std=gnu99)
|
||||
ENABLE_LANGUAGE(C)
|
||||
|
||||
set(CMAKE_C_FLAGS
|
||||
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -g")
|
||||
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -g")
|
||||
|
||||
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
|
||||
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
|
||||
|
||||
@@ -33,6 +33,7 @@ OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "
|
||||
case "$OS_DISTRO" in
|
||||
fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
rhel) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;;
|
||||
rocky) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
|
||||
centos) OS_BASEDISTRO="centos"; INSTALLER="yum"; CMAKE="cmake3" ;;
|
||||
debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
|
||||
ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;;
|
||||
@@ -126,6 +127,12 @@ check_supported_distribution() {
|
||||
"rhel9.3") return 0 ;;
|
||||
"centos7") return 0 ;;
|
||||
"centos8") return 0 ;;
|
||||
"rocky8.7") return 0 ;;
|
||||
"rocky8.8") return 0 ;;
|
||||
"rocky8.9") return 0 ;;
|
||||
"rocky9.1") return 0 ;;
|
||||
"rocky9.2") return 0 ;;
|
||||
"rocky9.3") return 0 ;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
@@ -300,7 +307,7 @@ install_usrp_uhd_driver_from_source(){
|
||||
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
|
||||
$SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py
|
||||
fi
|
||||
if [[ "$OS_DISTRO" == "rhel" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
$SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py
|
||||
fi
|
||||
fi
|
||||
@@ -367,7 +374,7 @@ check_install_usrp_uhd_driver(){
|
||||
$SUDO $INSTALLER -y install $boost_libs_fedora $CMAKE
|
||||
$SUDO pip3 install mako requests
|
||||
fi
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
if [ $IS_CONTAINER -eq 0 ]
|
||||
then
|
||||
# until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source
|
||||
@@ -389,13 +396,13 @@ install_usrp_uhd_driver() {
|
||||
# quick workaround for RHE7.6
|
||||
local distribution=$(get_distribution_release)
|
||||
if [ -z $1 ]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
$SUDO /usr/local/bin/uhd_images_downloader
|
||||
else
|
||||
$SUDO uhd_images_downloader
|
||||
fi
|
||||
else
|
||||
if [[ "$OS_DISTRO" == "rhel" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
$SUDO /usr/local/bin/uhd_images_downloader -i $1
|
||||
else
|
||||
$SUDO uhd_images_downloader -i $1
|
||||
@@ -562,7 +569,7 @@ check_install_additional_tools (){
|
||||
libforms-bin \
|
||||
libforms-dev \
|
||||
xmlstarlet"
|
||||
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
PACKAGE_LIST="\
|
||||
doxygen \
|
||||
ctags \
|
||||
@@ -623,7 +630,7 @@ check_install_oai_software() {
|
||||
xxd
|
||||
|
||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]] || [[ "$OS_DISTRO" == "rocky" ]]; then
|
||||
if rpm -q epel-release > /dev/null; then
|
||||
echo "EPEL repos already present. Good."
|
||||
else
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
#define RLC_TX_MAXSIZE 10000000
|
||||
#define RLC_RX_MAXSIZE 10000000
|
||||
#define SEND_MRW_ON 240
|
||||
|
||||
#define MAX_ANT 8
|
||||
// CBA constant
|
||||
#define NUM_MAX_CBA_GROUP 4
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "common/config/config_userapi.h"
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include "common/utils/LOG/log_extern.h"
|
||||
|
||||
// main log variables
|
||||
|
||||
@@ -66,32 +67,30 @@ char __log_mem_filename[1024]={0};
|
||||
char * log_mem_filename = &__log_mem_filename[0];
|
||||
char logmem_filename[1024] = {0};
|
||||
|
||||
mapping log_level_names[] = {
|
||||
{"error", OAILOG_ERR},
|
||||
{"warn", OAILOG_WARNING},
|
||||
{"analysis", OAILOG_ANALYSIS},
|
||||
{"info", OAILOG_INFO},
|
||||
{"debug", OAILOG_DEBUG},
|
||||
{"trace", OAILOG_TRACE},
|
||||
{NULL, -1}
|
||||
};
|
||||
const mapping log_level_names[] = {{"error", OAILOG_ERR},
|
||||
{"warn", OAILOG_WARNING},
|
||||
{"analysis", OAILOG_ANALYSIS},
|
||||
{"info", OAILOG_INFO},
|
||||
{"debug", OAILOG_DEBUG},
|
||||
{"trace", OAILOG_TRACE},
|
||||
{NULL, -1}};
|
||||
|
||||
mapping log_options[] = {
|
||||
{"nocolor", FLAG_NOCOLOR },
|
||||
{"level", FLAG_LEVEL },
|
||||
{"thread", FLAG_THREAD },
|
||||
{"line_num", FLAG_FILE_LINE },
|
||||
{"function", FLAG_FUNCT},
|
||||
{"time", FLAG_TIME},
|
||||
{"thread_id", FLAG_THREAD_ID},
|
||||
{"wall_clock", FLAG_REAL_TIME},
|
||||
{NULL,-1}
|
||||
};
|
||||
const mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
|
||||
{"level", FLAG_LEVEL},
|
||||
{"thread", FLAG_THREAD},
|
||||
{"line_num", FLAG_FILE_LINE},
|
||||
{"function", FLAG_FUNCT},
|
||||
{"time", FLAG_TIME},
|
||||
{"thread_id", FLAG_THREAD_ID},
|
||||
{"wall_clock", FLAG_REAL_TIME},
|
||||
{NULL, -1}};
|
||||
|
||||
mapping log_maskmap[] = LOG_MASKMAP_INIT;
|
||||
|
||||
char *log_level_highlight_start[] = {LOG_RED, LOG_ORANGE, LOG_GREEN, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */
|
||||
char *log_level_highlight_end[] = {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
|
||||
static const char *log_level_highlight_start[] =
|
||||
{LOG_RED, LOG_ORANGE, LOG_GREEN, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */
|
||||
static const char *log_level_highlight_end[] =
|
||||
{LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
|
||||
static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args);
|
||||
|
||||
|
||||
@@ -754,8 +753,7 @@ void close_component_filelog(int comp)
|
||||
* with string value NULL
|
||||
*/
|
||||
/* map a string to an int. Takes a mapping array and a string as arg */
|
||||
int map_str_to_int(mapping *map,
|
||||
const char *str)
|
||||
int map_str_to_int(const mapping *map, const char *str)
|
||||
{
|
||||
while (1) {
|
||||
if (map->name == NULL) {
|
||||
@@ -771,8 +769,7 @@ int map_str_to_int(mapping *map,
|
||||
}
|
||||
|
||||
/* map an int to a string. Takes a mapping array and a value */
|
||||
char *map_int_to_str(mapping *map,
|
||||
int val)
|
||||
char *map_int_to_str(const mapping *map, const int val)
|
||||
{
|
||||
while (1) {
|
||||
if (map->name == NULL) {
|
||||
|
||||
@@ -315,8 +315,8 @@ void set_glog_filelog(int enable);
|
||||
void set_component_filelog(int comp);
|
||||
void close_component_filelog(int comp);
|
||||
void set_component_consolelog(int comp);
|
||||
int map_str_to_int(mapping *map, const char *str);
|
||||
char *map_int_to_str(mapping *map, int val);
|
||||
int map_str_to_int(const mapping *map, const char *str);
|
||||
char *map_int_to_str(const mapping *map, const int val);
|
||||
void logClean (void);
|
||||
int is_newline( char *str, int size);
|
||||
|
||||
|
||||
@@ -23,9 +23,8 @@
|
||||
|
||||
extern log_t *g_log;
|
||||
|
||||
|
||||
extern mapping log_level_names[];
|
||||
extern mapping log_options[];
|
||||
extern const mapping log_level_names[];
|
||||
extern const mapping log_options[];
|
||||
extern mapping log_maskmap[];
|
||||
extern int log_mem_flag;
|
||||
extern char * log_mem_filename;
|
||||
|
||||
@@ -36,21 +36,21 @@
|
||||
|
||||
const char *duplex_mode[]={"FDD","TDD"};
|
||||
|
||||
int tables_5_3_2[5][11] = {
|
||||
{25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 273}, // 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 135}, // 60 FR1
|
||||
{66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
int tables_5_3_2[5][12] = {
|
||||
{25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1, -1}, // 15 FR1
|
||||
{11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 245, 273},// 30 FR1
|
||||
{-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 121, 135}, // 60 FR1
|
||||
{66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
|
||||
{32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2
|
||||
};
|
||||
|
||||
int get_supported_band_index(int scs, int band, int n_rbs){
|
||||
|
||||
int get_supported_band_index(int scs, int band, int n_rbs)
|
||||
{
|
||||
int scs_index = scs;
|
||||
if (band>256)
|
||||
if (band > 256)
|
||||
scs_index++;
|
||||
for (int i=0; i<11; i++) {
|
||||
if(n_rbs == tables_5_3_2[scs][i])
|
||||
for (int i = 0; i < 12; i++) {
|
||||
if(n_rbs == tables_5_3_2[scs_index][i])
|
||||
return i;
|
||||
}
|
||||
return (-1); // not found
|
||||
@@ -130,6 +130,66 @@ const nr_bandentry_t nr_bandtable[] = {
|
||||
{261,27500040,28350000,27500040,28350000, 2,2070833, 120}
|
||||
};
|
||||
|
||||
int get_supported_bw_mhz(frequency_range_t frequency_range, int bw_index)
|
||||
{
|
||||
if (frequency_range == FR1) {
|
||||
switch (bw_index) {
|
||||
case 0 :
|
||||
return 5; // 5MHz
|
||||
case 1 :
|
||||
return 10;
|
||||
case 2 :
|
||||
return 15;
|
||||
case 3 :
|
||||
return 20;
|
||||
case 4 :
|
||||
return 25;
|
||||
case 5 :
|
||||
return 30;
|
||||
case 6 :
|
||||
return 40;
|
||||
case 7 :
|
||||
return 50;
|
||||
case 8 :
|
||||
return 60;
|
||||
case 9 :
|
||||
return 80;
|
||||
case 10 :
|
||||
return 90;
|
||||
case 11 :
|
||||
return 100;
|
||||
default :
|
||||
AssertFatal(false, "Invalid band index for FR1 %d\n", bw_index);
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch (bw_index) {
|
||||
case 0 :
|
||||
return 50; // 50MHz
|
||||
case 1 :
|
||||
return 100;
|
||||
case 2 :
|
||||
return 200;
|
||||
case 3 :
|
||||
return 400;
|
||||
default :
|
||||
AssertFatal(false, "Invalid band index for FR2 %d\n", bw_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_t frame_type)
|
||||
{
|
||||
// 38.101-1 section 6.2.2
|
||||
// Relative channel bandwidth <= 4% for TDD bands and <= 3% for FDD bands
|
||||
int index = get_nr_table_idx(nr_band, scs);
|
||||
int bw_index = get_supported_band_index(scs, nr_band, nb_ul);
|
||||
int band_size_khz = get_supported_bw_mhz(nr_band > 256 ? FR2 : FR1, bw_index) * 1000;
|
||||
float limit = frame_type == TDD ? 0.04 : 0.03;
|
||||
float rel_bw = (float) (2 * band_size_khz) / (float) (nr_bandtable[index].ul_max + nr_bandtable[index].ul_min);
|
||||
return rel_bw <= limit;
|
||||
}
|
||||
|
||||
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
|
||||
{
|
||||
const int64_t dl_freq_khz = downlink_frequency / 1000;
|
||||
@@ -322,118 +382,6 @@ int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index)
|
||||
return delta_duplex;
|
||||
}
|
||||
|
||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band)
|
||||
{
|
||||
|
||||
if (nr_band < 100) { //FR1
|
||||
switch(mu) {
|
||||
case 0 :
|
||||
if (nb_rb<=25)
|
||||
return 5;
|
||||
if (nb_rb<=52)
|
||||
return 10;
|
||||
if (nb_rb<=79)
|
||||
return 15;
|
||||
if (nb_rb<=106)
|
||||
return 20;
|
||||
if (nb_rb<=133)
|
||||
return 25;
|
||||
if (nb_rb<=160)
|
||||
return 30;
|
||||
if (nb_rb<=216)
|
||||
return 40;
|
||||
if (nb_rb<=270)
|
||||
return 50;
|
||||
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||
break;
|
||||
case 1 :
|
||||
if (nb_rb<=11)
|
||||
return 5;
|
||||
if (nb_rb<=24)
|
||||
return 10;
|
||||
if (nb_rb<=38)
|
||||
return 15;
|
||||
if (nb_rb<=51)
|
||||
return 20;
|
||||
if (nb_rb<=65)
|
||||
return 25;
|
||||
if (nb_rb<=78)
|
||||
return 30;
|
||||
if (nb_rb<=106)
|
||||
return 40;
|
||||
if (nb_rb<=133)
|
||||
return 50;
|
||||
if (nb_rb<=162)
|
||||
return 60;
|
||||
if (nb_rb<=189)
|
||||
return 70;
|
||||
if (nb_rb<=217)
|
||||
return 80;
|
||||
if (nb_rb<=245)
|
||||
return 90;
|
||||
if (nb_rb<=273)
|
||||
return 100;
|
||||
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||
break;
|
||||
case 2 :
|
||||
if (nb_rb<=11)
|
||||
return 10;
|
||||
if (nb_rb<=18)
|
||||
return 15;
|
||||
if (nb_rb<=24)
|
||||
return 20;
|
||||
if (nb_rb<=31)
|
||||
return 25;
|
||||
if (nb_rb<=38)
|
||||
return 30;
|
||||
if (nb_rb<=51)
|
||||
return 40;
|
||||
if (nb_rb<=65)
|
||||
return 50;
|
||||
if (nb_rb<=79)
|
||||
return 60;
|
||||
if (nb_rb<=93)
|
||||
return 70;
|
||||
if (nb_rb<=107)
|
||||
return 80;
|
||||
if (nb_rb<=121)
|
||||
return 90;
|
||||
if (nb_rb<=135)
|
||||
return 100;
|
||||
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band);
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch(mu) {
|
||||
case 2 :
|
||||
if (nb_rb<=66)
|
||||
return 50;
|
||||
if (nb_rb<=132)
|
||||
return 100;
|
||||
if (nb_rb<=264)
|
||||
return 200;
|
||||
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||
break;
|
||||
case 3 :
|
||||
if (nb_rb<=32)
|
||||
return 50;
|
||||
if (nb_rb<=66)
|
||||
return 100;
|
||||
if (nb_rb<=132)
|
||||
return 200;
|
||||
if (nb_rb<=264)
|
||||
return 400;
|
||||
AssertFatal(1==0,"Number of DL resource blocks %d undefined for mu %d and band %d\n", nb_rb, mu, nr_band);
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Numerology %d undefined for band %d in FR1\n", mu,nr_band);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the corresponding row index of the NR table
|
||||
int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
|
||||
int scs_khz = 15 << scs_index;
|
||||
@@ -758,3 +706,27 @@ void SLIV2SL(int SLIV,int *S,int *L) {
|
||||
}
|
||||
}
|
||||
|
||||
int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA)
|
||||
{
|
||||
uint32_t absolute_diff = (absoluteFrequencySSB - absoluteFrequencyPointA);
|
||||
const int scaling_5khz = absoluteFrequencyPointA < 600000 ? 3 : 1;
|
||||
return ((absolute_diff / scaling_5khz) % 24);
|
||||
}
|
||||
|
||||
uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
|
||||
uint32_t absoluteFrequencyPointA,
|
||||
int ssbSubcarrierSpacing,
|
||||
int frequency_range)
|
||||
{
|
||||
uint32_t absolute_diff = (absoluteFrequencySSB - absoluteFrequencyPointA);
|
||||
const int scaling_5khz = absoluteFrequencyPointA < 600000 ? 3 : 1;
|
||||
int sco = get_ssb_subcarrier_offset(absoluteFrequencySSB, absoluteFrequencyPointA);
|
||||
const int scs_scaling = frequency_range == FR2 ? 1 << (ssbSubcarrierSpacing - 2) : 1 << ssbSubcarrierSpacing;
|
||||
const int scaled_abs_diff = absolute_diff / scaling_5khz;
|
||||
const int ssb_offset_point_a =
|
||||
(scaled_abs_diff - sco) / 12
|
||||
- 10 * scs_scaling; // absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
|
||||
AssertFatal(ssb_offset_point_a % scs_scaling == 0, "PRB offset %d can create frequency offset\n", ssb_offset_point_a);
|
||||
AssertFatal(sco % scs_scaling == 0, "ssb offset %d can create frequency offset\n", sco);
|
||||
return ssb_offset_point_a;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,6 @@ int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUp
|
||||
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
|
||||
int get_SLIV(uint8_t S, uint8_t L);
|
||||
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
||||
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
|
||||
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
|
||||
frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
|
||||
@@ -93,6 +92,8 @@ int get_nb_periods_per_frame(uint8_t tdd_period);
|
||||
int get_supported_band_index(int scs, int band, int n_rbs);
|
||||
long rrc_get_max_nr_csrs(const int max_rbs, long b_SRS);
|
||||
void get_K1_K2(int N1, int N2, int *K1, int *K2);
|
||||
bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_t frame_type);
|
||||
int get_supported_bw_mhz(frequency_range_t frequency_range, int bw_index);
|
||||
void get_samplerate_and_bw(int mu,
|
||||
int n_rb,
|
||||
int8_t threequarter_fs,
|
||||
@@ -100,7 +101,11 @@ void get_samplerate_and_bw(int mu,
|
||||
unsigned int *samples_per_frame,
|
||||
double *tx_bw,
|
||||
double *rx_bw);
|
||||
|
||||
uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
|
||||
uint32_t absoluteFrequencyPointA,
|
||||
int ssbSubcarrierSpacing,
|
||||
int frequency_range);
|
||||
int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA);
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
|
||||
@@ -64,6 +64,9 @@ typedef struct itti_lte_time_s {
|
||||
|
||||
|
||||
typedef struct IttiMsgEmpty_s {
|
||||
// This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++
|
||||
// To be removed if the structure is filled
|
||||
uint32_t dummy;
|
||||
} IttiMsgEmpty;
|
||||
|
||||
typedef struct IttiMsgText_s {
|
||||
|
||||
@@ -96,10 +96,7 @@ void measurcmd_display_phyta(telnet_printfunc_t prnt)
|
||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
|
||||
prnt("%s PHY TA stats\n", HDR);
|
||||
prnt("N_TA_offset %d\n", UE->N_TA_offset);
|
||||
for (int i = 0; i < UE->n_connected_gNB; ++i) {
|
||||
NR_UL_TIME_ALIGNMENT_t *ta = &UE->ul_time_alignment[i];
|
||||
prnt("gNB %d TA command %d TA total %d TAG ID %d\n", i, ta->ta_command, ta->ta_total, ta->tag_id);
|
||||
}
|
||||
prnt("TA command %d\n", UE->ta_command);
|
||||
prnt("timing_advance %d (samples)\n", UE->timing_advance);
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -153,15 +153,17 @@ static inline void start_meas(time_stats_t *ts) {
|
||||
static inline void stop_meas(time_stats_t *ts) {
|
||||
if (opp_enabled) {
|
||||
long long out = rdtsc_oai();
|
||||
ts->diff += (out-ts->in);
|
||||
/// process duration is the difference between two clock points
|
||||
ts->p_time = (out-ts->in);
|
||||
ts->diff_square += ((double)out-ts->in)*((double)out-ts->in);
|
||||
if (ts->in) {
|
||||
ts->diff += (out - ts->in);
|
||||
/// process duration is the difference between two clock points
|
||||
ts->p_time = (out - ts->in);
|
||||
ts->diff_square += ((double)out - ts->in) * ((double)out - ts->in);
|
||||
|
||||
if ((out-ts->in) > ts->max)
|
||||
ts->max = out-ts->in;
|
||||
if ((out - ts->in) > ts->max)
|
||||
ts->max = out - ts->in;
|
||||
|
||||
ts->meas_flag=0;
|
||||
ts->meas_flag = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ The main oai binaries, which are tested by the Continuous Integration process ar
|
||||
- The 5G gNodeB: `nr-softmodem`
|
||||
- The 5G CU-UP: `nr-cuup`
|
||||
- The LTE PHY simulators: `dlsim` and `ulsim`
|
||||
- The 5G PHY simulators: `nr_dlschsim`, `nr_dlsim`, `nr_pbchsim`, `nr_pucchsim`, `nr_ulschsim`, `nr_ulsim`, `polartest`, `smallblocktest`, `nr _ulsim`, `ldpctest`
|
||||
- The 5G PHY simulators: `nr_dlschsim`, `nr_dlsim`, `nr_pbchsim`, `nr_psbchsim`, `nr_pucchsim`, `nr_ulschsim`, `nr_ulsim`, `polartest`, `smallblocktest`, `nr _ulsim`, `ldpctest`
|
||||
|
||||
Running the [build_oai](../cmake_targets/build_oai) script also generates some utilities required to build and/or run the oai softmodem binaries:
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
# 1. Introduction
|
||||
|
||||
We use OpenAirInterface source code, and it's regular deployment scheme.
|
||||
@@ -208,3 +209,46 @@ DU rlc north output goes to du_pdcp_data_ind() that push a outgoing packet reque
|
||||
CU pdcp south output calls cu_rlc_data_ind() that do the same symetric processing.
|
||||
|
||||
|
||||
# High-level F1-C code structure
|
||||
|
||||
The F1 interface is used internally between CU (mostly RRC) and DU (mostly MAC)
|
||||
to exchange information. In DL, the CU sends messages as defined by the
|
||||
callbacks in `mac_rrc_dl.h`, whose implementation is defined in files
|
||||
`mac_rrc_dl_direct.c` (monolithic) and `mac_rrc_dl_f1ap.c` (for F1AP). In the
|
||||
monolithic case, the RRC calls directly into the message handler on the DU side
|
||||
(`mac_rrc_dl_handler.c`). In the F1 case, an ITTI message is sent to the CU
|
||||
task, sending an ASN.1-encoded F1AP message. The DU side's DU task decodes the
|
||||
message, and then calls the corresponding handler in `mac_rrc_dl_handler.c`.
|
||||
Thus, the message flow is the same in both F1 and monolithic cases, with the
|
||||
difference that F1AP encodes the messages using ASN.1 and sends over a socket.
|
||||
|
||||
In UL, the callbacks defined in `mac_rrc_ul.h` are implemented by
|
||||
`mac_rrc_ul_direct.c` (monolithic) and `mac_rrc_ul_f1ap.c` (F1). In the direct
|
||||
case, an ITTI message is directly sent to the RRC task (hence, there is no
|
||||
dedicated handler). In F1, the DU task receives the ITTI message, encodes using
|
||||
ASN.1, and sends it over a network socket. The CU task decodes, and sends the
|
||||
same ITTI message to the RRC task as done directly in the monolithic case.
|
||||
|
||||
```
|
||||
+-------------+
|
||||
| |
|
||||
| CU/RRC |
|
||||
| |
|
||||
+-------------+
|
||||
| ^
|
||||
Callback def: mac_rrc_dl.h | | No handler needed:
|
||||
F1 impl: mac_rrc_dl_f1ap.c | | RRC has ITTI
|
||||
Monolithic: mac_rrc_dl_direct.c | |
|
||||
| |
|
||||
DL | | UL
|
||||
| |
|
||||
| | Callback def: mac_rrc_ul.h
|
||||
Message handler: | | F1 impl: mac_rrc_ul_f1ap.c
|
||||
mac_rrc_dl_handler.c | | Monolithic: mac_rrc_ul_direct.c
|
||||
v |
|
||||
+-------------+
|
||||
| |
|
||||
| DU/MAC |
|
||||
| |
|
||||
+-------------+
|
||||
```
|
||||
|
||||
@@ -259,6 +259,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
||||
- PTRS support
|
||||
- Support for 1, 2 and 4 TX antennas
|
||||
- Support for up to 2 layers (currently limited to DMRS configuration type 2)
|
||||
- Support for 256 QAM
|
||||
* NR-CSIRS Generation of sequence at PHY
|
||||
* NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc).
|
||||
- PUSCH mapping type A and B
|
||||
@@ -267,6 +268,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
||||
- PTRS support
|
||||
- Support for up to 2 RX antenna
|
||||
- Support for up to 2 layers
|
||||
- Support for 256 QAM
|
||||
* NR-PUCCH
|
||||
- Format 0 (2 bits, for ACK/NACK and SR)
|
||||
- Format 2 (up to 11 bits, mainly for CSI feedback)
|
||||
|
||||
@@ -88,12 +88,13 @@ Some directories under `radio` contain READMEs:
|
||||
- [RFsimulator](../radio/rfsimulator/README.md)
|
||||
- [USRP](../radio/USRP/README.md)
|
||||
- [BladeRF](../radio/BLADERF/README)
|
||||
- [IQPlayer](../radio/iqplayer/DOC/iqrecordplayer_usage.md)
|
||||
- [IQPlayer](../radio/iqplayer/DOC/iqrecordplayer_usage.md), and [general documentation](./iqrecordplayer_usage.md)
|
||||
|
||||
The other SDRs (AW2S, LimeSDR, ...) have no READMEs.
|
||||
|
||||
## Special-purpose libraries
|
||||
|
||||
- OAI has two scopes, one based on Xforms, one on Qt5, described in [this README](../openair1/PHY/TOOLS/readme.md)
|
||||
- OAI comes with an integrated [telnet server](../common/utils/telnetsrv/DOC/telnethelp.md) to monitor and control
|
||||
- OAI comes with an integrated [web server](../common/utils/websrv/DOC/websrv.md)
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ In our case the output is 0 and hence we use `numactl --cpunodebind=0 --membind=
|
||||
## FR1 test
|
||||
Open a terminal on the host machine, and execute below command to launch gNB with **X310 USRPs**
|
||||
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
|
||||
```sudo numactl --cpunodebind=0 --membind=0 ./nr-softmodem -E -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb0.sa.band78.fr1.106PRB.prs.usrpx310.conf --phy-test```
|
||||
|
||||
If **N310 USRPs** are used, then run above command `without -E option` i.e without 3/4 sampling rate.<br><br>
|
||||
|
||||
@@ -187,4 +187,4 @@ This script will read the IQ data from extracted PRS dumps(chF_gnbX_Y.raw and ch
|
||||
<figcaption align = "center"><b>Fig.1 - FR2 100MHz test</b></figcaption>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</table>
|
||||
|
||||
@@ -340,8 +340,6 @@ At Rx side, pdcp_data_ind() is the entry point that receives the data from RLC.
|
||||
|
||||
nr_pdcp_config_set_security(): sets the keys for AS security of a UE
|
||||
|
||||
nr_DRB_preconfiguration(): the mac layer calls this for configuration in phy-test/do-ra mode
|
||||
|
||||
nr_pdcp_add_srbs() adds UE SRBs in pdcp, nr_pdcp_remove_UE() removes it
|
||||
nr_pdcp_add_drbs() adds UE DRBs in pdcp, nr_pdcp_remove_UE() removes it
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
| starsky | 172.21.18.45 | CI-Starsky-Legacy-TDD-eNB | eNB (B40) | b200mini (30A3E3C) |
|
||||
| carabe | 172.21.18.47 | CI-Carabe-Legacy-FDD-OAI-LTE-UE | UE (B7UE) | B200mini (30AE8C9) |
|
||||
| nokiabox | 172.21.19.39 | _None_ | gNB (Nokia), 5GC | _Nokia RF integrated_ |
|
||||
| avra | 172.21.16.124 | CI-Avra-Usage | gNB (n78) | AW2S Jaguar (192.168.80.239) |
|
||||
|
||||
Note: The available resources, and their current usage, is indicated here:
|
||||
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
|
||||
@@ -54,10 +55,11 @@ Note: The available resources, and their current usage, is indicated here:
|
||||
|
||||
### 5G AW2S Testbench
|
||||
|
||||
**Purpose**: AW2S tests with Amarisoft
|
||||
**Purpose**: AW2S tests with Amarisoft UE simulator
|
||||
|
||||
Picture: TBD
|
||||

|
||||
|
||||
[PDF version](testbenches_doc_resources/5g-aw2s-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-aw2s-bench.tex) if you want to modify to reflect your setup
|
||||
|
||||
### 4G Testbench(es)
|
||||
|
||||
@@ -67,7 +69,6 @@ Picture: TBD
|
||||
|
||||
[PDF version](testbenches_doc_resources/4g-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/4g-faraday-bench.tex) if you want to modify to reflect your setup
|
||||
|
||||
|
||||
## Pipelines
|
||||
|
||||
### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/)
|
||||
@@ -81,7 +82,10 @@ Webhook
|
||||
- [RAN-gNB-N300-Timing-Phytest-LDPC](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-gNB-N300-Timing-Phytest-LDPC/)
|
||||
- caracal + N310
|
||||
- pure performance test through phy-test scheduler, see command line for more details
|
||||
- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-4G/)
|
||||
- [RAN-Interop-F1](https://jenkins-oai.eurecom.fr/job/RAN-Interop-F1/)
|
||||
- ofqot (DU, 1x UE)
|
||||
- F1 interoperability testing: sets up connection to Accelleran CU, UE connection and connectivity test
|
||||
- [RAN-L2-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-4G/)
|
||||
- obelix (eNB, 1x UE, OAI EPC)
|
||||
- L2simulator: skips physical layer and uses proxy between eNB and UE
|
||||
- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-5G/)
|
||||
@@ -91,7 +95,7 @@ Webhook
|
||||
- hutch + B210, nano w/ ltebox + 2x UE
|
||||
- tests RRC inactivity timers, different bandwidths
|
||||
- [RAN-LTE-TDD-2x2-Container](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-LTE-TDD-2x2-Container/)
|
||||
- obelix + N310, porcepix, quectel
|
||||
- obelix + N310, porcepix, nrmodule2 + Quectel
|
||||
- TM1 and TM2 test
|
||||
- [RAN-LTE-TDD-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-LTE-TDD-LTEBOX-Container/)
|
||||
- starsky + B210, nano w/ ltebox + 2x UE
|
||||
@@ -110,10 +114,14 @@ Webhook
|
||||
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
|
||||
- [RAN-RHEL8-Cluster-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Cluster-Image-Builder/)
|
||||
- cluster (`Asterix-OC-oaicicd-session` resource): RHEL 8 image build using the OpenShift Cluster
|
||||
- [RAN-SA-AW2S-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-AW2S-CN5G/)
|
||||
- 5G-NR SA test setup: avra(RHEL9.1) + AW2S, amariue, OAI CN5G
|
||||
- uses OpenShift cluster for CN deployment and container images for gNB deployment
|
||||
- multi UE testing
|
||||
- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/)
|
||||
- ofqot + B200, idefix + Quectel, nepes w/ sabox
|
||||
- basic SA test (20 MHz TDD), F1, reestablishment, ...
|
||||
- [RAN-Ubuntu20-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
||||
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
||||
- obelix: Ubuntu 20 image build using docker (Note: builds U20 images while pipeline is named U18!)
|
||||
|
||||
### RAN-CI-NSA-Trigger
|
||||
|
||||
66
doc/iqrecordplayer_usage.md
Normal file
66
doc/iqrecordplayer_usage.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# I/Q record-replay
|
||||
## using the iq record-replay
|
||||
|
||||
This feature provides I/Q record-replay as initially presented in the 4th OAI workshop for LTE
|
||||
(https://www.openairinterface.org/docs/workshop/4_OAI_Workshop_20171107/Talks/MONGAZON_Nokia-Bell-Labs-OAI-IQ.pdf)
|
||||
The current implementation has been temporarily disrupted for LTE and only works for 5G SA
|
||||
nr-uesoftmodem executable.
|
||||
|
||||
The I/Q record-replay feature is briefly described hereafter, it allows you to:
|
||||
* record slots received by the USRP board in a file while the system is operating.
|
||||
For example you can record a full nrUE connection/traffic/disconnection sequence.
|
||||
Today the OAI USRP device is the only one supporting the recording feature.
|
||||
* replay slots from a previously recorded file to operate the system,
|
||||
possibly in multiple loops if the recorded sequence is convenient from the logical point of view.
|
||||
|
||||
The record-replay features are activated and configured using OAI configuration parameters
|
||||
|
||||
### Record mode
|
||||
options for record mode are:
|
||||
* `subframes-record` Activate record mode
|
||||
* `subframes-file` Path of the file used for slots recording (default is `/tmp/iqfile`)
|
||||
* `subframes-max` Maximum count of slots to be recorded in a file (default is 120000)
|
||||
|
||||
Note that the value of `--subframes-max` parameter needs to be tuned according to your RAM capabilities.
|
||||
The default value is 120000, which allows for 120 seconds of record-replay but will require ~20GB of RAM and disk space.
|
||||
If RAM does not allow for the parameter value, an error message will be displayed and the run will be aborted.
|
||||
In record mode, to minimize performance impacts of operating software, slots are always saved into memory and
|
||||
written to disk when the process terminates.
|
||||
When you estimate the recorded sequence is achieved, you can terminate the nr-uesoftmodem by typing `CTRL-C`.
|
||||
At that time, up to the value of `--subframes-max` slots will be written on disk.
|
||||
The nr-uesoftmodem will indicate the exact count of slots written to disk, which may be less (but not higher)
|
||||
than the value of `--subframes-max` parameter.
|
||||
|
||||
>Recording session example:
|
||||
```bash
|
||||
./nr-uesoftmodem -O /home/oaitests/mediatek_sim.conf --sa --nokrnmod 1 --numerology 1 -r 106 -C 3649440000 --band 78 -E --ue-fo-compensation --device.recplay.subframes-record 1 --device.recplay.subframes-file /home/iqs/oai-nrUE-17042023.dat --device.recplay.use-mmap 1 --device.recplay.subframes-max 30000
|
||||
............................................
|
||||
............................................
|
||||
............................................
|
||||
^C
|
||||
[HW] Writing file header to /home/iqs/oai-nrUE-17042023.dat
|
||||
[HW] Writing 4565 subframes to /home/iqs/oai-nrUE-17042023.dat
|
||||
[HW] File /home/iqs/oai-nrUE-17042023.dat closed
|
||||
[HW] releasing USRP
|
||||
|
||||
### Replay mode
|
||||
Replaying I/Q works only for nr-uesoftmodem at 40MHz bandwidth 3/4 sampling.
|
||||
Mismatch between file content and run time parameters might lead to unpredictable results.
|
||||
options for replay mode are:
|
||||
* `subframes-replay` Activate replay mode
|
||||
* `subframes-file` Path of the file used for slots replay (default is `/tmp/iqfile`)
|
||||
* `subframes-loops` Number of iterations to replay the entire slots file (default is 5)
|
||||
* `use-mmap` Boolean, set to 1 (true) by default, iq file is map to memory if true, otherwise iq's are read from file.
|
||||
|
||||
>Replay mode session example:
|
||||
```bash
|
||||
./nr-uesoftmodem -O /home/oaitests/mediatek_sim.conf --sa --nokrnmod 1 --numerology 1 -r 106 -C 3649440000 --band 78 -E --ue-fo-compensation --device.recplay.subframes-replay 1 --device.recplay.subframes-file /home/iqs/oai-nrUE-17042023.dat --device.recplay.use-mmap 1 --device.recplay.subframes-loops 1
|
||||
..................................
|
||||
..................................
|
||||
[HW] Replay iqs from USRP B200 device, bandwidth 4.000000e+07
|
||||
[HW] Loaded 4565 subframes.
|
||||
[HW] iqplayer device initialized, replay /home/iqs/oai-nrUE-17042023.dat for 1 iteration(s)
|
||||
..................................
|
||||
..................................
|
||||
|
||||
[OAI Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
||||
BIN
doc/testbenches_doc_resources/5g-aw2s-bench.pdf
Normal file
BIN
doc/testbenches_doc_resources/5g-aw2s-bench.pdf
Normal file
Binary file not shown.
BIN
doc/testbenches_doc_resources/5g-aw2s-bench.png
Normal file
BIN
doc/testbenches_doc_resources/5g-aw2s-bench.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
34
doc/testbenches_doc_resources/5g-aw2s-bench.tex
Normal file
34
doc/testbenches_doc_resources/5g-aw2s-bench.tex
Normal file
@@ -0,0 +1,34 @@
|
||||
\documentclass{standalone}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{backgrounds, positioning, shapes.symbols}
|
||||
\usepackage{helvet}
|
||||
\renewcommand*{\rmdefault}{\sfdefault}
|
||||
|
||||
\begin{document}
|
||||
\begin{tikzpicture}
|
||||
[
|
||||
font=\footnotesize,
|
||||
faraday/.style={minimum size=3cm, draw, dashed},
|
||||
duplexer/.style={draw,fill=white},
|
||||
]
|
||||
|
||||
\node[label=above:avra] (avra)
|
||||
{\includegraphics[width=1.2cm]{server}};
|
||||
\node[right=0.5cm of avra, label=above:AW2S] (aw2s)
|
||||
{\includegraphics[width=1.2cm]{aw2s}} edge (avra);
|
||||
\node[right=.2cm of aw2s, duplexer] (b78o) {n78} edge (aw2s);
|
||||
\node[above right=-0.7cm and 0.35cm of b78o.east] (anto1)
|
||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||
\node[below right=-0.7cm and 0.35cm of b78o.east] (anto2)
|
||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||
|
||||
\node[right=3.5cm of aw2s, label=above:amariue] (amariue)
|
||||
{\includegraphics[width=0.7cm]{amariue}};
|
||||
\node[right=0.8cm of anto1] (anto3)
|
||||
{\includegraphics[width=0.3cm]{antenna}} edge (amariue);
|
||||
\node[right=0.8cm of anto2] (anto4)
|
||||
{\includegraphics[width=0.3cm]{antenna}} edge (amariue);
|
||||
|
||||
\end{tikzpicture}
|
||||
\end{document}
|
||||
BIN
doc/testbenches_doc_resources/amariue.png
Normal file
BIN
doc/testbenches_doc_resources/amariue.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 134 KiB |
BIN
doc/testbenches_doc_resources/aw2s.png
Normal file
BIN
doc/testbenches_doc_resources/aw2s.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
58
docker/Dockerfile.base.rocky
Normal file
58
docker/Dockerfile.base.rocky
Normal file
@@ -0,0 +1,58 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM $BASE_IMAGE AS ran-base
|
||||
|
||||
ENV TZ=Europe/Paris
|
||||
ENV BUILD_UHD_FROM_SOURCE=True
|
||||
ENV UHD_VERSION=4.4.0.0
|
||||
|
||||
RUN dnf install 'dnf-command(config-manager)' -y && \
|
||||
dnf config-manager --set-enabled powertools && \
|
||||
dnf install epel-release -y && crb enable && \
|
||||
dnf update -y && \
|
||||
dnf install -y \
|
||||
#gcc needed for build_oai
|
||||
gcc gcc-c++ \
|
||||
diffutils \
|
||||
file \
|
||||
psmisc \
|
||||
git \
|
||||
# python3-pip and pyyaml are used for conf template generation
|
||||
python3-pip && \
|
||||
pip3 install --ignore-installed pyyaml
|
||||
|
||||
#create the WORKDIR
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
#run build_oai -I to get the builder image
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai -I --install-optional-packages -w USRP
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP --verbose-ci --noavx512 -c
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Wno-unused-function --cmake-opt -DCMAKE_CXX_FLAGS=-Wno-unused-function
|
||||
|
||||
38
docker/Dockerfile.build.rocky
Normal file
38
docker/Dockerfile.build.rocky
Normal file
@@ -0,0 +1,38 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
FROM ran-base:latest as ran-build
|
||||
|
||||
RUN rm -Rf /oai-ran
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
#run build_oai to build the target image
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope" -w USRP --verbose-ci --noavx512 -c
|
||||
@@ -35,4 +35,4 @@ COPY . .
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope nrqtscope" -w USRP --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror
|
||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib "telnetsrv enbscope uescope nrscope nrqtscope" -w USRP --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror --cmake-opt -DCMAKE_C_FLAGS=-Wno-unused-function --cmake-opt -DCMAKE_CXX_FLAGS=-Wno-unused-function
|
||||
|
||||
43
docker/Dockerfile.clang.rhel8.2
Normal file
43
docker/Dockerfile.clang.rhel8.2
Normal file
@@ -0,0 +1,43 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for RHEL8
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
FROM ran-base:latest AS oai-clang
|
||||
|
||||
RUN rm -Rf /oai-ran
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
#only install LLVM (clang, ...) for this container, the others don't need it
|
||||
RUN yum install -y llvm-toolset
|
||||
|
||||
#run build_oai to build the target image
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
export CC=/usr/bin/clang && \
|
||||
export CXX=/usr/bin/clang++ && \
|
||||
./build_oai --phy_simulators --gNB --eNB --nrUE --UE --ninja --verbose-ci --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror --cmake-opt -DCMAKE_C_FLAGS=-Wno-unused-function --cmake-opt -DCMAKE_CXX_FLAGS=-Wno-unused-function
|
||||
130
docker/Dockerfile.eNB.rocky
Normal file
130
docker/Dockerfile.eNB.rocky
Normal file
@@ -0,0 +1,130 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS enb-base
|
||||
|
||||
FROM ran-build:latest AS enb-build
|
||||
|
||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml && \
|
||||
cp /oai-ran/docker/scripts/enb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-enb
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
procps-ng \
|
||||
atlas \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
net-tools \
|
||||
iputils \
|
||||
iproute && \
|
||||
pip3 install six && \
|
||||
pip3 install requests && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-enb/bin
|
||||
COPY --from=enb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/lte-softmodem \
|
||||
/oai-ran/docker/scripts/entrypoint.sh \
|
||||
./
|
||||
|
||||
COPY --from=enb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_usrpdevif.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libcoding.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_enb.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=enb-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.66.0 \
|
||||
/lib64/libboost_date_time.so.1.66.0 \
|
||||
/lib64/libboost_filesystem.so.1.66.0 \
|
||||
/lib64/libboost_program_options.so.1.66.0 \
|
||||
/lib64/libboost_serialization.so.1.66.0 \
|
||||
/lib64/libboost_thread.so.1.66.0 \
|
||||
/lib64/libboost_system.so.1.66.0 \
|
||||
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||
/lib64/libboost_atomic.so.1.66.0 \
|
||||
/lib64/libboost_timer.so.1.66.0 \
|
||||
/lib64/libboost_regex.so.1.66.0 \
|
||||
/lib64/libicudata.so.60 \
|
||||
/lib64/libicui18n.so.60 \
|
||||
/lib64/libicuuc.so.60 \
|
||||
/lib64/
|
||||
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
COPY --from=enb-base /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||
COPY --from=enb-base /usr/local/lib64/libuhd.so.4.4.0 /usr/local/lib64
|
||||
COPY --from=enb-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
|
||||
|
||||
WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=enb-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on lte-softmodem" && ldd /opt/oai-enb/bin/lte-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro.so" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator.so" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif.so" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding.so" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig.so" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts.so" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on liboai_iqplayer.so" && ldd /usr/local/lib/liboai_iqplayer.so && \
|
||||
echo "ldd on libtelnetsrv.so" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_enb.so" && ldd /usr/local/lib/libtelnetsrv_enb.so
|
||||
|
||||
# Copy the relevant configuration files for eNB
|
||||
WORKDIR /opt/oai-enb/etc
|
||||
COPY --from=enb-build /oai-ran/docker/etc .
|
||||
|
||||
WORKDIR /opt/oai-enb
|
||||
|
||||
# 2152 --> S1U, GTP/UDP
|
||||
# 36412 --> S1C, SCTP/UDP
|
||||
# 36422 --> X2C, SCTP/UDP
|
||||
EXPOSE 2152/udp 36412/udp 36422/udp
|
||||
|
||||
ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||
CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||
@@ -84,6 +84,7 @@ COPY --from=gnb-base \
|
||||
/lib64/
|
||||
|
||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
||||
ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so && \
|
||||
ldconfig
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s
|
||||
|
||||
105
docker/Dockerfile.gNB.aw2s.rocky
Normal file
105
docker/Dockerfile.gNB.aw2s.rocky
Normal file
@@ -0,0 +1,105 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS gnb-base
|
||||
|
||||
FROM ran-build:latest AS gnb-build
|
||||
|
||||
COPY ./libori.so /usr/local/lib
|
||||
|
||||
# build AW2S fronthaul lib
|
||||
WORKDIR /oai-ran
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets/ran_build/build && \
|
||||
ninja aw2sori_transpro
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-gnb-aw2s
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
net-tools \
|
||||
iputils && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s/bin
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/nr-softmodem \
|
||||
./
|
||||
COPY ./docker/scripts/gnb-aw2s_entrypoint.sh ./entrypoint.sh
|
||||
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libaw2sori_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libcoding.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/libori.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ln -s /usr/local/lib/libaw2sori_transpro.so /usr/local/lib/libthirdparty_transpro.so && \
|
||||
ln -s /usr/local/lib/liboai_eth_transpro.so /usr/local/lib/liboai_transpro.so && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-softmodem" && ldd /opt/oai-gnb-aw2s/bin/nr-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on libaw2sori_transpro" && ldd /usr/local/lib/libaw2sori_transpro.so && \
|
||||
echo "ldd on libcoding" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libldpc" && ldd /usr/local/lib/libldpc.so && \
|
||||
echo "ldd on libldpc_optim" && ldd /usr/local/lib/libldpc_optim.so && \
|
||||
echo "ldd on libldpc_optim8seg" && ldd /usr/local/lib/libldpc_optim8seg.so && \
|
||||
echo "ldd on libldpc_orig" && ldd /usr/local/lib/libldpc_orig.so && \
|
||||
echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so
|
||||
|
||||
WORKDIR /opt/oai-gnb-aw2s
|
||||
ENTRYPOINT ["/opt/oai-gnb-aw2s/bin/entrypoint.sh"]
|
||||
CMD ["/opt/oai-gnb-aw2s/bin/nr-softmodem", "-O", "/opt/oai-gnb-aw2s/etc/gnb.conf"]
|
||||
138
docker/Dockerfile.gNB.rocky
Normal file
138
docker/Dockerfile.gNB.rocky
Normal file
@@ -0,0 +1,138 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS gnb-base
|
||||
|
||||
FROM ran-build:latest AS gnb-build
|
||||
|
||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml && \
|
||||
cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-gnb
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
procps-ng \
|
||||
libXpm \
|
||||
libX11 \
|
||||
atlas \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
net-tools \
|
||||
iputils && \
|
||||
pip3 install six && \
|
||||
pip3 install requests && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-gnb/bin
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/nr-softmodem \
|
||||
/oai-ran/docker/scripts/entrypoint.sh \
|
||||
./
|
||||
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_usrpdevif.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libcoding.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_ci.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.66.0 \
|
||||
/lib64/libboost_date_time.so.1.66.0 \
|
||||
/lib64/libboost_filesystem.so.1.66.0 \
|
||||
/lib64/libboost_program_options.so.1.66.0 \
|
||||
/lib64/libboost_serialization.so.1.66.0 \
|
||||
/lib64/libboost_thread.so.1.66.0 \
|
||||
/lib64/libboost_system.so.1.66.0 \
|
||||
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||
/lib64/libboost_atomic.so.1.66.0 \
|
||||
/lib64/libboost_timer.so.1.66.0 \
|
||||
/lib64/libboost_regex.so.1.66.0 \
|
||||
/lib64/libicudata.so.60 \
|
||||
/lib64/libicui18n.so.60 \
|
||||
/lib64/libicuuc.so.60 \
|
||||
/lib64/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
COPY --from=gnb-base /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||
COPY --from=gnb-base /usr/local/lib64/libuhd.so.4.4.0 /usr/local/lib64
|
||||
COPY --from=gnb-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
|
||||
|
||||
WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=gnb-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-softmodem" && ldd /opt/oai-gnb/bin/nr-softmodem && \
|
||||
echo "ldd on liboai_eth_transpro" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libldpc" && ldd /usr/local/lib/libldpc.so && \
|
||||
echo "ldd on libldpc_optim" && ldd /usr/local/lib/libldpc_optim.so && \
|
||||
echo "ldd on libldpc_optim8seg" && ldd /usr/local/lib/libldpc_optim8seg.so && \
|
||||
echo "ldd on libldpc_orig" && ldd /usr/local/lib/libldpc_orig.so && \
|
||||
echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_ci" && ldd /usr/local/lib/libtelnetsrv_ci.so
|
||||
|
||||
# Copy the relevant configuration files for gNB
|
||||
WORKDIR /opt/oai-gnb/etc
|
||||
COPY --from=gnb-build /oai-ran/docker/etc .
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
||||
#EXPOSE 22100/tcp # ?
|
||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
||||
|
||||
ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
||||
CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
||||
123
docker/Dockerfile.lteUE.rocky
Normal file
123
docker/Dockerfile.lteUE.rocky
Normal file
@@ -0,0 +1,123 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS lte-ue-base
|
||||
|
||||
FROM ran-build:latest AS lte-ue-build
|
||||
|
||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
|
||||
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml && \
|
||||
cp /oai-ran/docker/scripts/lte_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-lte-ue
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
lksctp-tools \
|
||||
procps-ng \
|
||||
tzdata \
|
||||
atlas \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
iproute \
|
||||
net-tools \
|
||||
iputils && \
|
||||
pip3 install six && \
|
||||
pip3 install requests && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-lte-ue/bin
|
||||
COPY --from=lte-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/lte-uesoftmodem \
|
||||
/oai-ran/docker/scripts/entrypoint.sh \
|
||||
/oai-ran/cmake_targets/nas_sim_tools/build/conf2uedata \
|
||||
/oai-ran/cmake_targets/nas_sim_tools/build/nvram \
|
||||
/oai-ran/cmake_targets/nas_sim_tools/build/usim \
|
||||
./
|
||||
|
||||
COPY --from=lte-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_usrpdevif.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libcoding.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=lte-ue-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libboost_chrono.so.1.66.0 \
|
||||
/lib64/libboost_date_time.so.1.66.0 \
|
||||
/lib64/libboost_filesystem.so.1.66.0 \
|
||||
/lib64/libboost_program_options.so.1.66.0 \
|
||||
/lib64/libboost_serialization.so.1.66.0 \
|
||||
/lib64/libboost_thread.so.1.66.0 \
|
||||
/lib64/libboost_system.so.1.66.0 \
|
||||
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||
/lib64/libboost_atomic.so.1.66.0 \
|
||||
/lib64/libboost_timer.so.1.66.0 \
|
||||
/lib64/libboost_regex.so.1.66.0 \
|
||||
/lib64/libicudata.so.60 \
|
||||
/lib64/libicui18n.so.60 \
|
||||
/lib64/libicuuc.so.60 \
|
||||
/lib64/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
COPY --from=lte-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||
COPY --from=lte-ue-base /usr/local/lib64/libuhd.so.4.4.0 /usr/local/lib64
|
||||
COPY --from=lte-ue-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
|
||||
|
||||
WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=lte-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on lte-uesoftmodem" && ldd /opt/oai-lte-ue/bin/lte-uesoftmodem && \
|
||||
echo "ldd on liboai_eth_transpro" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so
|
||||
|
||||
# Copy the relevant configuration files for UE
|
||||
WORKDIR /opt/oai-lte-ue/etc
|
||||
COPY --from=lte-ue-build /oai-ran/docker/etc .
|
||||
|
||||
WORKDIR /opt/oai-lte-ue
|
||||
CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem"]
|
||||
ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
||||
80
docker/Dockerfile.nr-cuup.rocky
Normal file
80
docker/Dockerfile.nr-cuup.rocky
Normal file
@@ -0,0 +1,80 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS gnb-base
|
||||
|
||||
FROM ran-build:latest AS gnb-build
|
||||
|
||||
RUN cp /oai-ran/docker/scripts/gnb_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-nr-cuup
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
procps-ng \
|
||||
lksctp-tools \
|
||||
tzdata \
|
||||
atlas \
|
||||
net-tools \
|
||||
iputils && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-gnb/bin
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/nr-cuup \
|
||||
/oai-ran/docker/scripts/entrypoint.sh \
|
||||
./
|
||||
|
||||
COPY --from=gnb-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=gnb-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/
|
||||
|
||||
RUN ldconfig && \
|
||||
echo "ldd on nr-cuup" && ldd /opt/oai-gnb/bin/nr-cuup && \
|
||||
echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so
|
||||
|
||||
WORKDIR /opt/oai-gnb/etc
|
||||
|
||||
WORKDIR /opt/oai-gnb
|
||||
|
||||
ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
||||
CMD ["/opt/oai-gnb/bin/nr-cuup", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
||||
138
docker/Dockerfile.nrUE.rocky
Normal file
138
docker/Dockerfile.nrUE.rocky
Normal file
@@ -0,0 +1,138 @@
|
||||
#/*
|
||||
# * 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.1 (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
|
||||
# */
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# Dockerfile for the Open-Air-Interface BUILD service
|
||||
# Valid for Rocky 8.7
|
||||
#
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
ARG BASE_IMAGE=docker.io/rockylinux:8.7
|
||||
FROM ran-base:latest AS nr-ue-base
|
||||
|
||||
FROM ran-build:latest AS nr-ue-build
|
||||
|
||||
RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
|
||||
cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM $BASE_IMAGE as oai-nr-ue
|
||||
ENV TZ=Europe/Paris
|
||||
|
||||
RUN dnf update -y && \
|
||||
dnf install -y \
|
||||
lksctp-tools \
|
||||
procps-ng \
|
||||
tzdata \
|
||||
net-tools \
|
||||
iputils \
|
||||
iproute \
|
||||
atlas \
|
||||
gdb \
|
||||
python3 \
|
||||
python3-pip \
|
||||
libXpm \
|
||||
libX11 && \
|
||||
pip3 install six && \
|
||||
pip3 install requests && \
|
||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||
|
||||
WORKDIR /opt/oai-nr-ue/bin
|
||||
COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/nr-uesoftmodem \
|
||||
/oai-ran/docker/scripts/entrypoint.sh \
|
||||
./
|
||||
|
||||
WORKDIR /opt/oai-nr-ue/etc
|
||||
COPY --from=nr-ue-build \
|
||||
/oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \
|
||||
/oai-ran/docker/etc/nr-ue.nfapi.conf \
|
||||
./
|
||||
|
||||
COPY --from=nr-ue-build \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/librfsimulator.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/liboai_usrpdevif.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libcoding.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||
/usr/local/lib/
|
||||
|
||||
COPY --from=nr-ue-base \
|
||||
/lib64/libconfig.so.9 \
|
||||
/lib64/libblas.so.3 \
|
||||
/lib64/liblapack.so.3 \
|
||||
/lib64/liblapacke.so.3 \
|
||||
/lib64/libforms.so.2 \
|
||||
/lib64/libboost_chrono.so.1.66.0 \
|
||||
/lib64/libboost_date_time.so.1.66.0 \
|
||||
/lib64/libboost_filesystem.so.1.66.0 \
|
||||
/lib64/libboost_program_options.so.1.66.0 \
|
||||
/lib64/libboost_serialization.so.1.66.0 \
|
||||
/lib64/libboost_thread.so.1.66.0 \
|
||||
/lib64/libboost_system.so.1.66.0 \
|
||||
/lib64/libboost_unit_test_framework.so.1.66.0 \
|
||||
/lib64/libboost_atomic.so.1.66.0 \
|
||||
/lib64/libboost_timer.so.1.66.0 \
|
||||
/lib64/libboost_regex.so.1.66.0 \
|
||||
/lib64/libicudata.so.60 \
|
||||
/lib64/libicui18n.so.60 \
|
||||
/lib64/libicuuc.so.60 \
|
||||
/lib64/
|
||||
|
||||
# Now we are copying from builder-image the UHD files.
|
||||
COPY --from=nr-ue-base /usr/local/bin/uhd_find_devices /usr/local/bin
|
||||
COPY --from=nr-ue-base /usr/local/lib64/libuhd.so.4.4.0 /usr/local/lib64
|
||||
COPY --from=nr-ue-base /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
|
||||
|
||||
WORKDIR /usr/local/share/uhd/rfnoc
|
||||
COPY --from=nr-ue-base /usr/local/share/uhd/rfnoc/ .
|
||||
|
||||
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai_device.so" && \
|
||||
ldconfig && \
|
||||
echo "ldd on nr-uesoftmodem" && ldd /opt/oai-nr-ue/bin/nr-uesoftmodem && \
|
||||
echo "ldd on liboai_eth_transpro" && ldd /usr/local/lib/liboai_eth_transpro.so && \
|
||||
echo "ldd on librfsimulator" && ldd /usr/local/lib/librfsimulator.so && \
|
||||
echo "ldd on liboai_usrpdevif" && ldd /usr/local/lib/liboai_usrpdevif.so && \
|
||||
echo "ldd on libcoding" && ldd /usr/local/lib/libcoding.so && \
|
||||
echo "ldd on libparams_libconfig" && ldd /usr/local/lib/libparams_libconfig.so && \
|
||||
echo "ldd on libdfts" && ldd /usr/local/lib/libdfts.so && \
|
||||
echo "ldd on libldpc" && ldd /usr/local/lib/libldpc.so && \
|
||||
echo "ldd on libldpc_optim" && ldd /usr/local/lib/libldpc_optim.so && \
|
||||
echo "ldd on libldpc_optim8seg" && ldd /usr/local/lib/libldpc_optim8seg.so && \
|
||||
echo "ldd on libldpc_orig" && ldd /usr/local/lib/libldpc_orig.so && \
|
||||
echo "ldd on libtelnetsrv" && ldd /usr/local/lib/libtelnetsrv.so && \
|
||||
echo "ldd on libtelnetsrv_5Gue" && ldd /usr/local/lib/libtelnetsrv_5Gue.so
|
||||
|
||||
# Copy the relevant configuration files for eNB
|
||||
WORKDIR /opt/oai-nr-ue/etc
|
||||
COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
||||
|
||||
WORKDIR /opt/oai-nr-ue
|
||||
CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
|
||||
ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||
@@ -31,14 +31,14 @@ RUN rm -Rf /oai-ran
|
||||
WORKDIR /oai-ran
|
||||
COPY . .
|
||||
|
||||
#only install address sanitizer for this container, the others don't need it
|
||||
RUN yum install -y libasan
|
||||
#only install address and undefined behavior sanitizer for this container, the others don't need it
|
||||
RUN yum install -y libasan libubsan
|
||||
|
||||
#run build_oai to build the target image
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p log && \
|
||||
./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512 -c
|
||||
./build_oai --phy_simulators --ninja --verbose-ci --sanitize --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror --cmake-opt -DCMAKE_C_FLAGS=-Wno-unused-function --cmake-opt -DCMAKE_CXX_FLAGS=-Wno-unused-function
|
||||
|
||||
#start from scratch for target executable
|
||||
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
||||
@@ -87,6 +87,7 @@ COPY --from=phy-sim-build \
|
||||
/lib64/libexslt.so.0 \
|
||||
/lib64/libxslt.so.1 \
|
||||
/usr/lib64/libasan.so.5 \
|
||||
/usr/lib64/libubsan.so.1 \
|
||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc.so \
|
||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||
|
||||
@@ -77,6 +77,7 @@ The currently-supported OS are:
|
||||
|
||||
- `rhel8.2` for Red Hat Entreprise Linux (including images for an OpenShift cluster)
|
||||
- `ubuntu20` for Ubuntu 20.04 LTS
|
||||
- `rocky` for Rocky-Linux 8.7
|
||||
|
||||
For more details regarding the build on an Openshift Cluster, see [OpenShift README](../openshift/README.md).
|
||||
|
||||
@@ -111,6 +112,8 @@ ran-base latest 5c9c02a5b4a8 1 minute ago
|
||||
...
|
||||
```
|
||||
|
||||
Note that the steps are identical for `rocky-linux`.
|
||||
|
||||
## 3.3. Building any target image ##
|
||||
|
||||
For example, the eNB:
|
||||
@@ -136,6 +139,8 @@ Do not forget to remove the temporary image:
|
||||
docker image prune --force
|
||||
```
|
||||
|
||||
Note that the steps are identical for `rocky-linux`.
|
||||
|
||||
# 4. Building using `podman` under Red Hat Entreprise Linux 8.2 #
|
||||
|
||||
Analogous to the above steps:
|
||||
|
||||
@@ -206,7 +206,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,
|
||||
T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx));
|
||||
|
||||
// if this is IF5 or 3GPP_eNB
|
||||
if (eNB->RU_list && eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
|
||||
if (eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
|
||||
wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
}
|
||||
|
||||
@@ -1126,7 +1126,7 @@ static void do_ru_synch(RU_t *ru) {
|
||||
|
||||
|
||||
int check_sync(RU_t *ru, RU_t *ru_master, int subframe) {
|
||||
if (fabs(ru_master->proc.t[subframe].tv_nsec - ru->proc.t[subframe].tv_nsec) > 500000)
|
||||
if (labs(ru_master->proc.t[subframe].tv_nsec - ru->proc.t[subframe].tv_nsec) > 500000)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@@ -1178,12 +1178,12 @@ void wakeup_L1s(RU_t *ru) {
|
||||
|
||||
if (ru->is_slave == 0 && ( (proc->RU_mask[ru->proc.tti_rx]&(1<<i)) == 1 ) && eNB->RU_list[i]->state == RU_RUN) { //This is master & the RRU has already been received
|
||||
if (check_sync(eNB->RU_list[i],eNB->RU_list[0],ru->proc.tti_rx) == 0)
|
||||
LOG_E(PHY,"RU %d is not SYNC, subframe %d, time %f this is master\n",
|
||||
eNB->RU_list[i]->idx, ru->proc.tti_rx, fabs(eNB->RU_list[i]->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec));
|
||||
LOG_E(PHY,"RU %d is not SYNC, subframe %d, time %ld this is master\n",
|
||||
eNB->RU_list[i]->idx, ru->proc.tti_rx, labs(eNB->RU_list[i]->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec));
|
||||
} else if (ru->is_slave == 1 && ru->state == RU_RUN && ( (proc->RU_mask[ru->proc.tti_rx]&(1<<0)) == 1)) { // master already received. TODO: we assume that RU0 is master.
|
||||
if (check_sync(ru,eNB->RU_list[0],ru->proc.tti_rx) == 0)
|
||||
LOG_E(PHY,"RU %d is not SYNC time, subframe %d, time %f\n",
|
||||
ru->idx, ru->proc.tti_rx, fabs(ru->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec));
|
||||
LOG_E(PHY,"RU %d is not SYNC time, subframe %d, time %ld\n",
|
||||
ru->idx, ru->proc.tti_rx, labs(ru->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,13 +41,13 @@
|
||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define CMDLINE_UEMODEPARAMS_DESC { \
|
||||
{"calib-ue-rx", CONFIG_HLP_CALUER, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \
|
||||
{"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \
|
||||
{"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \
|
||||
{"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \
|
||||
{"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \
|
||||
{"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \
|
||||
{"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, iptr:&dumpframe, defintval:0, TYPE_INT, 0}, \
|
||||
{"calib-ue-rx", CONFIG_HLP_CALUER, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \
|
||||
{"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \
|
||||
{"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \
|
||||
{"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \
|
||||
{"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \
|
||||
{"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \
|
||||
{"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, .iptr=&dumpframe, .defintval=0, TYPE_INT, 0}, \
|
||||
}
|
||||
#define CMDLINE_CALIBUERX_IDX 0
|
||||
#define CMDLINE_CALIBUERXMED_IDX 1
|
||||
@@ -90,25 +90,25 @@
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// clang-format off
|
||||
#define CMDLINE_UEPARAMS_DESC { \
|
||||
{"U", CONFIG_HLP_NUMUE, 0, iptr:&NB_UE_INST, defuintval:1, TYPE_INT, 0}, \
|
||||
{"ue-rxgain", CONFIG_HLP_UERXG, 0, dblptr:&(rx_gain[0][0]), defdblval:130, TYPE_DOUBLE, 0}, \
|
||||
{"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, dblptr:&rx_gain_off, defdblval:0, TYPE_DOUBLE, 0}, \
|
||||
{"ue-txgain", CONFIG_HLP_UETXG, 0, dblptr:&(tx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \
|
||||
{"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \
|
||||
{"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \
|
||||
{"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \
|
||||
{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:23, TYPE_INT, 0}, \
|
||||
{"emul-iface", CONFIG_HLP_EMULIFACE, 0, strptr:&emul_iface, defstrval:"lo", TYPE_STRING, 100}, \
|
||||
{"L2-emul", NULL, 0, u8ptr:&nfapi_mode, defuintval:3, TYPE_UINT8, 0}, \
|
||||
{"num-ues", NULL, 0, iptr:&(NB_UE_INST), defuintval:1, TYPE_INT, 0}, \
|
||||
{"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \
|
||||
{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \
|
||||
{"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200",TYPE_STRING, 0}, \
|
||||
{"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \
|
||||
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \
|
||||
{"A", CONFIG_HLP_TADV, 0, iptr:&(timingadv), defintval:0, TYPE_INT, 0}, \
|
||||
{"ue-idx-standalone", NULL, 0, u16ptr:&ue_idx_standalone, defuintval:0xFFFF, TYPE_UINT16, 0}, \
|
||||
{"node-number", NULL, 0, u16ptr:&node_number, defuintval:2, TYPE_UINT16, 0}, \
|
||||
{"U", CONFIG_HLP_NUMUE, 0, .iptr=&NB_UE_INST, .defuintval=1, TYPE_INT, 0}, \
|
||||
{"ue-rxgain", CONFIG_HLP_UERXG, 0, .dblptr=&(rx_gain[0][0]), .defdblval=130, TYPE_DOUBLE, 0}, \
|
||||
{"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, .dblptr=&rx_gain_off, .defdblval=0, TYPE_DOUBLE, 0}, \
|
||||
{"ue-txgain", CONFIG_HLP_UETXG, 0, .dblptr=&(tx_gain[0][0]), .defdblval=0, TYPE_DOUBLE, 0}, \
|
||||
{"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, .u8ptr=&nb_antenna_rx, .defuintval=1, TYPE_UINT8, 0}, \
|
||||
{"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, .u8ptr=&nb_antenna_tx, .defuintval=1, TYPE_UINT8, 0}, \
|
||||
{"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, .iptr=&UE_scan_carrier, .defintval=0, TYPE_INT, 0}, \
|
||||
{"ue-max-power", NULL, 0, .iptr=&(tx_max_power[0]), .defintval=23, TYPE_INT, 0}, \
|
||||
{"emul-iface", CONFIG_HLP_EMULIFACE, 0, .strptr=&emul_iface, .defstrval="lo", TYPE_STRING, 100}, \
|
||||
{"L2-emul", NULL, 0, .u8ptr=&nfapi_mode, .defuintval=3, TYPE_UINT8, 0}, \
|
||||
{"num-ues", NULL, 0, .iptr=&(NB_UE_INST), .defuintval=1, TYPE_INT, 0}, \
|
||||
{"r" , CONFIG_HLP_PRB, 0, .u8ptr=&(frame_parms[0]->N_RB_DL), .defintval=25, TYPE_UINT8, 0}, \
|
||||
{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0, TYPE_INT, 0}, \
|
||||
{"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200",TYPE_STRING, 0}, \
|
||||
{"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, .uptr=&mmapped_dma, .defintval=0, TYPE_INT, 0}, \
|
||||
{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, .iptr=&tddflag, .defintval=0, TYPE_INT, 0}, \
|
||||
{"A", CONFIG_HLP_TADV, 0, .iptr=&(timingadv), .defintval=0, TYPE_INT, 0}, \
|
||||
{"ue-idx-standalone", NULL, 0, .u16ptr=&ue_idx_standalone, .defuintval=0xFFFF, TYPE_UINT16, 0}, \
|
||||
{"node-number", NULL, 0, .u16ptr=&node_number, .defuintval=2, TYPE_UINT16, 0}, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -482,7 +482,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) {
|
||||
void terminate_task(task_id_t task_id, module_id_t mod_id) {
|
||||
LOG_I(ENB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
|
||||
MessageDef *msg;
|
||||
msg = itti_alloc_new_message (ENB_APP, 0, TERMINATE_MESSAGE);
|
||||
msg = itti_alloc_new_message (TASK_ENB_APP, 0, TERMINATE_MESSAGE);
|
||||
itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -84,21 +84,11 @@ int nr_rlc_get_available_tx_space(const rnti_t rntiP, const logical_chan_id_t ch
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerConfig__servedRadioBearer_PR rb_type)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, NR_CellGroupConfig_t *cell_groupConfig_from_DU)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void nr_rlc_add_drb(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig)
|
||||
{
|
||||
abort();
|
||||
@@ -110,11 +100,6 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p, e1ap_bearer_setup_resp_t *e1ap_resp)
|
||||
{
|
||||
abort();
|
||||
@@ -126,7 +111,7 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP)
|
||||
void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, uint8_t xid)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -195,7 +195,8 @@ void rx_func(void *param)
|
||||
gNB->common_vars.rxdataF[aa],
|
||||
slot_rx,
|
||||
0,
|
||||
gNB->frame_parms.Ncp==EXTENDED?12:14);
|
||||
gNB->frame_parms.Ncp==EXTENDED?12:14,
|
||||
NR_LINK_TYPE_UL);
|
||||
}
|
||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
||||
}
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||
#include "radio/COMMON/common_lib.h"
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_entity.h"
|
||||
#include "SCHED_NR_UE/pucch_uci_ue_nr.h"
|
||||
#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "openair1/PHY/NR_REFSIG/sss_nr.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
//#define DEBUG_PHY_SL_PROC
|
||||
#include "pdcp.h"
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
|
||||
/*
|
||||
@@ -99,7 +106,8 @@
|
||||
typedef enum {
|
||||
pss = 0,
|
||||
pbch = 1,
|
||||
si = 2
|
||||
si = 2,
|
||||
psbch = 3,
|
||||
} sync_mode_t;
|
||||
|
||||
static void *NRUE_phy_stub_standalone_pnf_task(void *arg);
|
||||
@@ -154,19 +162,19 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
|
||||
int nb_connected_gNB = 1;
|
||||
|
||||
ue->Mod_id = UE_id;
|
||||
ue->mac_enabled = 1;
|
||||
ue->if_inst = nr_ue_if_module_init(0);
|
||||
ue->dci_thres = 0;
|
||||
ue->target_Nid_cell = -1;
|
||||
|
||||
// initialize all signal buffers
|
||||
init_nr_ue_signal(ue, nb_connected_gNB);
|
||||
if (get_softmodem_params()->sl_mode != 2) {
|
||||
// intialize transport
|
||||
init_nr_ue_transport(ue);
|
||||
|
||||
// intialize transport
|
||||
init_nr_ue_transport(ue);
|
||||
|
||||
// init N_TA offset
|
||||
init_N_TA_offset(ue);
|
||||
// init N_TA offset
|
||||
init_N_TA_offset(ue);
|
||||
}
|
||||
}
|
||||
|
||||
void init_nrUE_standalone_thread(int ue_idx)
|
||||
@@ -259,8 +267,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
|
||||
reset_queue(&nr_ul_dci_req_queue);
|
||||
reset_queue(&nr_ul_tti_req_queue);
|
||||
|
||||
NR_UL_TIME_ALIGNMENT_t ul_time_alignment;
|
||||
memset(&ul_time_alignment, 0, sizeof(ul_time_alignment));
|
||||
int last_sfn_slot = -1;
|
||||
uint16_t sfn_slot = 0;
|
||||
|
||||
@@ -305,7 +311,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
|
||||
|
||||
if (get_softmodem_params()->sa && mac->mib == NULL) {
|
||||
LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n");
|
||||
nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment);
|
||||
nr_ue_dl_indication(&mac->dl_info);
|
||||
process_queued_nr_nfapi_msgs(mac, sfn_slot);
|
||||
}
|
||||
if (mac->scc == NULL && mac->scc_SIB == NULL) {
|
||||
@@ -347,7 +353,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
|
||||
mac->dl_info.slot = slot;
|
||||
mac->dl_info.dci_ind = NULL;
|
||||
mac->dl_info.rx_ind = NULL;
|
||||
nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment);
|
||||
nr_ue_dl_indication(&mac->dl_info);
|
||||
}
|
||||
|
||||
if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort();
|
||||
@@ -356,9 +362,8 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
|
||||
mac->scc->tdd_UL_DL_ConfigurationCommon :
|
||||
mac->scc_SIB->tdd_UL_DL_ConfigurationCommon,
|
||||
ul_info.slot_tx, mac->frame_type)) {
|
||||
LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() and nr_ue_pucch_scheduler() from %s\n", ul_info.slot_tx, __FUNCTION__);
|
||||
LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot_tx);
|
||||
nr_ue_ul_scheduler(&ul_info);
|
||||
nr_ue_pucch_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, NULL);
|
||||
}
|
||||
process_queued_nr_nfapi_msgs(mac, sfn_slot);
|
||||
}
|
||||
@@ -380,7 +385,12 @@ static void UE_synch(void *arg) {
|
||||
sync_mode_t sync_mode = pbch;
|
||||
//int CC_id = UE->CC_id;
|
||||
static int freq_offset=0;
|
||||
UE->is_synchronized = 0;
|
||||
if (get_softmodem_params()->sl_mode == 2) {
|
||||
UE->is_synchronized_sl = 0;
|
||||
sync_mode = psbch;
|
||||
} else {
|
||||
UE->is_synchronized = 0;
|
||||
}
|
||||
|
||||
if (UE->UE_scan == 0) {
|
||||
|
||||
@@ -396,7 +406,6 @@ static void UE_synch(void *arg) {
|
||||
|
||||
}
|
||||
|
||||
sync_mode = pbch;
|
||||
} else {
|
||||
LOG_E(PHY,"Fixme!\n");
|
||||
/*
|
||||
@@ -496,9 +505,44 @@ static void UE_synch(void *arg) {
|
||||
break;
|
||||
|
||||
case si:
|
||||
|
||||
case psbch: {
|
||||
int initial_synch_sl = nr_sl_initial_sync(&syncD->proc, UE, 2);
|
||||
if (initial_synch_sl >= 0) { // gNB will work as SyncRef UE in simulation.
|
||||
|
||||
// rerun with new cell parameters and frequency-offset
|
||||
freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync
|
||||
nr_sl_rf_card_config_freq(UE, &openair0_cfg[UE->rf_map.card], freq_offset);
|
||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0]);
|
||||
|
||||
if (UE->UE_scan_carrier == 1) {
|
||||
UE->UE_scan_carrier = 0;
|
||||
} else {
|
||||
if (initial_synch_sl == 0) {
|
||||
UE->is_synchronized_sl = 1;
|
||||
LOG_I(NR_PHY, "SyncRef UE found with Nid1 %d and Nid2 %d SSS-RSRP %d dBm/RE\n",
|
||||
GET_NID1_SL(UE->frame_parms.Nid_SL), GET_NID2_SL(UE->frame_parms.Nid_SL),
|
||||
UE->measurements.ssb_rsrp_dBm[0]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG_I(NR_PHY, "No SyncRef UE found\n");
|
||||
if (UE->UE_scan_carrier == 1) {
|
||||
LOG_I(PHY, "Initial sync failed: trying carrier off %d Hz\n", freq_offset);
|
||||
|
||||
if (freq_offset >= 0)
|
||||
freq_offset += 100;
|
||||
freq_offset *= -1;
|
||||
nr_sl_rf_card_config_freq(UE, &openair0_cfg[UE->rf_map.card], freq_offset);
|
||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice, &openair0_cfg[0]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -565,6 +609,8 @@ void processSlotTX(void *arg) {
|
||||
nr_phy_data_tx_t phy_data = {0};
|
||||
|
||||
LOG_D(PHY,"%d.%d => slot type %d\n", proc->frame_tx, proc->nr_slot_tx, proc->tx_slot_type);
|
||||
if (UE->sync_ref && get_softmodem_params()->sl_mode != 0)
|
||||
proc->tx_slot_type = NR_UPLINK_SLOT;
|
||||
if (proc->tx_slot_type == NR_UPLINK_SLOT || proc->tx_slot_type == NR_MIXED_SLOT){
|
||||
|
||||
// wait for rx slots to send indication (if any) that DLSCH decoding is finished
|
||||
@@ -575,7 +621,7 @@ void processSlotTX(void *arg) {
|
||||
|
||||
// trigger L2 to run ue_scheduler thru IF module
|
||||
// [TODO] mapping right after NR initial sync
|
||||
if(UE->if_inst != NULL && UE->if_inst->ul_indication != NULL) {
|
||||
if (get_softmodem_params()->sl_mode != 2 && UE->if_inst != NULL && UE->if_inst->ul_indication != NULL) {
|
||||
start_meas(&UE->ue_ul_indication_stats);
|
||||
nr_uplink_indication_t ul_indication;
|
||||
memset((void*)&ul_indication, 0, sizeof(ul_indication));
|
||||
@@ -593,10 +639,20 @@ void processSlotTX(void *arg) {
|
||||
stop_meas(&UE->ue_ul_indication_stats);
|
||||
}
|
||||
|
||||
phy_procedures_nrUE_TX(UE, proc, &phy_data);
|
||||
if (get_softmodem_params()->sl_mode == 0) {
|
||||
phy_procedures_nrUE_TX(UE, proc, &phy_data);
|
||||
} else {
|
||||
phy_procedures_nrUE_SL_TX(UE, proc, 0);
|
||||
}
|
||||
}
|
||||
if (get_softmodem_params()->sl_mode == 0) {
|
||||
RU_write(rxtxD);
|
||||
}
|
||||
}
|
||||
|
||||
RU_write(rxtxD);
|
||||
void processSlotRX_SL(void *arg) {
|
||||
nr_rxtx_thread_data_t *rxtxD = (nr_rxtx_thread_data_t *) arg;
|
||||
processSlotTX(rxtxD);
|
||||
}
|
||||
|
||||
nr_phy_data_t UE_dl_preprocessing(PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
||||
@@ -629,7 +685,7 @@ nr_phy_data_t UE_dl_preprocessing(PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
||||
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
||||
nr_downlink_indication_t dl_indication;
|
||||
nr_fill_dl_indication(&dl_indication, NULL, NULL, proc, UE, &phy_data);
|
||||
UE->if_inst->dl_indication(&dl_indication, NULL);
|
||||
UE->if_inst->dl_indication(&dl_indication);
|
||||
}
|
||||
|
||||
uint64_t a=rdtsc_oai();
|
||||
@@ -707,11 +763,11 @@ void readFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp, bool toTrash)
|
||||
|
||||
void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
|
||||
|
||||
LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
|
||||
int rx_offset = (get_softmodem_params()->sl_mode != 0) ? UE->rx_offset_sl : UE->rx_offset;
|
||||
|
||||
if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) {
|
||||
// Resynchonize by slot (will work with numerology 1 only)
|
||||
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe/2 ) {
|
||||
for (int size = rx_offset; size > 0; size -= UE->frame_parms.samples_per_subframe / 2) {
|
||||
int unitTransfer=size>UE->frame_parms.samples_per_subframe/2 ? UE->frame_parms.samples_per_subframe/2 : size ;
|
||||
AssertFatal(unitTransfer ==
|
||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
@@ -722,11 +778,11 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
|
||||
}
|
||||
} else {
|
||||
*timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms);
|
||||
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) {
|
||||
for (int size = rx_offset; size > 0; size -= UE->frame_parms.samples_per_subframe) {
|
||||
int unitTransfer=size>UE->frame_parms.samples_per_subframe ? UE->frame_parms.samples_per_subframe : size ;
|
||||
// we write before read because gNB waits for UE to write and both executions halt
|
||||
// this happens here as the read size is samples_per_subframe which is very much larger than samp_per_slot
|
||||
if (IS_SOFTMODEM_RFSIM) dummyWrite(UE,*timestamp, unitTransfer);
|
||||
if (IS_SOFTMODEM_RFSIM) dummyWrite(UE,*timestamp, unitTransfer);
|
||||
AssertFatal(unitTransfer ==
|
||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
timestamp,
|
||||
@@ -742,28 +798,305 @@ int computeSamplesShift(PHY_VARS_NR_UE *UE) {
|
||||
int samples_shift = -(UE->rx_offset>>1);
|
||||
if (samples_shift != 0) {
|
||||
LOG_I(NR_PHY,"Adjusting frame in time by %i samples\n", samples_shift);
|
||||
UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
|
||||
if (get_softmodem_params()->sl_mode == 0) {
|
||||
UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
|
||||
} else {
|
||||
UE->rx_offset_sl = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
|
||||
}
|
||||
UE->max_pos_fil += samples_shift << 15; // reset IIR filter when sample shift is applied
|
||||
}
|
||||
return samples_shift;
|
||||
}
|
||||
|
||||
static inline int get_firstSymSamp(uint16_t slot, NR_DL_FRAME_PARMS *fp) {
|
||||
static inline int get_firstSymSamp(uint16_t slot, NR_DL_FRAME_PARMS *fp, bool sync) {
|
||||
uint16_t nb_prefix_samples0 = fp->nb_prefix_samples0;
|
||||
if (get_softmodem_params()->sl_mode != 0) {
|
||||
nb_prefix_samples0 = sync ? fp->nb_prefix_samples0 : fp->nb_prefix_samples;
|
||||
}
|
||||
if (fp->numerology_index == 0)
|
||||
return fp->nb_prefix_samples0 + fp->ofdm_symbol_size;
|
||||
int num_samples = (slot%(fp->slots_per_subframe/2)) ? fp->nb_prefix_samples : fp->nb_prefix_samples0;
|
||||
int num_samples = (slot % (fp->slots_per_subframe / 2)) ? fp->nb_prefix_samples : nb_prefix_samples0;
|
||||
num_samples += fp->ofdm_symbol_size;
|
||||
return num_samples;
|
||||
}
|
||||
|
||||
static inline int get_readBlockSize(uint16_t slot, NR_DL_FRAME_PARMS *fp) {
|
||||
int rem_samples = fp->get_samples_per_slot(slot, fp) - get_firstSymSamp(slot, fp);
|
||||
static inline int get_readBlockSize(uint16_t slot, NR_DL_FRAME_PARMS *fp, bool sync) {
|
||||
int rem_samples = fp->get_samples_per_slot(slot, fp) - get_firstSymSamp(slot, fp, sync);
|
||||
int next_slot_first_symbol = 0;
|
||||
if (slot < (fp->slots_per_frame-1))
|
||||
next_slot_first_symbol = get_firstSymSamp(slot+1, fp);
|
||||
next_slot_first_symbol = get_firstSymSamp(slot+1, fp, sync);
|
||||
return rem_samples + next_slot_first_symbol;
|
||||
}
|
||||
|
||||
int slot_to_flag_sl(uint8_t tdd_period, int slot, uint16_t slot_config, uint16_t num_slot_frame) {
|
||||
int flag, isUL, isULnext, isULbefore;
|
||||
int num_period_slot = get_nb_periods_per_frame(tdd_period);
|
||||
slot = slot % (num_slot_frame / num_period_slot);
|
||||
isUL = (slot_config >> slot) & 0x1;// indicator to show if the slot is UL or DL
|
||||
|
||||
if (slot > 0) {
|
||||
//checking if previous slot is UL
|
||||
isULbefore = (slot_config >> (slot - 1)) & 0x1;
|
||||
} else {
|
||||
isULbefore = 0;
|
||||
}
|
||||
if (slot < (num_slot_frame / num_period_slot) - 1) {
|
||||
// checking if next slot is UL
|
||||
isULnext = (slot_config >> (slot+1)) & 0x1;
|
||||
} else {
|
||||
isULnext = 0;
|
||||
}
|
||||
|
||||
if (isUL) {
|
||||
if (slot == 0 || !isULbefore) {
|
||||
flag = 2; // first slot should start transmission
|
||||
} else if (slot == (num_slot_frame / num_period_slot) - 1 || !isULnext) {
|
||||
flag = 3; // last slot that should stop transmission
|
||||
} else {
|
||||
flag = 1; // it is niether first nor last slot.
|
||||
}
|
||||
} else {
|
||||
flag = 0; // don't transmit at all
|
||||
}
|
||||
LOG_D(NR_PHY, "### slot(%d), UL(%d), flag(%d)\n", slot, isUL, flag);
|
||||
return flag;
|
||||
}
|
||||
|
||||
void *UE_thread_SL(void *arg) {
|
||||
PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE *) arg;
|
||||
openair0_timestamp timestamp, writeTimestamp;
|
||||
void *rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX];
|
||||
AssertFatal(0 == openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
|
||||
UE->rfdevice.host_type = RAU_HOST;
|
||||
AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n");
|
||||
|
||||
notifiedFIFO_t nf;
|
||||
initNotifiedFIFO(&nf);
|
||||
notifiedFIFO_t freeBlocks;
|
||||
initNotifiedFIFO_nothreadSafe(&freeBlocks);
|
||||
int nbSlotProcessing = 0;
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
int timing_advance = UE->timing_advance;
|
||||
|
||||
UE->lost_sync_sl = 0;
|
||||
UE->is_synchronized_sl = 0;
|
||||
UE->sync_ref = get_softmodem_params()->sync_ref;
|
||||
bool sync_running_sl = false;
|
||||
const int nb_slot_frame = UE->frame_parms.slots_per_frame;
|
||||
int absolute_slot = 0, decoded_frame_rx = INT_MAX, trashed_frames = 0, start_rx_stream = 0;
|
||||
|
||||
for (int i = 0; i < NR_RX_NB_TH + 1; i++) {// NR_RX_NB_TH working + 1 we are making to be pushed
|
||||
notifiedFIFO_elt_t *newElt = newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), RX_JOB_ID, &nf, processSlotRX_SL);
|
||||
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(newElt);
|
||||
initNotifiedFIFO(&curMsg->txFifo);
|
||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks, newElt);
|
||||
}
|
||||
|
||||
while (!oai_exit) {
|
||||
if (UE->lost_sync_sl && UE->sync_ref == 0) {
|
||||
LOG_I(NR_PHY, "Sync UE: lost_sync status\n");
|
||||
int nb = abortTpoolJob(&(get_nrUE_params()->Tpool),RX_JOB_ID);
|
||||
nb += abortNotifiedFIFOJob(&nf, RX_JOB_ID);
|
||||
LOG_I(PHY,"Number of aborted slots %d\n",nb);
|
||||
for (int i=0; i<nb; i++)
|
||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks, newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), RX_JOB_ID, &nf, processSlotRX_SL));
|
||||
nbSlotProcessing = 0;
|
||||
UE->is_synchronized_sl = 0;
|
||||
UE->lost_sync_sl = 0;
|
||||
}
|
||||
|
||||
if (sync_running_sl && UE->sync_ref == 0) {
|
||||
LOG_I(NR_PHY, "Nearby UE: sync_running status.\n");
|
||||
notifiedFIFO_elt_t *res=tryPullTpool(&nf,&(get_nrUE_params()->Tpool));
|
||||
if (res) {
|
||||
sync_running_sl = false;
|
||||
LOG_I(NR_PHY, "Nearby UE: sync_running was set to false due to valid res.\n");
|
||||
syncData_t *tmp=(syncData_t *)NotifiedFifoData(res);
|
||||
LOG_I(NR_PHY, "Nearby UE: UE->is_synchronized_sl = %d\n", UE->is_synchronized_sl);
|
||||
if (UE->is_synchronized_sl && get_softmodem_params()->sl_mode < 2) {
|
||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | tmp->proc.decoded_frame_rx);
|
||||
// shift the frame index with all the frames we trashed meanwhile we perform the synch search
|
||||
decoded_frame_rx=(decoded_frame_rx + UE->init_sync_frame + trashed_frames) % MAX_FRAME_NUMBER;
|
||||
}
|
||||
delNotifiedFIFO_elt(res);
|
||||
start_rx_stream = 0;
|
||||
} else {
|
||||
LOG_I(PHY, "Nearby UE: sync_running_sl still in readFrame due to INVALID res.\n");
|
||||
readFrame(UE, ×tamp, true);
|
||||
trashed_frames += 2;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
AssertFatal(!sync_running_sl, "At this point synchronization can't be running\n");
|
||||
|
||||
if (UE->is_synchronized_sl == 0 && UE->sync_ref == 0) {
|
||||
LOG_I(NR_PHY, "Sync UE: UE->is_synchronized_sl == 0 && UE->sync_ref == 0)\n");
|
||||
readFrame(UE, ×tamp, false);
|
||||
notifiedFIFO_elt_t *Msg=newNotifiedFIFO_elt(sizeof(syncData_t), 0, &nf, UE_synch);
|
||||
syncData_t *syncMsg = (syncData_t *)NotifiedFifoData(Msg);
|
||||
syncMsg->UE = UE;
|
||||
memset(&syncMsg->proc, 0, sizeof(syncMsg->proc));
|
||||
pushTpool(&(get_nrUE_params()->Tpool), Msg);
|
||||
trashed_frames=0;
|
||||
sync_running_sl =true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (start_rx_stream == 0 && UE->sync_ref == 0) {
|
||||
start_rx_stream = 1;
|
||||
syncInFrame(UE, ×tamp);
|
||||
LOG_I(NR_PHY, "Sync UE: rx_stream = 1 and timestamp %ld\n", timestamp);
|
||||
UE->rx_offset_sl = 0;
|
||||
UE->time_sync_cell = 0;
|
||||
uint16_t nb_prefix_samples0 = UE->is_synchronized_sl ? UE->frame_parms.nb_prefix_samples0 :
|
||||
UE->frame_parms.nb_prefix_samples;
|
||||
AssertFatal (UE->frame_parms.ofdm_symbol_size + nb_prefix_samples0 ==
|
||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
×tamp,
|
||||
(void **)UE->common_vars.rxdata,
|
||||
UE->frame_parms.ofdm_symbol_size + nb_prefix_samples0,
|
||||
UE->frame_parms.nb_antennas_rx), "Could not read in first symbol");
|
||||
// we have the decoded frame index in the return of the synch process
|
||||
// and we shifted above to the first slot of next frame
|
||||
decoded_frame_rx++;
|
||||
// we do ++ first in the regular processing, so it will be begin of frame;
|
||||
absolute_slot = decoded_frame_rx * nb_slot_frame - 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
absolute_slot++;
|
||||
// Fix me: will be wrong when slot 1 is slow, as slot 2 finishes
|
||||
// Slot 3 will overlap if NR_RX_NB_TH is 2
|
||||
// this is general failure in UE !!
|
||||
int slot_nr = absolute_slot % nb_slot_frame;
|
||||
|
||||
notifiedFIFO_elt_t *msgToPush;
|
||||
AssertFatal((msgToPush=pullNotifiedFIFO_nothreadSafe(&freeBlocks)) != NULL,"chained list failure");
|
||||
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush);
|
||||
curMsg->UE = UE;
|
||||
// update thread index for received subframe
|
||||
curMsg->proc.CC_id = UE->CC_id;
|
||||
curMsg->proc.nr_slot_rx = slot_nr;
|
||||
curMsg->proc.nr_slot_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
|
||||
curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||
curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||
curMsg->proc.decoded_frame_rx=-1;
|
||||
LOG_D(NR_PHY, "Process slot %d total gain %d\n", slot_nr, UE->rx_total_gain_dB);
|
||||
|
||||
int firstSymSamp = get_firstSymSamp(slot_nr, &UE->frame_parms, UE->is_synchronized_sl);
|
||||
uint64_t write_time_stamp = UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms, 0);
|
||||
uint64_t read_time_stamp = UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms, 0);
|
||||
for (int i = 0; i<UE->frame_parms.nb_antennas_rx; i++)
|
||||
rxp[i] = (void *)&UE->common_vars.rxdata[i][read_time_stamp];
|
||||
for (int i = 0; i < UE->frame_parms.nb_antennas_tx; i++)
|
||||
txp[i] = (void *)&UE->common_vars.txdata[i][write_time_stamp];
|
||||
|
||||
int readBlockSize, writeBlockSize;
|
||||
if (slot_nr < (nb_slot_frame - 1)) {
|
||||
readBlockSize = get_readBlockSize(slot_nr, &UE->frame_parms, UE->is_synchronized_sl);
|
||||
writeBlockSize = UE->frame_parms.get_samples_per_slot(slot_nr, &UE->frame_parms);
|
||||
} else {
|
||||
UE->rx_offset_diff = computeSamplesShift(UE);
|
||||
readBlockSize = get_readBlockSize(slot_nr, &UE->frame_parms, UE->is_synchronized_sl) - UE->rx_offset_diff;
|
||||
writeBlockSize = UE->frame_parms.get_samples_per_slot(slot_nr, &UE->frame_parms) - UE->rx_offset_diff;
|
||||
}
|
||||
|
||||
AssertFatal(readBlockSize ==
|
||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
×tamp,
|
||||
rxp,
|
||||
readBlockSize,
|
||||
UE->frame_parms.nb_antennas_rx), "");
|
||||
|
||||
if (slot_nr == (nb_slot_frame - 1)) {
|
||||
// read in first symbol of next frame and adjust for timing drift
|
||||
uint16_t nb_prefix_samples0 = UE->is_synchronized_sl ? UE->frame_parms.nb_prefix_samples0 :
|
||||
UE->frame_parms.nb_prefix_samples;
|
||||
int first_symbols = UE->frame_parms.ofdm_symbol_size + nb_prefix_samples0;
|
||||
if (first_symbols > 0) {
|
||||
openair0_timestamp ignore_timestamp;
|
||||
AssertFatal(first_symbols ==
|
||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
&ignore_timestamp,
|
||||
(void **)UE->common_vars.rxdata,
|
||||
first_symbols,
|
||||
UE->frame_parms.nb_antennas_rx),"");
|
||||
} else {
|
||||
LOG_E(NR_PHY, "Can't compensate: diff =%d\n", first_symbols);
|
||||
}
|
||||
}
|
||||
|
||||
curMsg->proc.timestamp_tx = timestamp +
|
||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms, DURATION_RX_TO_TX) -
|
||||
firstSymSamp;
|
||||
|
||||
while (nbSlotProcessing >= NR_RX_NB_TH) {
|
||||
notifiedFIFO_elt_t *res = pullTpool(&nf, &(get_nrUE_params()->Tpool));
|
||||
if (res == NULL)
|
||||
break; // Tpool has been stopped
|
||||
nbSlotProcessing--;
|
||||
nr_rxtx_thread_data_t *tmp = (nr_rxtx_thread_data_t *)res->msgData;
|
||||
if (tmp->proc.decoded_frame_rx != -1)
|
||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >>
|
||||
mac->mib->systemFrameNumber.bits_unused) << 4) |
|
||||
tmp->proc.decoded_frame_rx);
|
||||
else
|
||||
decoded_frame_rx=-1;
|
||||
pushNotifiedFIFO_nothreadSafe(&freeBlocks,res);
|
||||
}
|
||||
|
||||
if (UE->sync_ref == 0 && decoded_frame_rx > 0 && decoded_frame_rx != curMsg->proc.frame_rx)
|
||||
LOG_E(NR_PHY, "Sync UE: Decoded frame index (%d) is not compatible with current context (%d), "
|
||||
"UE should go back to synch mode\n", decoded_frame_rx, curMsg->proc.frame_rx);
|
||||
|
||||
// use previous timing_advance value to compute writeTimestamp
|
||||
writeTimestamp = timestamp +
|
||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms, DURATION_RX_TO_TX - NR_RX_NB_TH) -
|
||||
firstSymSamp - openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - timing_advance;
|
||||
|
||||
// but use current UE->timing_advance value to compute writeBlockSize
|
||||
if (UE->timing_advance != timing_advance) {
|
||||
writeBlockSize -= UE->timing_advance - timing_advance;
|
||||
timing_advance = UE->timing_advance;
|
||||
}
|
||||
|
||||
int flags = 1;
|
||||
NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
|
||||
flags = slot_to_flag_sl(fp->tdd_period, slot_nr, fp->tdd_slot_config, fp->slots_per_frame);
|
||||
|
||||
if (flags || IS_SOFTMODEM_RFSIM) {
|
||||
LOG_D(NR_PHY, "current slot goring to write USRP: %d\n", slot_nr);
|
||||
AssertFatal(writeBlockSize ==
|
||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||
writeTimestamp,
|
||||
txp,
|
||||
writeBlockSize,
|
||||
UE->frame_parms.nb_antennas_tx,
|
||||
flags), "");
|
||||
}
|
||||
#ifdef DEBUG_PHY_SL_PROC
|
||||
char buffer[UE->frame_parms.ofdm_symbol_size];
|
||||
for (int i = 0; i < 13; i++) {
|
||||
bzero(buffer, sizeof(buffer));
|
||||
LOG_I(NR_PHY, "Transmitted SSB %d = %s\n",
|
||||
i, hexdump(&txp[0][UE->frame_parms.ofdm_symbol_size*i],
|
||||
UE->frame_parms.ofdm_symbol_size, buffer, sizeof(buffer)));
|
||||
}
|
||||
#endif
|
||||
for (int i = 0; i < UE->frame_parms.nb_antennas_tx; i++) {
|
||||
memset(txp[i], 0, writeBlockSize);
|
||||
}
|
||||
nbSlotProcessing++;
|
||||
LOG_D(NR_PHY, "Number of slots being processed at the moment: %d\n", nbSlotProcessing);
|
||||
pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
|
||||
} // while !oai_exit
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *UE_thread(void *arg) {
|
||||
//this thread should be over the processing thread to keep in real time
|
||||
PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE *) arg;
|
||||
@@ -901,7 +1234,7 @@ void *UE_thread(void *arg) {
|
||||
}*/
|
||||
#endif
|
||||
|
||||
int firstSymSamp = get_firstSymSamp(slot_nr, &UE->frame_parms);
|
||||
int firstSymSamp = get_firstSymSamp(slot_nr, &UE->frame_parms, UE->is_synchronized);
|
||||
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
|
||||
rxp[i] = (void *)&UE->common_vars.rxdata[i][firstSymSamp+
|
||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,0)];
|
||||
@@ -909,11 +1242,11 @@ void *UE_thread(void *arg) {
|
||||
int readBlockSize, writeBlockSize;
|
||||
|
||||
if (slot_nr<(nb_slot_frame - 1)) {
|
||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms);
|
||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms, UE->is_synchronized);
|
||||
writeBlockSize=UE->frame_parms.get_samples_per_slot((slot_nr + DURATION_RX_TO_TX) % nb_slot_frame, &UE->frame_parms);
|
||||
} else {
|
||||
UE->rx_offset_diff = computeSamplesShift(UE);
|
||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms) -
|
||||
readBlockSize=get_readBlockSize(slot_nr, &UE->frame_parms, UE->is_synchronized) -
|
||||
UE->rx_offset_diff;
|
||||
writeBlockSize=UE->frame_parms.get_samples_per_slot((slot_nr + DURATION_RX_TO_TX) % nb_slot_frame, &UE->frame_parms)- UE->rx_offset_diff;
|
||||
}
|
||||
@@ -1008,18 +1341,27 @@ void init_NR_UE(int nb_inst,
|
||||
}
|
||||
|
||||
void init_NR_UE_threads(int nb_inst) {
|
||||
int inst;
|
||||
|
||||
pthread_t threads[nb_inst];
|
||||
pthread_t threadsSL[nb_inst];
|
||||
|
||||
for (inst=0; inst < nb_inst; inst++) {
|
||||
for (int inst = 0; inst < nb_inst; inst++) {
|
||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[inst][0];
|
||||
|
||||
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
|
||||
threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
|
||||
if (!IS_SOFTMODEM_NOSTATS_BIT) {
|
||||
pthread_t stat_pthread;
|
||||
threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW);
|
||||
if (get_softmodem_params()->sl_mode == 0) {
|
||||
LOG_I(NR_PHY, "Intializing UE Threads for instance %d (%p,%p)...\n", inst, PHY_vars_UE_g[inst], PHY_vars_UE_g[inst][0]);
|
||||
threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
|
||||
if (!IS_SOFTMODEM_NOSTATS_BIT) {
|
||||
pthread_t stat_pthread;
|
||||
threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
}
|
||||
else if (get_softmodem_params()->sl_mode == 2) {
|
||||
LOG_I(NR_PHY, "Intializing Sidelink UE Threads for instance %d (%p,%p)...\n", inst, PHY_vars_UE_g[inst], PHY_vars_UE_g[inst][0]);
|
||||
threadCreate(&threadsSL[inst], UE_thread_SL, (void *)UE, "UEthreadSL", -1, OAI_PRIORITY_RT_MAX);
|
||||
}
|
||||
else {
|
||||
LOG_I(NR_PHY,"Need implementation...\n");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,6 +86,7 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include "nr_nas_msg_sim.h"
|
||||
#include <openair1/PHY/MODULATION/nr_modulation.h>
|
||||
#include "openair2/GNB_APP/gnb_paramdef.h"
|
||||
#include <openair1/PHY/NR_REFSIG/sss_nr.h>
|
||||
|
||||
extern const char *duplex_mode[];
|
||||
THREAD_STRUCT thread_struct;
|
||||
@@ -128,6 +129,7 @@ int dumpframe = 0;
|
||||
|
||||
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
uint64_t sidelink_frequency[MAX_NUM_CCs][4];
|
||||
int rx_input_level_dBm;
|
||||
|
||||
#if MAX_NUM_CCs == 1
|
||||
@@ -143,7 +145,6 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}};
|
||||
// UE and OAI config variables
|
||||
|
||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
int16_t node_synch_ref[MAX_NUM_CCs];
|
||||
int otg_enabled;
|
||||
double cpuf;
|
||||
|
||||
@@ -163,6 +164,7 @@ uint32_t N_RB_DL = 106;
|
||||
uint8_t abstraction_flag=0;
|
||||
|
||||
nr_bler_struct nr_bler_data[NR_NUM_MCS];
|
||||
nr_bler_struct nr_mimo_bler_data[NR_NUM_MCS];
|
||||
|
||||
static void init_bler_table(char*);
|
||||
|
||||
@@ -259,6 +261,81 @@ nrUE_params_t *get_nrUE_params(void) {
|
||||
return &nrUE_params;
|
||||
}
|
||||
|
||||
static void nr_phy_config_request_sl(PHY_VARS_NR_UE *ue,
|
||||
int N_RB_DL,
|
||||
int N_RB_UL,
|
||||
int CC_id)
|
||||
{
|
||||
uint64_t rev_burst = 0;
|
||||
uint64_t SSB_positions = 0x01;
|
||||
int mu = 1;
|
||||
uint8_t n_tx = 1;
|
||||
uint8_t n_rx = 1;
|
||||
uint16_t Nid_cell = 0;
|
||||
int ssb_subcarrier_offset = 0;
|
||||
for (int i = 0; i < 64; i++)
|
||||
rev_burst |= (((SSB_positions >> (63-i))&0x01) << i);
|
||||
|
||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
fapi_nr_config_request_t *nrUE_config = &ue->nrUE_config;
|
||||
nrUE_config->cell_config.phy_cell_id = get_softmodem_params()->nid1 + get_softmodem_params()->nid2 * NUMBER_SSS_SEQUENCE;
|
||||
nrUE_config->ssb_config.scs_common = mu;
|
||||
nrUE_config->ssb_table.ssb_subcarrier_offset = 0;
|
||||
nrUE_config->ssb_table.ssb_offset_point_a = 0;
|
||||
nrUE_config->ssb_table.ssb_mask_list[1].ssb_mask = (rev_burst)&(0xFFFFFFFF);
|
||||
nrUE_config->ssb_table.ssb_mask_list[0].ssb_mask = (rev_burst>>32)&(0xFFFFFFFF);
|
||||
nrUE_config->cell_config.frame_duplex_type = TDD;
|
||||
nrUE_config->ssb_table.ssb_period = 1; //10ms
|
||||
nrUE_config->carrier_config.dl_grid_size[mu] = N_RB_DL;
|
||||
nrUE_config->carrier_config.ul_grid_size[mu] = N_RB_UL;
|
||||
nrUE_config->carrier_config.num_tx_ant = fp->nb_antennas_tx;
|
||||
nrUE_config->carrier_config.num_rx_ant = fp->nb_antennas_rx;
|
||||
nrUE_config->tdd_table.tdd_period = 0;
|
||||
nrUE_config->carrier_config.dl_frequency = downlink_frequency[CC_id][0] / 1000;
|
||||
nrUE_config->carrier_config.uplink_frequency = downlink_frequency[CC_id][0] / 1000;
|
||||
nrUE_config->carrier_config.sl_frequency = sidelink_frequency[CC_id][0] / 1000;
|
||||
LOG_D(NR_PHY, "SL Frequency %u\n", nrUE_config->carrier_config.sl_frequency);
|
||||
fp->tdd_period = 6; // 6 indicates 5ms (see get_nb_periods_per_frame())
|
||||
fp->tdd_slot_config = 0b0000111111; // 1 -> UL, 0-> DL for each slot , LSB is the slot 0
|
||||
fp->dl_CarrierFreq = 2600000000;
|
||||
fp->ul_CarrierFreq = 2600000000;
|
||||
fp->nb_antennas_tx = n_tx;
|
||||
fp->nb_antennas_rx = n_rx;
|
||||
fp->nb_antenna_ports_gNB = n_tx;
|
||||
fp->N_RB_DL = N_RB_DL;
|
||||
fp->Nid_cell = Nid_cell;
|
||||
fp->Nid_SL = get_softmodem_params()->nid1 + get_softmodem_params()->nid2 * NUMBER_SSS_SEQUENCE;;
|
||||
fp->nushift = 0; //No nushift in SL
|
||||
fp->ssb_type = nr_ssb_type_C; //Note: case c for NR SL???
|
||||
fp->freq_range = mu < 2 ? nr_FR1 : nr_FR2;
|
||||
fp->nr_band = get_softmodem_params()->band; //Note: NR SL uses for n38 and n47
|
||||
fp->threequarter_fs = 0;
|
||||
fp->ofdm_offset_divisor = UINT_MAX;
|
||||
fp->first_carrier_offset = 0;
|
||||
fp->ssb_start_subcarrier = 12 * ue->nrUE_config.ssb_table.ssb_offset_point_a + ssb_subcarrier_offset;
|
||||
int bw_index = get_supported_band_index(mu, fp->nr_band, N_RB_DL);
|
||||
nrUE_config->carrier_config.dl_bandwidth = get_supported_bw_mhz(fp->nr_band > 256 ? FR2 : FR1, bw_index);
|
||||
|
||||
ue->slss = calloc(1, sizeof(*ue->slss));
|
||||
int len = sizeof(ue->slss->sl_mib) / sizeof(ue->slss->sl_mib[0]);
|
||||
for (int i = 0; i < len; i++) {
|
||||
ue->slss->sl_mib[i] = 0;
|
||||
}
|
||||
ue->slss->sl_mib_length = 32;
|
||||
ue->slss->sl_numssb_withinperiod_r16 = 16;
|
||||
ue->slss->sl_timeinterval_r16 = 20;
|
||||
ue->slss->sl_timeoffsetssb_r16 = 0;
|
||||
ue->slss->sl_numssb_withinperiod_r16_copy = 16;
|
||||
ue->slss->sl_timeinterval_r16_copy = 20;
|
||||
ue->slss->sl_timeoffsetssb_r16_copy = 0;
|
||||
ue->slss->slss_id = get_softmodem_params()->nid1 + get_softmodem_params()->nid2 * NUMBER_SSS_SEQUENCE;;
|
||||
ue->is_synchronized_sl = 0;
|
||||
ue->UE_fo_compensation = 0;
|
||||
ue->sync_ref = get_softmodem_params()->sync_ref;
|
||||
LOG_I(NR_PHY, "nrUE configured\n");
|
||||
}
|
||||
|
||||
|
||||
static void get_options(void) {
|
||||
|
||||
paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ;
|
||||
@@ -321,7 +398,7 @@ void init_openair0(void) {
|
||||
NR_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[0][0]->frame_parms;
|
||||
|
||||
for (card=0; card<MAX_CARDS; card++) {
|
||||
uint64_t dl_carrier, ul_carrier;
|
||||
uint64_t dl_carrier, ul_carrier, sl_carrier;
|
||||
openair0_cfg[card].configFilename = NULL;
|
||||
openair0_cfg[card].threequarter_fs = frame_parms->threequarter_fs;
|
||||
openair0_cfg[card].sample_rate = frame_parms->samples_per_subframe * 1e3;
|
||||
@@ -348,8 +425,15 @@ void init_openair0(void) {
|
||||
duplex_mode[openair0_cfg[card].duplex_mode]);
|
||||
|
||||
nr_get_carrier_frequencies(PHY_vars_UE_g[0][0], &dl_carrier, &ul_carrier);
|
||||
|
||||
LOG_I(NR_PHY,"Configuring SL carrier for %llu Hz \n",sl_carrier);
|
||||
nr_rf_card_config_freq(&openair0_cfg[card], ul_carrier, dl_carrier, freq_off);
|
||||
|
||||
if (get_softmodem_params()->sl_mode != 0) {
|
||||
nr_get_carrier_frequencies_sl(PHY_vars_UE_g[0][0], &sl_carrier);
|
||||
LOG_I(NR_PHY,"Configuring SL carrier for %llu Hz \n",sl_carrier);
|
||||
nr_rf_card_config_freq(&openair0_cfg[card], sl_carrier, sl_carrier, freq_off);
|
||||
}
|
||||
|
||||
nr_rf_card_config_gain(&openair0_cfg[card], rx_gain_off);
|
||||
|
||||
openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
|
||||
@@ -508,8 +592,14 @@ int main( int argc, char **argv ) {
|
||||
|
||||
set_options(CC_id, UE[CC_id]);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||
|
||||
if (get_softmodem_params()->sa) { // set frame config to initial values from command line and assume that the SSB is centered on the grid
|
||||
if (get_softmodem_params()->sl_mode != 0) {
|
||||
uint16_t nr_band = get_band(sidelink_frequency[CC_id][0],0);
|
||||
mac->if_module = NULL;
|
||||
LOG_I(HW, "Setting mac->if_module = NULL b/c we config PHY in nr_phy_config_request_sl (for now - TODO)\n");
|
||||
nr_phy_config_request_sl(UE[CC_id], N_RB_DL, N_RB_DL, CC_id);
|
||||
nr_init_frame_parms_ue_sl(&UE[CC_id]->frame_parms,sidelink_frequency[CC_id][0],nr_band);
|
||||
}
|
||||
if (get_softmodem_params()->sa) {
|
||||
uint16_t nr_band = get_band(downlink_frequency[CC_id][0],uplink_frequency_offset[CC_id][0]);
|
||||
mac->nr_band = nr_band;
|
||||
nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
|
||||
@@ -517,15 +607,15 @@ int main( int argc, char **argv ) {
|
||||
uplink_frequency_offset[CC_id][0],
|
||||
get_softmodem_params()->numerology,
|
||||
nr_band);
|
||||
}
|
||||
else{
|
||||
DevAssert(mac->if_module != NULL && mac->if_module->phy_config_request != NULL);
|
||||
mac->if_module->phy_config_request(&mac->phy_config);
|
||||
mac->phy_config_request_sent = true;
|
||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||
|
||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config,
|
||||
*mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
||||
} else {
|
||||
if (mac->if_module != NULL && mac->if_module->phy_config_request != NULL) {
|
||||
mac->if_module->phy_config_request(&mac->phy_config);
|
||||
mac->phy_config_request_sent = true;
|
||||
}
|
||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, &UE[CC_id]->nrUE_config,
|
||||
((get_softmodem_params()->sl_mode == 0) ?
|
||||
*mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] :
|
||||
UE[CC_id]->frame_parms.nr_band));
|
||||
}
|
||||
|
||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
||||
@@ -636,3 +726,56 @@ static void init_bler_table(char *env_string) {
|
||||
fclose(pFile);
|
||||
}
|
||||
}
|
||||
|
||||
// Read in each MCS file and build BLER-SINR-TB table
|
||||
static void init_mimo_bler_table(void) {
|
||||
memset(nr_mimo_bler_data, 0, sizeof(nr_mimo_bler_data));
|
||||
|
||||
const char *awgn_results_dir = getenv("NR_MIMO2x2_AWGN_RESULTS_DIR");
|
||||
if (!awgn_results_dir) {
|
||||
LOG_W(NR_MAC, "No $NR_MIMO2x2_AWGN_RESULTS_DIR\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < NR_NUM_MCS; i++) {
|
||||
char fName[1024];
|
||||
snprintf(fName, sizeof(fName), "%s/mcs%d_cdlc_mimo2x2_dl.csv", awgn_results_dir, i);
|
||||
FILE *pFile = fopen(fName, "r");
|
||||
if (!pFile) {
|
||||
LOG_E(NR_MAC, "open %s: %s\n", fName, strerror(errno));
|
||||
continue;
|
||||
}
|
||||
size_t bufSize = 1024;
|
||||
char * line = NULL;
|
||||
char * token;
|
||||
char * temp = NULL;
|
||||
int nlines = 0;
|
||||
while (getline(&line, &bufSize, pFile) > 0) {
|
||||
if (!strncmp(line, "SNR", 3)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (nlines > NR_NUM_SINR) {
|
||||
LOG_E(NR_MAC, "BLER FILE ERROR - num lines greater than expected - file: %s\n", fName);
|
||||
abort();
|
||||
}
|
||||
|
||||
token = strtok_r(line, ";", &temp);
|
||||
int ncols = 0;
|
||||
while (token != NULL) {
|
||||
if (ncols > NUM_BLER_COL) {
|
||||
LOG_E(NR_MAC, "BLER FILE ERROR - num of cols greater than expected\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
nr_mimo_bler_data[i].bler_table[nlines][ncols] = strtof(token, NULL);
|
||||
ncols++;
|
||||
|
||||
token = strtok_r(NULL, ";", &temp);
|
||||
}
|
||||
nlines++;
|
||||
}
|
||||
nr_mimo_bler_data[i].length = nlines;
|
||||
fclose(pFile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, .strptr=&uecap_file, .defstrval="./uecap_ports1.xml", TYPE_STRING, 0}, \
|
||||
{"rrc_config_path", CONFIG_HLP_RRC_CFG_PATH, 0, .strptr=&rrc_config_path, .defstrval="./", TYPE_STRING, 0}, \
|
||||
{"ue-idx-standalone", NULL, 0, .u16ptr=&ue_idx_standalone, .defuintval=0xFFFF, TYPE_UINT16, 0}, \
|
||||
{"SLC", CONFIG_HLP_SLF, 0, .u64ptr=&(sidelink_frequency[0][0]), .defuintval=2600000000, TYPE_UINT64, 0}, \
|
||||
{"ue-rxgain", CONFIG_HLP_UERXG, 0, .dblptr=&(rx_gain[0][0]), .defdblval=110, TYPE_DOUBLE, 0}, \
|
||||
{"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, .dblptr=&rx_gain_off, .defdblval=0, TYPE_DOUBLE, 0}, \
|
||||
{"ue-txgain", CONFIG_HLP_UETXG, 0, .dblptr=&(tx_gain[0][0]), .defdblval=0, TYPE_DOUBLE, 0}, \
|
||||
|
||||
@@ -55,8 +55,10 @@ extern "C"
|
||||
|
||||
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
||||
#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n"
|
||||
#define CONFIG_HLP_SL_PHYTST "test SL UE phy layer, mac disabled\n"
|
||||
#define CONFIG_HLP_DORA "test gNB and UE with RA procedures\n"
|
||||
#define CONFIG_HLP_SA "run gNB in standalone mode\n"
|
||||
#define CONFIG_HLP_SL_MODE "sets the NR sidelink mode (0: not in sidelink mode, 1: in-coverage/gNB, 2: out-of-coverage/no gNB)"
|
||||
#define CONFIG_HLP_EXTS "tells hardware to use an external timing reference\n"
|
||||
#define CONFIG_HLP_DMRSSYNC "tells RU to insert DMRS in subframe 1 slot 0"
|
||||
#define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n"
|
||||
@@ -66,6 +68,7 @@ extern "C"
|
||||
#define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n"
|
||||
#define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n"
|
||||
#define CONFIG_HLP_ULF "Set the uplink frequency offset for all component carriers\n"
|
||||
#define CONFIG_HLP_SLF "Set the sidelink frequency for all component carriers\n"
|
||||
#define CONFIG_HLP_CHOFF "Channel id offset\n"
|
||||
#define CONFIG_HLP_SOFTS "Enable soft scope and L1 and L2 stats (Xforms)\n"
|
||||
#define CONFIG_HLP_SOFTS_QT "Enable soft scope and L1 and L2 stats (QT)\n"
|
||||
@@ -103,6 +106,9 @@ extern "C"
|
||||
#define CONFIG_L1_EMULATOR "Run in L1 emulated mode (disable PHY layer)\n"
|
||||
#define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n"
|
||||
#define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence"
|
||||
#define CONFIG_HLP_SYNC_REF "Sync Reference in Sidelink\n"
|
||||
#define CONFIG_HLP_NID1 "Set NID1 value in Sidelink\n"
|
||||
#define CONFIG_HLP_NID2 "Set NID2 value in Sidelink\n"
|
||||
|
||||
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* command line parameters common to eNodeB and UE */
|
||||
@@ -111,8 +117,10 @@ extern "C"
|
||||
#define RF_CONFIG_FILE softmodem_params.rf_config_file
|
||||
#define TP_CONFIG softmodem_params.threadPoolConfig
|
||||
#define PHY_TEST softmodem_params.phy_test
|
||||
#define SL_PHY_TEST softmodem_params.sl_phy_test
|
||||
#define DO_RA softmodem_params.do_ra
|
||||
#define SA softmodem_params.sa
|
||||
#define SL_MODE softmodem_params.sl_mode
|
||||
#define WAIT_FOR_SYNC softmodem_params.wait_for_sync
|
||||
#define SINGLE_THREAD_FLAG softmodem_params.single_thread_flag
|
||||
#define CHAIN_OFFSET softmodem_params.chain_offset
|
||||
@@ -132,6 +140,9 @@ extern "C"
|
||||
#define NON_STOP softmodem_params.non_stop
|
||||
#define EMULATE_L1 softmodem_params.emulate_l1
|
||||
#define CONTINUOUS_TX softmodem_params.continuous_tx
|
||||
#define SYNC_REF softmodem_params.sync_ref
|
||||
#define NID1 softmodem_params.nid1
|
||||
#define NID2 softmodem_params.nid2
|
||||
|
||||
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
||||
|
||||
@@ -143,6 +154,8 @@ extern int usrp_tx_thread;
|
||||
{"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, .iptr=&PHY_TEST, .defintval=0, TYPE_INT, 0}, \
|
||||
{"do-ra", CONFIG_HLP_DORA, PARAMFLAG_BOOL, .iptr=&DO_RA, .defintval=0, TYPE_INT, 0}, \
|
||||
{"sa", CONFIG_HLP_SA, PARAMFLAG_BOOL, .iptr=&SA, .defintval=0, TYPE_INT, 0}, \
|
||||
{"sl-mode", CONFIG_HLP_SL_MODE, 0, .u8ptr=&SL_MODE, .defintval=0, TYPE_UINT8, 0}, \
|
||||
{"sync-ref", CONFIG_HLP_SYNC_REF, PARAMFLAG_BOOL, .iptr=&SYNC_REF, .defintval=0, TYPE_INT, 0}, \
|
||||
{"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, .u8ptr=&USIM_TEST, .defintval=0, TYPE_UINT8, 0}, \
|
||||
{"clock-source", CONFIG_HLP_CLK, 0, .uptr=&CLOCK_SOURCE, .defintval=0, TYPE_UINT, 0}, \
|
||||
{"time-source", CONFIG_HLP_TME, 0, .uptr=&TIMING_SOURCE, .defintval=0, TYPE_UINT, 0}, \
|
||||
@@ -174,6 +187,8 @@ extern int usrp_tx_thread;
|
||||
{"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, .iptr=&EMULATE_L1, .defintval=0, TYPE_INT, 0}, \
|
||||
{"continuous-tx", CONFIG_HLP_CONTINUOUS_TX, PARAMFLAG_BOOL, .iptr=&CONTINUOUS_TX, .defintval=0, TYPE_INT, 0}, \
|
||||
{"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, .iptr=&stats_disabled, .defintval=0, TYPE_INT, 0}, \
|
||||
{"nid1", CONFIG_HLP_NID1, 0, .iptr=&NID1, .defintval=10, TYPE_INT, 0}, \
|
||||
{"nid2", CONFIG_HLP_NID2, 0, .iptr=&NID2, .defintval=1, TYPE_INT, 0}, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
@@ -210,6 +225,8 @@ extern int usrp_tx_thread;
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s3a = { config_checkstr_assign_integer, \
|
||||
{"MONOLITHIC", "PNF", "VNF","UE_STUB_PNF","UE_STUB_OFFNET","STANDALONE_PNF"}, \
|
||||
{NFAPI_MONOLITHIC, NFAPI_MODE_PNF, NFAPI_MODE_VNF,NFAPI_UE_STUB_PNF,NFAPI_UE_STUB_OFFNET,NFAPI_MODE_STANDALONE_PNF}, \
|
||||
@@ -218,6 +235,8 @@ extern int usrp_tx_thread;
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
{ .s5 = { NULL } }, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
@@ -301,8 +320,10 @@ typedef struct {
|
||||
char *rf_config_file;
|
||||
char *threadPoolConfig;
|
||||
int phy_test;
|
||||
int sl_phy_test;
|
||||
int do_ra;
|
||||
int sa;
|
||||
uint8_t sl_mode;
|
||||
uint8_t usim_test;
|
||||
int emulate_rf;
|
||||
int wait_for_sync; //eNodeB only
|
||||
@@ -324,6 +345,9 @@ typedef struct {
|
||||
int non_stop;
|
||||
int emulate_l1;
|
||||
int continuous_tx;
|
||||
int sync_ref;
|
||||
int nid1;
|
||||
int nid2;
|
||||
} softmodem_params_t;
|
||||
|
||||
extern uint64_t get_softmodem_optmask(void);
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
#define FAPI_NR_DL_CONFIG_TYPE_P_DLSCH 0x05
|
||||
#define FAPI_NR_DL_CONFIG_TYPE_CSI_RS 0x06
|
||||
#define FAPI_NR_DL_CONFIG_TYPE_CSI_IM 0x07
|
||||
#define FAPI_NR_DL_CONFIG_TYPES 0x07
|
||||
#define FAPI_NR_CONFIG_TA_COMMAND 0x08
|
||||
#define FAPI_NR_DL_CONFIG_TYPES 0x08
|
||||
|
||||
#define FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED 0x01
|
||||
#define FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED 0x02
|
||||
|
||||
@@ -526,6 +526,11 @@ typedef struct {
|
||||
fapi_nr_dl_config_csiim_pdu_rel15_t csiim_config_rel15;
|
||||
} fapi_nr_dl_config_csiim_pdu;
|
||||
|
||||
typedef struct {
|
||||
int ta_frame;
|
||||
int ta_slot;
|
||||
int ta_command;
|
||||
} fapi_nr_ta_command_pdu;
|
||||
|
||||
typedef struct {
|
||||
uint8_t pdu_type;
|
||||
@@ -534,6 +539,7 @@ typedef struct {
|
||||
fapi_nr_dl_config_dlsch_pdu dlsch_config_pdu;
|
||||
fapi_nr_dl_config_csirs_pdu csirs_config_pdu;
|
||||
fapi_nr_dl_config_csiim_pdu csiim_config_pdu;
|
||||
fapi_nr_ta_command_pdu ta_command_pdu;
|
||||
};
|
||||
} fapi_nr_dl_config_request_pdu_t;
|
||||
|
||||
@@ -553,7 +559,9 @@ typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
uint16_t dl_bandwidth;//Carrier bandwidth for DL in MHz [38.104, sec 5.3.2] Values: 5, 10, 15, 20, 25, 30, 40,50, 60, 70, 80,90,100,200,400
|
||||
uint16_t sl_bandwidth; //Carrier bandwidth for SL in MHz [38.101, sec 5.3.5] Values: 10, 20, 30, and 40
|
||||
uint32_t dl_frequency; //Absolute frequency of DL point A in KHz [38.104, sec5.2 and 38.211 sec 4.4.4.2] Value: 450000 -> 52600000
|
||||
uint32_t sl_frequency; //Absolute frequency of SL point A in KHz [38.331, sec6.3.5 and 38.211 sec 8.2.7]
|
||||
uint16_t dl_k0[5];//𝑘_{0}^{𝜇} for each of the numerologies [38.211, sec 5.3.1] Value: 0 ->23699
|
||||
uint16_t dl_grid_size[5];//Grid size 𝑁_{𝑔𝑟𝑖𝑑}^{𝑠𝑖𝑧𝑒,𝜇} for each of the numerologies [38.211, sec 4.4.2] Value: 0->275 0 = this numerology not used
|
||||
uint16_t num_tx_ant;//Number of Tx antennas
|
||||
|
||||
@@ -1897,6 +1897,9 @@ typedef struct {
|
||||
} nfapi_ul_config_periodic_cqi_pmi_ri_report_re13_t;
|
||||
|
||||
typedef struct {
|
||||
// This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++
|
||||
// To be removed if the structure is filled
|
||||
uint32_t dummy;
|
||||
} nfapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -3020,9 +3023,15 @@ typedef struct {
|
||||
#define NFAPI_LBT_DL_INDICATION_BODY_TAG 0x2058
|
||||
|
||||
typedef struct {
|
||||
// This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++
|
||||
// To be removed if the structure is filled
|
||||
uint32_t dummy;
|
||||
} nfapi_error_indication_msg_invalid_state;
|
||||
|
||||
typedef struct {
|
||||
// This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++
|
||||
// To be removed if the structure is filled
|
||||
uint32_t dummy;
|
||||
} nfapi_error_indication_msg_bch_missing;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -29,7 +29,6 @@ int main(int argc, char *argv[])
|
||||
uint32_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error.
|
||||
uint16_t testLength = NR_POLAR_PBCH_PAYLOAD_BITS, coderLength = NR_POLAR_PBCH_E;
|
||||
uint16_t blockErrorCumulative=0, bitErrorCumulative=0;
|
||||
double timeEncoderCumulative = 0, timeDecoderCumulative = 0;
|
||||
uint8_t aggregation_level = 8, decoderListSize = 8, logFlag = 0;
|
||||
uint16_t rnti=0;
|
||||
|
||||
@@ -128,7 +127,7 @@ int main(int argc, char *argv[])
|
||||
time_t currentTime;
|
||||
char fileName[512], currentTimeInfo[25];
|
||||
char folderName[] = ".";
|
||||
FILE *logFile;
|
||||
FILE *logFile = NULL;
|
||||
/*folderName=getenv("HOME");
|
||||
strcat(folderName,"/Desktop/polartestResults");*/
|
||||
|
||||
@@ -326,8 +325,6 @@ int main(int argc, char *argv[])
|
||||
#endif
|
||||
|
||||
//Iteration times are in microseconds.
|
||||
timeEncoderCumulative+=(timeEncoder.diff/(get_cpu_freq_GHz()*1000.0));
|
||||
timeDecoderCumulative+=(timeDecoder.diff/(get_cpu_freq_GHz()*1000.0));
|
||||
if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)), (timeDecoder.diff/(get_cpu_freq_GHz()*1000.0)));
|
||||
|
||||
if (nBitError<0) {
|
||||
@@ -351,14 +348,11 @@ int main(int argc, char *argv[])
|
||||
decoderListSize, SNR, ((double)blockErrorCumulative/iterations),
|
||||
((double)bitErrorCumulative / (iterations*testLength)),
|
||||
(double)timeEncoder.diff/timeEncoder.trials/(get_cpu_freq_GHz()*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(get_cpu_freq_GHz()*1000.0));
|
||||
//(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations);
|
||||
|
||||
if (blockErrorCumulative==0 && bitErrorCumulative==0) break;
|
||||
|
||||
blockErrorCumulative = 0;
|
||||
bitErrorCumulative = 0;
|
||||
timeEncoderCumulative = 0;
|
||||
timeDecoderCumulative = 0;
|
||||
}
|
||||
|
||||
print_meas(&timeEncoder,"polar_encoder",NULL,NULL);
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
|
||||
//#define DEBUG_CCODE 1
|
||||
|
||||
unsigned short glte[] = { 0133, 0171, 0165 }; // {A,B}
|
||||
unsigned short glte_rev[] = { 0155, 0117, 0127 }; // {A,B}
|
||||
unsigned short gdab[] = { 0133, 0171, 0145 }; // {A,B}
|
||||
unsigned short gdab_rev[] = { 0155, 0117, 0123 }; // {A,B}
|
||||
static const unsigned short glte[] = {0133, 0171, 0165}; // {A,B}
|
||||
static const unsigned short glte_rev[] = {0155, 0117, 0127}; // {A,B}
|
||||
static const unsigned short gdab[] = {0133, 0171, 0145}; // {A,B}
|
||||
static const unsigned short gdab_rev[] = {0155, 0117, 0123}; // {A,B}
|
||||
unsigned char ccodelte_table[128]; // for transmitter
|
||||
unsigned char ccodelte_table_rev[128]; // for receiver
|
||||
|
||||
|
||||
@@ -44,18 +44,20 @@
|
||||
/*ref 36-212 v8.6.0 , pp 8-9 */
|
||||
/* the highest degree is set by default */
|
||||
|
||||
unsigned int poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011
|
||||
// D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1
|
||||
unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011
|
||||
// D^24 + D^23 + D^6 + D^5 + D + 1
|
||||
unsigned int poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111
|
||||
// D^24+D^23+D^21+D^20+D^17+D^15+D^13+D^12+D^8+D^4+D^2+D+1
|
||||
|
||||
unsigned int poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1
|
||||
unsigned int poly12 = 0x80F00000; // 1000 0000 1111 D^12 + D^11 + D^3 + D^2 + D + 1
|
||||
unsigned int poly8 = 0x9B000000; // 1001 1011 D^8 + D^7 + D^4 + D^3 + D + 1
|
||||
uint32_t poly6 = 0x84000000; // 10000100000... -> D^6+D^5+1
|
||||
uint32_t poly11 = 0xc4200000; //11000100001000... -> D^11+D^10+D^9+D^5+1
|
||||
static const uint32_t poly24a =
|
||||
0x864cfb00; // 1000 0110 0100 1100 1111 1011
|
||||
// D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1
|
||||
static const uint32_t poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011
|
||||
// D^24 + D^23 + D^6 + D^5 + D + 1
|
||||
static const uint32_t poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111
|
||||
// D^24+D^23+D^21+D^20+D^17+D^15+D^13+D^12+D^8+D^4+D^2+D+1
|
||||
|
||||
static const uint32_t poly16 = 0x10210000; // 0001 0000 0010 0001 D^16 + D^12 + D^5 + 1
|
||||
static const uint32_t poly12 = 0x80F00000; // 1000 0000 1111 D^12 + D^11 + D^3 + D^2 + D + 1
|
||||
static const uint32_t poly8 = 0x9B000000; // 1001 1011 D^8 + D^7 + D^4 + D^3 + D + 1
|
||||
static const uint32_t poly6 = 0x84000000; // 10000100000... -> D^6+D^5+1
|
||||
static const uint32_t poly11 = 0xc4200000; // 11000100001000... -> D^11+D^10+D^9+D^5+1
|
||||
|
||||
/*********************************************************
|
||||
|
||||
@@ -65,14 +67,12 @@ For initialization && verification purposes,
|
||||
The first bit is in the MSB of each byte
|
||||
|
||||
*********************************************************/
|
||||
unsigned int crcbit (unsigned char * inputptr,
|
||||
int octetlen,
|
||||
unsigned int poly)
|
||||
uint32_t crcbit(unsigned char* inputptr, int octetlen, uint32_t poly)
|
||||
{
|
||||
unsigned int i, crc = 0, c;
|
||||
uint32_t i, crc = 0, c;
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
c = ((unsigned int)(*inputptr++)) << 24;
|
||||
c = ((uint32_t)(*inputptr++)) << 24;
|
||||
|
||||
for (i = 8; i != 0; i--) {
|
||||
if ((1U << 31) & (c ^ crc))
|
||||
@@ -92,34 +92,30 @@ unsigned int crcbit (unsigned char * inputptr,
|
||||
crc table initialization
|
||||
|
||||
*********************************************************/
|
||||
static unsigned int crc24aTable[256];
|
||||
static unsigned int crc24bTable[256];
|
||||
static unsigned int crc24cTable[256];
|
||||
static unsigned short crc16Table[256];
|
||||
static unsigned short crc12Table[256];
|
||||
static unsigned short crc11Table[256];
|
||||
static unsigned char crc8Table[256];
|
||||
static unsigned char crc6Table[256];
|
||||
static uint32_t crc24aTable[256];
|
||||
static uint32_t crc24bTable[256];
|
||||
static uint32_t crc24cTable[256];
|
||||
static uint32_t crc16Table[256];
|
||||
static uint32_t crc12Table[256];
|
||||
static uint32_t crc11Table[256];
|
||||
static uint32_t crc8Table[256];
|
||||
static uint32_t crc6Table[256];
|
||||
|
||||
#if USE_INTEL_CRC
|
||||
static DECLARE_ALIGNED(struct crc_pclmulqdq_ctx lte_crc24a_pclmulqdq, 16) = {
|
||||
0x64e4d700, /**< k1 */
|
||||
0x2c8c9d00, /**< k2 */
|
||||
0xd9fe8c00, /**< k3 */
|
||||
0xf845fe24, /**< q */
|
||||
0x864cfb00, /**< p */
|
||||
0ULL /**< res */
|
||||
static const struct crc_pclmulqdq_ctx lte_crc24a_pclmulqdq __attribute__((aligned(16))) = {
|
||||
0x64e4d700, /**< k1 */
|
||||
0x2c8c9d00, /**< k2 */
|
||||
0xd9fe8c00, /**< k3 */
|
||||
0xf845fe24, /**< q */
|
||||
0x864cfb00, /**< p */
|
||||
0ULL /**< res */
|
||||
};
|
||||
__m128i crc_xmm_be_le_swap128;
|
||||
|
||||
DECLARE_ALIGNED(const uint8_t crc_xmm_shift_tab[48], 16) = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
const uint8_t crc_xmm_shift_tab[48]
|
||||
__attribute__((aligned(16))) = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -131,11 +127,11 @@ void crcTableInit (void)
|
||||
crc24aTable[c] = crcbit (&c, 1, poly24a);
|
||||
crc24bTable[c] = crcbit (&c, 1, poly24b);
|
||||
crc24cTable[c] = crcbit (&c, 1, poly24c);
|
||||
crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16);
|
||||
crc12Table[c] = (unsigned short) (crcbit (&c, 1, poly12) >> 16);
|
||||
crc11Table[c] = (unsigned short) (crcbit (&c, 1, poly11) >> 16);
|
||||
crc8Table[c] = (unsigned char) (crcbit (&c, 1, poly8) >> 24);
|
||||
crc6Table[c] = (unsigned char) (crcbit (&c, 1, poly6) >> 24);
|
||||
crc16Table[c] = crcbit(&c, 1, poly16) >> 16;
|
||||
crc12Table[c] = crcbit(&c, 1, poly12) >> 16;
|
||||
crc11Table[c] = crcbit(&c, 1, poly11) >> 16;
|
||||
crc8Table[c] = crcbit(&c, 1, poly8) >> 24;
|
||||
crc6Table[c] = crcbit(&c, 1, poly6) >> 24;
|
||||
} while (++c);
|
||||
#if USE_INTEL_CRC
|
||||
crc_xmm_be_le_swap128 = _mm_setr_epi32(0x0c0d0e0f, 0x08090a0b,
|
||||
@@ -151,19 +147,18 @@ assuming initial byte is 0 padded (in MSB) if necessary
|
||||
can use SIMD optimized Intel CRC for LTE/NR 24a/24b variants
|
||||
*********************************************************/
|
||||
|
||||
unsigned int crc24a (unsigned char * inptr,
|
||||
int bitlen)
|
||||
uint32_t crc24a(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen = bitlen / 8; /* Change in octets */
|
||||
|
||||
if ( bitlen % 8 || !USE_INTEL_CRC ) {
|
||||
unsigned int crc = 0;
|
||||
int resbit= (bitlen % 8);
|
||||
uint32_t crc = 0;
|
||||
int resbit = (bitlen % 8);
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
// printf("crc24a: in %x => crc %x\n",crc,*inptr);
|
||||
crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)];
|
||||
}
|
||||
while (octetlen-- > 0) {
|
||||
// printf("crc24a: in %x => crc %x\n",crc,*inptr);
|
||||
crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)];
|
||||
}
|
||||
|
||||
if (resbit > 0)
|
||||
crc = (crc << resbit) ^ crc24aTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
|
||||
@@ -179,28 +174,27 @@ unsigned int crc24a (unsigned char * inptr,
|
||||
}
|
||||
|
||||
#if USE_INTEL_CRC
|
||||
static DECLARE_ALIGNED(struct crc_pclmulqdq_ctx lte_crc24b_pclmulqdq, 16) = {
|
||||
0x80140500, /**< k1 */
|
||||
0x42000100, /**< k2 */
|
||||
0x90042100, /**< k3 */
|
||||
0xffff83ff, /**< q */
|
||||
0x80006300, /**< p */
|
||||
0ULL /**< res */
|
||||
static const struct crc_pclmulqdq_ctx lte_crc24b_pclmulqdq __attribute__((aligned(16))) = {
|
||||
0x80140500, /**< k1 */
|
||||
0x42000100, /**< k2 */
|
||||
0x90042100, /**< k3 */
|
||||
0xffff83ff, /**< q */
|
||||
0x80006300, /**< p */
|
||||
0ULL /**< res */
|
||||
};
|
||||
#endif
|
||||
unsigned int crc24b (unsigned char * inptr,
|
||||
int bitlen)
|
||||
uint32_t crc24b(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen = bitlen / 8; /* Change in octets */
|
||||
|
||||
if ( bitlen % 8 || !USE_INTEL_CRC ) {
|
||||
unsigned int crc = 0;
|
||||
int resbit = (bitlen % 8);
|
||||
uint32_t crc = 0;
|
||||
int resbit = (bitlen % 8);
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
// printf("crc24b: in %x => crc %x (%x)\n",crc,*inptr,crc24bTable[(*inptr) ^ (crc >> 24)]);
|
||||
crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)];
|
||||
}
|
||||
while (octetlen-- > 0) {
|
||||
// printf("crc24b: in %x => crc %x (%x)\n",crc,*inptr,crc24bTable[(*inptr) ^ (crc >> 24)]);
|
||||
crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)];
|
||||
}
|
||||
|
||||
if (resbit > 0)
|
||||
crc = (crc << resbit) ^ crc24bTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
|
||||
@@ -215,11 +209,10 @@ unsigned int crc24b (unsigned char * inptr,
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int crc24c (unsigned char * inptr,
|
||||
int bitlen)
|
||||
uint32_t crc24c(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
@@ -234,11 +227,10 @@ unsigned int crc24c (unsigned char * inptr,
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc16 (unsigned char * inptr, int bitlen)
|
||||
uint32_t crc16(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
@@ -253,11 +245,10 @@ crc16 (unsigned char * inptr, int bitlen)
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc12 (unsigned char * inptr, int bitlen)
|
||||
uint32_t crc12(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
@@ -271,11 +262,10 @@ crc12 (unsigned char * inptr, int bitlen)
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc11 (unsigned char * inptr, int bitlen)
|
||||
uint32_t crc11(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
@@ -289,29 +279,27 @@ crc11 (unsigned char * inptr, int bitlen)
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc8 (unsigned char * inptr, int bitlen)
|
||||
uint32_t crc8(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
crc = ((unsigned int)crc8Table[(*inptr++) ^ (crc >> 24)]) << 24;
|
||||
crc = ((uint32_t)crc8Table[(*inptr++) ^ (crc >> 24)]) << 24;
|
||||
}
|
||||
|
||||
if (resbit > 0)
|
||||
crc = (crc << resbit) ^ ((unsigned int)(crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]) << 24);
|
||||
crc = (crc << resbit) ^ ((uint32_t)(crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]) << 24);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc6 (unsigned char * inptr, int bitlen)
|
||||
uint32_t crc6(unsigned char* inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
uint32_t crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
|
||||
@@ -33,9 +33,12 @@
|
||||
|
||||
//#define cmin(a,b) ((a)<(b) ? (a) : (b))
|
||||
|
||||
static uint32_t bitrev[32] = {0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31};
|
||||
static uint32_t bitrev_x3[32] = {0,48,24,72,12,60,36,84,6,54,30,78,18,66,42,90,3,51,27,75,15,63,39,87,9,57,33,81,21,69,45,93};
|
||||
static uint32_t bitrev_cc[32] = {1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31,0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30};
|
||||
static const uint32_t bitrev[32] = {0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30,
|
||||
1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31};
|
||||
static const uint32_t bitrev_x3[32] = {0, 48, 24, 72, 12, 60, 36, 84, 6, 54, 30, 78, 18, 66, 42, 90,
|
||||
3, 51, 27, 75, 15, 63, 39, 87, 9, 57, 33, 81, 21, 69, 45, 93};
|
||||
static const uint32_t bitrev_cc[32] = {1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31,
|
||||
0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30};
|
||||
|
||||
//#define RM_DEBUG_TX 1
|
||||
//#define RM_DEBUG 1
|
||||
@@ -174,7 +177,7 @@ uint32_t sub_block_interleaving_cc(uint32_t D, uint8_t *d,uint8_t *w) {
|
||||
|
||||
void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) {
|
||||
uint32_t RTC = (D>>5), ND, ND3;
|
||||
uint32_t row,col,Kpi,index;
|
||||
uint32_t row,col,Kpi;
|
||||
uint32_t index3,k,k2;
|
||||
int16_t *d1,*d2,*d3;
|
||||
|
||||
@@ -200,7 +203,6 @@ void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) {
|
||||
#ifdef RM_DEBUG2
|
||||
printf("Col %d\n",col);
|
||||
#endif
|
||||
index = bitrev[col];
|
||||
index3 = bitrev_x3[col];//3*index;
|
||||
|
||||
for (row=0; row<RTC; row++) {
|
||||
@@ -208,7 +210,6 @@ void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) {
|
||||
d2[index3] = w[Kpi+k2];
|
||||
d3[index3] = w[Kpi+1+k2];
|
||||
index3+=96;
|
||||
index+=32;
|
||||
k++;
|
||||
k2++;
|
||||
k2++;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user