Compare commits

..

466 Commits

Author SHA1 Message Date
mir
aca2d708ac Avoid -Werror 2023-10-30 13:02:51 +01:00
mir
951eaba61a Generate better assembler as the previous version's code generation was considerably suboptimal 2023-10-30 13:02:51 +01:00
Raphael Defosseux
9a57514bf9 fix(ci): hard coding the lock resource
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-23 20:29:26 +02:00
Robert Schmidt
a062be47cc Merge branch 'integration_2023_w42' into 'develop'
Integration Branch 2023.w42

See merge request oai/openairinterface5g!2403

* !2368 NR UE SRB0
* !2399 build_oai: Auto-detect if terminal supports colors
* !2398 Correctly load channel models
* !2365 Change PDU_Length and tlv length calculation to be inline with SCF 222.10.02
* !2402 chore(ci): enabling the ARM cross-compilation pipeline
* !2397 fix(ci): improve for parallelism issue in Groovy
* !2405 Clean IDE files and remove old documentation
2023-10-23 17:32:07 +00:00
Raphael Defosseux
b7073ebdbc Merge remote-tracking branch 'origin/clean-ide-files-old-doc' into integration_2023_w42 2023-10-23 13:54:58 +02:00
Robert Schmidt
6568d40eca Remove outdated documentation 2023-10-23 13:06:58 +02:00
Robert Schmidt
877efbbb99 .gitignore for common IDE files 2023-10-23 12:56:27 +02:00
Robert Schmidt
dce7b4446d Remove unused iperf/bash performance testing script 2023-10-23 12:54:10 +02:00
Robert Schmidt
9762b63cae Remove VSCode config 2023-10-23 12:52:58 +02:00
Raphael Defosseux
c8168ed4a7 chore(ci): post-review comments fixes
* properly formatted the finalizeSlaveJob function
  * explained the reason and gave an explicit name to the global variable

Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-23 11:10:53 +02:00
Raphael Defosseux
94d4cd7cce Merge remote-tracking branch 'origin/ci-fix-groovy-parallelism-issue' into integration_2023_w42 2023-10-20 11:46:59 +02:00
Raphael Defosseux
24ac96cd40 Merge remote-tracking branch 'origin/Fix_FAPI_PDU_Length' into integration_2023_w42 2023-10-20 11:46:33 +02:00
Raphael Defosseux
470ea73175 Merge remote-tracking branch 'origin/channel_model_fix' into integration_2023_w42 2023-10-20 11:46:07 +02:00
Raphael Defosseux
bd551a6ac1 Merge remote-tracking branch 'origin/nr_ue_use_srb0' into integration_2023_w42 2023-10-20 11:45:44 +02:00
Raphael Defosseux
191ab1a934 Merge remote-tracking branch 'origin/ci-no-color-codes' into integration_2023_w42 2023-10-20 11:45:17 +02:00
Raphael Defosseux
0caa65231f chore(ci): triggering the child pipeline from parent
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-20 11:36:45 +02:00
Raphael Defosseux
80c2bc3fcb fix(arm-build): immintrin.h is not available
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-20 11:36:39 +02:00
Raphael Defosseux
146edd2f4c chore(ci): having a variable to choose simde version
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-20 11:36:29 +02:00
Raphael Defosseux
43d9895caf fix(ci): in case of build failure, having a bit of debug info
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-20 11:36:22 +02:00
Robert Schmidt
bab4ad2d85 Auto-detect if terminal supports colors
This enables build_oai to detect if the output terminal supports colors.
If it does, it will use colors in its output. If it does not, it will
just print the text, without color codes, improving legibility.
2023-10-17 07:16:49 +02:00
Robert Schmidt
09af6d1c31 Remove unused color codes 2023-10-17 07:09:12 +02:00
Rúben Soares da Silva
bfd12e4aa0 Change PDU_Length and TLV length calculation to be inline with SCF 222.10.02
PDU Length is as per SCF 222.10.02: The total length (in bytes) of the
PDU description and  PDU data, without the padding bytes. From
TX_DATA.request we get 8 (2 bytes PDU_Length + 2 bytes PDU_Index + 4
bytes num_TLV ) and from each TLV we get 4 + value size ( 2 bytes tag +
2 bytes length + value size without pading)

Therefore, add function to compute PDU_length() value for
TX_Data.request, taking into account how many TLVs there are.
compute_PDU_length() does not rely on access to `nfapi_nr_pdu_t`.
Put it into nr_mac_common.c to avoid introducing dependencies.
2023-10-17 04:33:57 +02:00
Arash Sahbafard
e46eeffe2a There was a simple bug in detecting the channel models in rfsim which is fixed.
modified:   radio/rfsimulator/simulator.c
2023-10-16 18:08:55 +02:00
francescomani
79cd189160 fix sim compilation 2023-10-16 16:36:38 +02:00
Robert Schmidt
a62bdf36de Merge branch 'integration_2023_w41' into 'develop'
integration_2023_w41

See merge request oai/openairinterface5g!2394

* !2389 Remove global variable rx_spatial_power
* !2364 NR UE PUCCH2 sanitize errors
* !2352 Break DCI processing function into smaller pieces
* !2391 Remove calloc from L1 at CSIRS_PDU conversion function
* !2393 Fix UE assertion due to PUCCH resource lookup all BWPs
* !2307 Improve documentation for L2sim Readme
* !2310 doc(websvr): how to install properly the dependencies
2023-10-16 14:17:11 +00:00
Raphael Defosseux
33e5d7f66e fix(ci): improve for parallelism
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-16 15:46:02 +02:00
Robert Schmidt
5231b9777d Merge remote-tracking branch 'origin/doc-websrv-build-fixes' into integration_2023_w41 2023-10-14 08:18:56 +02:00
Robert Schmidt
362d44c7ba Updade webserver documentation: organize, make less verbose output 2023-10-14 08:18:31 +02:00
Robert Schmidt
f88a6e36b5 Merge remote-tracking branch 'origin/ImprovDocL2sim' into integration_2023_w41 2023-10-14 08:18:11 +02:00
Robert Schmidt
afb770d1b3 Merge remote-tracking branch 'origin/NR-UE-fix-seg-fault-add-bwp' into integration_2023_w41 2023-10-13 11:07:36 +02:00
Robert Schmidt
d6fe889abe Merge remote-tracking branch 'origin/Remove-convert-csirs-pdu-calloc' into integration_2023_w41 2023-10-13 11:05:43 +02:00
Robert Schmidt
7f0dbde135 Merge remote-tracking branch 'origin/break_dci_processing_function_in_smaller_pieces' into integration_2023_w41 2023-10-13 11:05:33 +02:00
Robert Schmidt
be9a3375ed Correctly format nr_ue_process_dci_dl_11() 2023-10-12 21:11:38 +02:00
Robert Schmidt
2f0c31637b Assert when encountering unhandled DCI formats 2023-10-12 21:10:24 +02:00
Robert Schmidt
821ab37f49 Fix table lookup in nr_ue_process_dci_dl_11() 2023-10-12 21:09:12 +02:00
Robert Schmidt
e3b3495488 Merge remote-tracking branch 'origin/NR_UE_sanitize_PUCCH2' into integration_2023_w41 2023-10-12 20:57:48 +02:00
Rúben Soares da Silva
80a6a3e8c3 Fix memory leak and improve convert_csirs_pdu()
- Remove calloc from convert_csirs_pdu function, change return value
  from 'nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *' to
  'nfapi_nr_dl_tti_csi_rs_pdu_rel15_t' to not require call to 'free()'
- Set parameter pointer as const as it's not modified
- Remove cast to fapi_nr_dl_config_csirs_pdu_rel15_t in csi_rx.c as
  ue->csirs_vars[gNB_id]->csirs_config_pdu is already of type
  fapi_nr_dl_config_csirs_pdu_rel15_t.
- Remove casted parameter in call to convert_csirs_pdu and replace with
  csirs_config_pdu obtained earlier from
  ue->csirs_vars[gNB_id]->csirs_config_pdu.
2023-10-12 20:52:17 +02:00
Sakthivel Velumani
f75519978e fix UE asserver due to PUCCH resource lookup all BWPs 2023-10-12 12:17:46 -04:00
Robert Schmidt
8d2b8895df Review commit 2023-10-12 07:12:06 +00:00
Laurent THOMAS
6b56b46811 Break UE DCI processing function in smaller pieces 2023-10-12 07:46:45 +02:00
Robert Schmidt
34e64ab1eb Remove unused/useless Ethernet variables 2023-10-12 07:46:45 +02:00
Laurent THOMAS
838b284aa4 remove-global-rx_spatial_power_in_gnb 2023-10-10 15:45:21 +02:00
Robert Schmidt
91a30e9a2a Correct return type of do_RRCSetupRequest() 2023-10-10 15:40:26 +02:00
Robert Schmidt
7157e7fd9a Remove unused fields of NR_RRC_MAC_CCCH_DATA_IND message 2023-10-10 15:40:26 +02:00
Robert Schmidt
9aee7bf745 srb0 rnti 2023-10-10 15:40:26 +02:00
francescomani
9189129985 Use SRB0 at UE
- Use SRB0 TM entity at UE for Msg.3/RRC Setup Request
- Msg3 data request sent upon reception of Msg2, then we get data from
  rlc when needed
2023-10-10 15:40:26 +02:00
Robert Schmidt
be9b84c03f Refactor interface SRB0: no gNB MAC 2023-10-10 15:40:26 +02:00
Robert Schmidt
bba1418811 Merge branch 'integration_2023_w40' into 'develop'
integration_2023_w40

See merge request oai/openairinterface5g!2381

* !2345 fix bug for IE cause in pdu session accept
* !2361 Fix Msg3 MAC CE C-RNTI
* !2371 fix(ci): printing the warning and error lines for CI purposes
* !2374 Fix SSB ARFCN: wrong ARFCNs in FDD
* !2379 fix the selection of DCI candidates at UE
* !2369 Add bwp_size and bwp_start fields to CSI_RS PDU struct at NR UE
* !2349 E2AP Version 1,2,3 and KPM version 2, 3
* !2375 increase the max fd of rfsim, that have been shorten to tightly for cpu saving
* !2367 chore(ci): improve GitLab <-> Jenkins contributor experience
* !2378 F1AP: correct message handling
* !2370 NR PDCP RB suspend
* !2107 Compute RI based on SRS up to 4
* !2339 PUCCH power computation
* !2382 Remove dead code in NR UE
* !2229 PUSCH LLR 128/256 SIMDe routines for ARM/x86
2023-10-10 05:35:04 +00:00
Robert Schmidt
7957b466d4 Merge remote-tracking branch 'origin/pusch-llr-SIMDe' into integration_2023_w40 2023-10-09 16:48:37 +02:00
Robert Schmidt
2635cf4817 Merge remote-tracking branch 'origin/remove-dead-code-nrue' into integration_2023_w40 2023-10-09 08:12:43 +02:00
Robert Schmidt
a8fa1b0e52 Merge remote-tracking branch 'origin/develop-pucch-power' into integration_2023_w40 2023-10-08 17:48:26 +02:00
Robert Schmidt
16e15b3393 Merge remote-tracking branch 'origin/develop-UL-RI' into integration_2023_w40 2023-10-08 17:48:06 +02:00
Robert Schmidt
08fca7ebce Merge remote-tracking branch 'origin/NR_RB_suspend' into integration_2023_w40 2023-10-08 14:56:17 +02:00
Robert Schmidt
653e66594d Merge remote-tracking branch 'origin/f1ap-msg-correction' into integration_2023_w40 2023-10-08 14:56:09 +02:00
Robert Schmidt
4ff2c4e781 Merge remote-tracking branch 'origin/ci-improve-jenkins-ux' into integration_2023_w40 2023-10-08 14:54:52 +02:00
Robert Schmidt
e160e083d8 Merge remote-tracking branch 'origin/fix-rfsimulator-max-fd' into integration_2023_w40 2023-10-08 14:54:44 +02:00
Robert Schmidt
146217fc90 Merge remote-tracking branch 'origin/e2ap_v3_v2' into integration_2023_w40 2023-10-08 14:54:32 +02:00
Robert Schmidt
bcbb0d5905 Merge remote-tracking branch 'origin/Fix-CSI_RS-PDU-at-UE' into integration_2023_w40 2023-10-08 12:35:54 +02:00
Robert Schmidt
806842a087 Merge remote-tracking branch 'origin/NR_UE_DCI_candidates' into integration_2023_w40 2023-10-08 12:35:42 +02:00
Robert Schmidt
c3df9c277f Remove warning about new CellGroupConfig
It is *normal* to receive new CellGroupConfigs from the DU, hence a
warning is not warranted.
2023-10-08 12:28:30 +02:00
Robert Schmidt
4066fd4ba2 UE Context Modification Handler: also trigger CellConfig if only UE Capability changes 2023-10-08 12:28:30 +02:00
Robert Schmidt
aaef0b5e74 F1 UE Ctxt Modif Req: forward Capabilities, ignore other CU2DU
- forward capabilities to update CellGroupConfig
- Do not require measConfig/cG_ConfigInfo to be NULL, but ignore them,
  as it is not implemented
2023-10-08 12:27:38 +02:00
Laurent THOMAS
584fb235cd remove-dead-code-nrue 2023-10-06 18:00:18 +02:00
Quency Lin
f451f62c9c Fix cannot pass sanitizer, Align to 16 for 2 contiguous 256 SIMDe 2023-10-06 16:39:51 +02:00
Robert Schmidt
68a82e0b7d F1 Initial UL RRC message: fill PLMN and Cell ID 2023-10-06 15:56:36 +02:00
Robert Schmidt
84ffd14a8f Correctly handle UE Ctxt Modif RRC container
The RRC container is to be handled by the msg handler in
mac_rrc_dl_handler.c. Therefore, don't forward the RRC message, but copy
it into the message so the handler can take the action.
2023-10-06 15:56:30 +02:00
Robert Schmidt
21795b3b88 Correctly encode NRCGI in F1 UE Ctxt Modif Req
The two hardcoded PLMNs are never executed: they are in an if(0) block
2023-10-06 15:56:23 +02:00
Robert Schmidt
b7746e9bfd Merge remote-tracking branch 'origin/fix-ssb-arfcn' into integration_2023_w40 2023-10-06 15:38:42 +02:00
Robert Schmidt
8de0f50087 Merge remote-tracking branch 'origin/ci-fix-warning-recovery' into integration_2023_w40 2023-10-06 15:38:35 +02:00
Robert Schmidt
fe3aa3ddc3 Merge remote-tracking branch 'origin/fix-Msg3-MAC-CE-CRNTI' into integration_2023_w40 2023-10-06 15:38:28 +02:00
Robert Schmidt
8a80517a2d Merge remote-tracking branch 'origin/fix-pdu-session-accept-cause' into integration_2023_w40 2023-10-06 15:38:20 +02:00
Laurent THOMAS
f8c122a7cf increase the max fd of rfsim, that have been shorten to tightly for cpu saving 2023-10-06 11:21:27 +02:00
francescomani
8934c7db10 fix the selection of DCI candidates at UE 2023-10-05 18:09:02 +02:00
mir
3fbc20412a Bug in j and i idx 2023-10-05 15:04:47 +02:00
mir
58134a29d9 Fixes from Teodora applied 2023-10-05 14:54:39 +02:00
Rúben Soares da Silva
9bee85dbe2 Remove previously added bwp_size and bwp_start fields from struct fapi_nr_dl_config_csirs_pdu_rel15_t.
Create function to obtain nfapi_nr_dl_tti_csi_rs_pdu_rel15_t from fapi_nr_dl_config_csirs_pdu_rel15_t without bwp_size and bwp_start.
Replace previously problematic cast with call to created function.
2023-10-04 18:46:54 +01:00
Robert Schmidt
06efde1ed9 u0.25prb 2023-10-04 19:03:37 +02:00
Robert Schmidt
072620aa0a Make different Point A/SSB ARFCN multiple of 30kHz 2023-10-04 16:51:45 +02:00
Raphael Defosseux
ed4c634186 fix(ci): printing the warning and error lines for CI purposes
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-04 15:03:57 +02:00
Robert Schmidt
d6285354e4 Properly formulate assert message 2023-10-04 14:30:27 +02:00
mir
0ffb01b9c3 NG-RAN was not compiling due to struct definition missing 2023-10-04 14:20:30 +02:00
Quency Lin
999bdc01c8 fix: Remove miss-hardcoded #define USE_128BIT 2023-10-04 13:57:07 +02:00
mir
12e09526e8 E2AP Version 1,2,3 and KPM version 2, 3 2023-10-04 12:12:53 +02:00
francescomani
832bea2482 implementing PDCP entity suspend 2023-10-04 10:32:38 +02:00
rmagueta
169a9be8cd Fix Msg3 MAC CE C-RNTI
Reset Msg4_ACKed to not schedule ULSCH and DLSCH before RRC Reconfiguration
2023-10-04 06:55:24 +01:00
Quency Lin
e92c827820 fix: SISO 128 SIMDe due to rebase to 2023.w39 2023-10-03 23:49:30 +02:00
Quency Lin
cdcb403538 Refactor: Caculate bit_met_s[0..63] in for-loop 2023-10-03 22:13:31 +02:00
Quency Lin
5424843190 misc: remove debug print and fix wrong index accessing array
Before this MR, openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c:
nr_ulsch_qam64_qam64():
    xmm3 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m5_p1);

Should be instead:
    xmm3 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
2023-10-03 22:13:31 +02:00
Raphael Defosseux
058eb64ed9 chore(ci): adapting to new python build framework.
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-03 22:13:31 +02:00
Quency Lin
8b1f42423b Refactor: 16QAM LLR 128 SIMDe assign 2023-10-03 22:13:31 +02:00
Quency Lin
e8bcd1882c Refactor: minor refactors
* [x] `register simde__m128i xmm0;` -\> `simde__m128i xmm0;`
* [x] `simde__m128i xmm0 = simde_mm_abs_epi16(rxF\[i\]);` declaration in for loop
* [x] `int nb_re64 = nb_re >> 1;` would be better as `int last2re = (nb_re >> 1) - 1;`
* [x] `simde_m_punpckhdq()` is better known as `simde_mm_unpackhi_pi32()`
2023-10-03 22:13:31 +02:00
Quency Lin
7d6a955b49 Fix: variable typo when referencing 2023-10-03 22:06:42 +02:00
Quency Lin
0c4993249f fix: CI failure due to SIMD misalignment 2023-10-03 22:03:40 +02:00
Quency Lin
797f8cec80 Refactor: Make qam64_qam64 more compact
Use local arrays and for-loop to replace duplicated statements.
For reference, here is the table of index v.s. old local variable
qam64 qam64
psi_r_, psi_i_, a_r_, a_i_, psi_a_, a_sq_, bit_met_
 0 p7_p7    16 p3_p7    32 m1_p7    48 m5_p7
 1 p7_p5    17 p3_p5    33 m1_p5    49 m5_p5
 2 p7_p3    18 p3_p3    34 m1_p3    50 m5_p3
 3 p7_p1    19 p3_p1    35 m1_p1    51 m5_p1
 4 p7_m1    20 p3_m1    36 m1_m1    52 m5_m1
 5 p7_m3    21 p3_m3    37 m1_m3    53 m5_m3
 6 p7_m5    22 p3_m5    38 m1_m5    54 m5_m5
 7 p7_m7    23 p3_m7    39 m1_m7    55 m5_m7
 8 p5_p7    24 p1_p7    40 m3_p7    56 m7_p7
 9 p5_p5    25 p1_p5    41 m3_p5    57 m7_p5
10 p5_p3    26 p1_p3    42 m3_p3    58 m7_p3
11 p5_p1    27 p1_p1    43 m3_p1    59 m7_p1
12 p5_m1    28 p1_m1    44 m3_m1    60 m7_m1
13 p5_m3    29 p1_m3    45 m3_m3    61 m7_m3
14 p5_m5    30 p1_m5    46 m3_m5    62 m7_m5
15 p5_m7    31 p1_m7    47 m3_m7    63 m7_m7

y0
 0 y0_p_7_7   16 y0_p_3_7
 1 y0_p_7_5   17 y0_p_3_5
 2 y0_p_7_3   18 y0_p_3_3
 3 y0_p_7_1   19 y0_p_3_1
 4 y0_m_7_1   20 y0_m_3_1
 5 y0_m_7_3   21 y0_m_3_3
 6 y0_m_7_5   22 y0_m_3_5
 7 y0_m_7_7   23 y0_m_3_7
 8 y0_p_5_7   24 y0_p_1_7
 9 y0_p_5_5   25 y0_p_1_5
10 y0_p_5_3   26 y0_p_1_3
11 y0_p_5_1   27 y0_p_1_1
12 y0_m_5_1   28 y0_m_1_1
13 y0_m_5_3   29 y0_m_1_3
14 y0_m_5_5   30 y0_m_1_5
15 y0_m_5_7   31 y0_m_1_7

rho_r
 0 pi_7_7   16 pi_3_7
 1 pi_7_5   17 pi_3_5
 2 pi_7_3   18 pi_3_3
 3 pi_7_1   19 pi_3_1
 4 mi_7_1   20 mi_3_1
 5 mi_7_3   21 mi_3_3
 6 mi_7_5   22 mi_3_5
 7 mi_7_7   23 mi_3_7
 8 pi_5_7   24 pi_1_7
 9 pi_5_5   25 pi_1_5
10 pi_5_3   26 pi_1_3
11 pi_5_1   27 pi_1_1
12 mi_5_1   28 mi_1_1
13 mi_5_3   29 mi_1_3
14 mi_5_5   30 mi_1_5
15 mi_5_7   31 mi_1_7
2023-10-03 22:03:40 +02:00
Quency Lin
465fc55e20 Refactor: Make qam16_qam16 more compact
Use local arrays and for-loop to replace duplicated statements.
For reference, here is the table of index v.s. old local variable
suffix.
 0 p1_p1            0 rpi_1_1
 1 p1_p3            1 rpi_1_3
 2 p3_p1            2 rpi_3_1
 3 p3_p3            3 rpi_3_3
 4 p1_m1            4 rmi_1_1
 5 p1_m3            5 rmi_1_3
 6 p3_m1            6 rmi_3_1
 7 p3_m3            7 rmi_3_3
 8 m1_p1
 9 m1_p3
10 m3_p1
11 m3_p3
12 m1_m1
13 m1_m3
14 m3_m1
15 m3_m3
2023-10-03 22:03:40 +02:00
Tsung-Yu Chan
526363dfad fix / add the static for max_epi16 2023-10-03 22:03:40 +02:00
Quency
e241edf287 feat / SISO: Use 128/256 SIMDe for ARM64/x86 2023-10-03 22:03:40 +02:00
Quency
b46479889d misc / Reorder inlines and add architecture guard 2023-10-03 21:32:55 +02:00
Quency
3ce1f6517d fix / warnings in nr_ulsch_llr_computation.c 2023-10-03 21:32:55 +02:00
Quency
7e9968451f feat / Turn #define into static inline functions 2023-10-03 21:32:55 +02:00
Quency
a7af689d50 feat / MIMO: Use 128/256 SIMDe for ARM64/x86 2023-10-03 21:32:55 +02:00
rmagueta
313419180f PUCCH power computation in a different way 2023-10-03 17:06:49 +01:00
Rúben Soares da Silva
c603bcc146 Add bwp_size and bwp_start fields to struct fapi_nr_dl_config_csirs_pdu_rel15_t, for usage in the UE
Fill bwp_size and bwp_start fields with values from BWP.
2023-10-03 13:36:15 +01:00
Robert Schmidt
0be397b238 Merge branch 'integration_2023_w39' into 'develop'
integration_2023_w39

See merge request oai/openairinterface5g!2363

* !2142 Fix packing/unpacking procedures for P7 messages
* !2253 Parallelize the Compensation, LLR, layer de-mapping, and unscrambling with symbol
* !2319 Fix NR UE init RA
* !2343 Reverse bits in UCI message when using polar encoding/decoding
* !2348 Resolve "SIGSEGV in nr-softmodem @ 100MHz on USRP"
* fix phytest-timing thresholds after merge of !2253
* !2320 Reduce ITTI log message volume when queues full
* !2360 nr rlc: minor: fix tests
* !2359 nr rlc am: bugfix: correct usage of tx_next
* !2356 Const return values
* !2357 Fix compile error when --build-e2 option included
* !2340 Resolve "gNB build on ubuntu 22.04 fails with dpkg error"
* !2362 Implement F1 bearer release and add telnet module
* !2324 Refactor gNB ULSCH decoding
* fix for SSB ARFCN in RRC MeasConfig
2023-10-03 12:20:45 +00:00
Robert Schmidt
f3910e7707 MeasConfig: give SSB ARFCN, not Point A
The UE should measure on the SSB, otherwise it does not see anything.
Hence, this commit fixes the meas-config to request the UE to measure
on the right frequency.
2023-10-03 11:19:09 +02:00
Robert Schmidt
280c987938 Merge remote-tracking branch 'origin/one-step-cleaning-gNB-ulsch-decoding' into integration_2023_w39 2023-10-03 09:35:18 +02:00
Robert Schmidt
2676e9a5bf Merge remote-tracking branch 'origin/bearer-release' into integration_2023_w39 2023-10-03 07:49:39 +02:00
Robert Schmidt
e197671103 Merge remote-tracking branch 'origin/683-gnb-build-on-ubuntu-22-04-fails-with-dpkg-error' into integration_2023_w39 2023-10-03 07:49:07 +02:00
Robert Schmidt
e1461d95f3 Merge remote-tracking branch 'origin/compile_fix_e2_agent' into integration_2023_w39 2023-10-02 17:34:47 +02:00
Robert Schmidt
40fbe8b0cd Merge remote-tracking branch 'origin/const_return_values' into integration_2023_w39 2023-10-02 17:34:41 +02:00
Robert Schmidt
73e8db7fb2 Merge remote-tracking branch 'origin/nr-rlc-fix-tx-next' into integration_2023_w39 2023-10-02 17:34:34 +02:00
Teodora
2eaac0351d Fix compile error when --build-e2 option included
- modify byte_array.h in order to avoid conflict for same file names
2023-10-02 15:40:36 +02:00
Robert Schmidt
c6e9992e81 Make LCID output nicer 2023-10-02 14:57:03 +02:00
Robert Schmidt
6a7d7e1844 Telnet module to manually/release DRBs of UE 2023-10-02 14:57:03 +02:00
Robert Schmidt
203df298a8 Provide possibility to release DRBs in RRC
- Currently no fields to store DRB release: need persist in ASN
  structure
- This will be revisited once there is E1 bearer release release
2023-10-02 14:57:03 +02:00
Robert Schmidt
3b936c9a50 Handle DRB release at MAC 2023-10-02 14:57:03 +02:00
Robert Schmidt
dc64ac3ab3 Rename nr_rlc_release_entity() for consistency
Most functions start with nr_rlc_*(), so do the same for release
2023-10-02 14:57:03 +02:00
Robert Schmidt
51862543e4 Rename to nr_pdcp_release_{d,s}rb() for consistency
Most functions start with nr_pdcp_*(), so do the same for release.
2023-10-02 14:57:03 +02:00
Robert Schmidt
67eadd4d53 Add newGtpuDeleteOneTunnel() to remove one GTP tunnel 2023-10-02 14:57:03 +02:00
Robert Schmidt
6a076c8490 F1 UE Context Modif Req: Implement DRB Release
- Add necessary fields to F1 message
- Add F1AP encoding/decoding of UE Ctxt Modif Req DRB Release
2023-10-02 14:57:03 +02:00
Robert Schmidt
03c8502e5e Merge remote-tracking branch 'origin/nr-rlc-fix-tests' into integration_2023_w39 2023-10-02 14:21:30 +02:00
Robert Schmidt
48d2f999d7 Merge remote-tracking branch 'origin/improve-itti-log' into integration_2023_w39 2023-10-02 14:21:15 +02:00
Robert Schmidt
41ea99c5d1 Adapt timing thresholds after merge of !2253 2023-10-02 14:18:24 +02:00
mir
b07e9f32c4 Remove return const values 2023-10-02 14:15:42 +02:00
Raphael Defosseux
f9ab9ca137 chore(ci): the failing test-case bullet will directly point to the HTML report
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-02 14:08:11 +02:00
Raphael Defosseux
06e63f7cca chore(ci): report in the GitLab MR comment the list of failing test stages
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-02 13:27:05 +02:00
Raphael Defosseux
c481aad0c8 chore(ci): all pipelines should have the MR ID and branch in the description
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-10-02 13:26:26 +02:00
Rúben Soares da Silva
602879539c Change section "Adapt the 'docker-compose' to your environment" to reflect the contents of docker-compose.yaml 2023-09-29 11:14:13 +01:00
Laurent THOMAS
d448b5e549 remove 'B' from persisted data, replace 3824 hardcoded by it's existing define 2023-09-29 10:23:54 +02:00
Robert Schmidt
728d8027de Merge remote-tracking branch 'origin/684-sigsegv-in-nr-softmodem-100mhz-on-usrp' into integration_2023_w39 2023-09-28 20:15:05 +02:00
Robert Schmidt
91c5bccc05 Merge remote-tracking branch 'origin/bugfix-uci-bit-extraction' into integration_2023_w39 2023-09-28 20:14:56 +02:00
Robert Schmidt
1bc08b652d Merge remote-tracking branch 'origin/NR_fix_init_RA_UE' into integration_2023_w39 2023-09-28 20:14:47 +02:00
francescomani
23c1ea021b fix for errors caught with sanitize in PUCCH2 2023-09-28 18:08:02 +02:00
Robert Schmidt
58d497e8bb Merge remote-tracking branch 'origin/pusch-llr-parallelize' into integration_2023_w39 2023-09-28 15:44:33 +02:00
Robert Schmidt
c4f3d6d7fe ue_context_modification_request(): check if UE exists 2023-09-28 14:59:06 +02:00
Cedric Roux
8aea710a6c nr rlc: minor: fix tests
delete() has changed its name
2023-09-28 10:52:55 +02:00
Cedric Roux
82e83bc6a6 nr rlc am: bugfix: correc usage of tx_next
tx_next was increased only when all segments of an SDU were sent to
lower layers. This may lead to a situation where the receive entity
transmits a control PDU that is rejected because it sets its ACK to
tx_next+1 (if all segments were not transmitted when the control PDU
is sent).

What is done now is to increase tx_next as soon as we send the first
segment of an SDU to lower layers. A control PDU received from the
receive entity is now accepted and processed.

Specifications (38.322 5.2.3.1.1) say to increase tx_next when the
RLC entity receives an SDU from upper layers. But for us, since the
buffering of SDUs is done in the RLC layer and since the buffer size
may be big, we may increase tx_next too much. The choice has been
made to increase it only when we transmit an SDU to lower layers.
We may change this logic if needed. (But it won't be simple.)
2023-09-28 10:40:11 +02:00
Rúben Soares da Silva
8e59ef77db Fix Packing and Unpacking procedures for FAPI P7 messages
Creation and usage of packing/unpacking functions for DCI payload

Update Proxy commit id for CI

Apply formatting on changed functions and fix pull/push return value checking
2023-09-28 09:45:30 +02:00
luis_pereira87
dbdfe06d1e Fix comment from 10% to 25% 2023-09-27 16:01:26 +01:00
luis_pereira87
cf36c6d893 Improvements to reduce ITTI log message volume when queues full 2023-09-27 15:59:08 +01:00
luis_pereira87
debd35a877 Apply function with better performance to reverse bits for polar encoder/decoder in PBCH 2023-09-27 08:30:06 +01:00
luis_pereira87
2360925e29 Reverse bits in UCI message when using polar encoder/decoder 2023-09-27 08:30:06 +01:00
luis_pereira87
58f6cb2af9 Implement function for reversing bits with better performance 2023-09-27 08:30:06 +01:00
Laurent THOMAS
4de550f040 fix bug for IE cause in pdu session accept 2023-09-25 15:26:51 +02:00
Laurent THOMAS
7cb8988372 one-step-cleaning-gNB-ulsch-decoding 2023-09-25 15:22:08 +02:00
Laurent THOMAS
d19302fb40 revert last change 2023-09-25 15:21:21 +02:00
Laurent THOMAS
91497ece94 Reduce ITTI log verbosity
Only print messages when queue grows by 10%, and add log if message
queue size shrinks
2023-09-25 15:14:21 +02:00
Laurent THOMAS
fab0a3de3e increase CI time to 'deploy' 2023-09-25 15:14:21 +02:00
Tsung Yu Chan
fc2432e93b chore / simplify the code and add the comment
- simplify the buffer alignment
  - add the comment for llr
  - clean unused variable
2023-09-25 12:48:28 +02:00
Tsung Yu Chan
0263b4a807 chore / remove the unused variable 2023-09-25 12:48:28 +02:00
Tsung Yu Chan
5231a3ab74 fix / fix the transfrom precoding error when qpsk
- avoid the nr_freq_equalization when qpsk
  - do the stop_meas when use the lepc offload
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
62ad185df9 fix / fix the length of ce estimation buffer 2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
f4beb879cc fix / unscrambling runtime error
- fix the unscrambling runtime error
  - avoid to many variables pass by function
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
9db99b2fd2 feat / add ptrs module 2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
39e7e09152 fix / set the output shift to correct value 2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
090ac4870d fix / init the variable
init the PUSCH symbols per thread to avoid for stucking
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
e54d4a98b6 fix / fix the log2_maxh for llr
- init the variable for simde_m256i avoid error in ubuntu
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
428af852a0 fix / clean the unused variable 2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
e51d8a9bc9 feat / compact the code
- merge the inner_rx
  - rewrite the ulsch channel compensation
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
04073b03e4 feat / add the MMSE and precoding
- avoid the finction duplication
  - add the transform predoding to the nr_rx_pusch_tp
  - add the MMSE for 2 layer which modulation greater than 16 qam
  - can support to 256 qam for 1 layer and 2 layer
2023-09-25 12:48:28 +02:00
Tsung-Yu Chan
1a42fa5326 feat / parallelize LLR by symbol 2023-09-25 12:48:27 +02:00
Robert Schmidt
9127258a54 Merge branch 'integration_2023_w38' into 'develop'
integration_2023_w38

See merge request oai/openairinterface5g!2354

* !2296 rfsimulator optimization
* !2344 NR UE DCI config small fixes
* !2342 Fix for PBCH decoding
* !2347 Handle NAS registration accept inside NAS downlink
* !2350 Tutorials: upgrade UHD version to 4.5.0.0
* !2351 NR UE HARQ fix
* !2304 Use F1 internally: F1 Setup
* !2306 nr_ulsim and nr_dlsim logging and help modifications
* !2305 NR UE RRC bearers management
* !2353 Fix documentation references to "telnetsrv"
2023-09-25 07:22:18 +00:00
Robert Schmidt
0ae48e3441 Merge remote-tracking branch 'ferrieux/ferrieux-develop-patch-45702' into integration_2023_w38 2023-09-24 17:46:06 +02:00
Robert Schmidt
f5cc51b4a8 Merge remote-tracking branch 'origin/NR_UE_RRC_manage_RLC_PDCP' into integration_2023_w38 2023-09-24 17:42:58 +02:00
Robert Schmidt
deb443dc2a Merge remote-tracking branch 'origin/interns_summer23' into integration_2023_w38 2023-09-24 17:42:34 +02:00
Robert Schmidt
d16c4c370e Merge remote-tracking branch 'origin/int-f1-setup' into integration_2023_w38 2023-09-24 17:41:48 +02:00
Robert Schmidt
00acfe3049 Merge remote-tracking branch 'origin/NR_UE_harq_fix' into integration_2023_w38 2023-09-22 12:32:44 +02:00
Robert Schmidt
0d1fdd7a11 Merge remote-tracking branch 'origin/NR_SA_Tutorials' into integration_2023_w38 2023-09-22 12:32:30 +02:00
Robert Schmidt
f3bd3ec449 Merge remote-tracking branch 'origin/add-registration-accept-inside-nas-downlink' into integration_2023_w38 2023-09-22 12:32:20 +02:00
Nada Bouknana
32e4d66c74 Improve nr_dlsim/nr_ulsim help message and CSV file logs
- Reorder help messages
- Add possibility to log results per SNR to CSV file with `-X` or `-Z`
- Reformat files

Co-authored-by: MoadMaroufi <maaroufi.moaad321@gmail.com>
Co-authored-by: francescomani <email@francescomani.it>
Co-authored-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2023-09-22 12:03:52 +02:00
francescomani
cf1baafd75 fixing release according to review 2023-09-22 11:52:24 +02:00
francescomani
e7c626a79e release RB entities 2023-09-22 11:40:49 +02:00
francescomani
18892963a9 cleanup and fixes 2023-09-22 11:40:49 +02:00
francescomani
3d824e3958 handling release of RLC entity 2023-09-22 11:40:49 +02:00
francescomani
f8464b9e91 MAC configuration of logical channel identities 2023-09-22 11:40:49 +02:00
francescomani
0982bf2683 correctly setting SRB IDs when calling PDCP and code refactoring 2023-09-22 11:40:49 +02:00
francescomani
53348bd41d improving DRB management at RRC UE 2023-09-22 11:40:49 +02:00
francescomani
b0b57402f3 managing RLC bearer configuration at RRC UE 2023-09-22 11:40:49 +02:00
francescomani
d8cb2491bd improve handling of SRBs at RRC UE 2023-09-22 11:40:49 +02:00
Robert Schmidt
3ad4c8502a Merge remote-tracking branch 'origin/NR_UE_PBCH_fix' into integration_2023_w38 2023-09-22 08:38:41 +02:00
Robert Schmidt
484db764cf Merge remote-tracking branch 'origin/NR_UE_DCI_config_fixes' into integration_2023_w38 2023-09-22 08:38:29 +02:00
Robert Schmidt
d8c8c6b103 Merge remote-tracking branch 'origin/rfsimu-optim' into integration_2023_w38 2023-09-22 08:38:18 +02:00
Robert Schmidt
3f46a71157 SCTP assoc_id: Make it sctp_assoc_t, project-wide 2023-09-22 08:22:15 +02:00
Robert Schmidt
f5c90ead7e Free DU at CU on lost connection, store assoc ID
- store the assoc ID of a UE at the RRC
- if F1 receives an SCTP shutdown, it removes the endpoint
- F1 will also send an "F1 Lost Connection" message to the RRC
- it is not yet possible to reconnect a DU after it had already been
  connected at the CU, since the CU F1AP task will try to rebind GTP,
  which fails
2023-09-22 08:22:15 +02:00
Robert Schmidt
62fd56f904 DCCH free memory 2023-09-22 08:22:15 +02:00
Robert Schmidt
567ab39153 Free RRC UE data 2023-09-22 08:22:15 +02:00
Robert Schmidt
d94a4e545d Free scheduler UE data 2023-09-22 08:22:15 +02:00
Robert Schmidt
78290f9127 Fix memory leak in rrc_gNB_decode_dcch()
- Free the memory
- for NGAP NAS UL and NAS First request, allocate memory to avoid
  use-after-free errors
2023-09-22 08:22:15 +02:00
Robert Schmidt
6f8a222698 Free default MeasConfig 2023-09-22 08:22:15 +02:00
Robert Schmidt
1a09c6eeb0 Fix memory leak in nr_rrc_gNB_decode_ccch() 2023-09-22 08:22:15 +02:00
Robert Schmidt
885a029abc Fix memory leaks in do_NR_DLInformationTransfer() 2023-09-22 08:22:15 +02:00
Robert Schmidt
a4c75620ee Fix memory leaks in do_NR_RRCRelease() 2023-09-22 08:22:15 +02:00
Robert Schmidt
a3382f8faa Fix memory leaks in do_RRCSetup() 2023-09-22 08:22:15 +02:00
Robert Schmidt
1b171e798d Fix memory leaks in do_RRCReconfiguration() 2023-09-22 08:22:15 +02:00
Robert Schmidt
c325c6a232 Correctly free memory in do_NR_SA_UECapabilityEnquiry() 2023-09-22 08:22:15 +02:00
Robert Schmidt
c69e8b6895 Clean up do_RRCReconfiguration() 2023-09-22 08:22:15 +02:00
Robert Schmidt
3982cc2e23 Forward UE capabilities to DU and use for CellGroupConfig
- Forward UE capabilities in F1 handlers
- Store at MAC
- Update CellGroupConfig with UE Capabilities of the UE
2023-09-22 08:22:15 +02:00
Robert Schmidt
7e2487c294 Handle CellGroupConfig completely at MAC
- MAC creates CellGroupConfig and sends to RRC
- the RRC does not manually update the CellGroupConfig
- MAC handles the RRC processing timer

In this commit, any updates to the CellGroupConfig previously done at
the RRC don't work. In other words, MIMO etc don't work; this is
implemented in the next commit.

Note that the change to take out spCellConfig during reestablishment is
because after reestablishment, as per spec (38.331 5.3.7.2), the UE
should drop the spCellConfig, which we generate by default on the first
UE connection.

Furthermore, add a new variable apply_cellgroup to signal if, after RRC
processing timer, we wish to apply the CellGroup. In some situations,
e.g., Msg.4 ack, we do not want to apply the CellGroup, because for
instance in reestablishment, we await for a reconfiguration of cellgroup
that would be triggered too early.
2023-09-22 08:22:15 +02:00
Robert Schmidt
fb72b7b9e5 Add parameter verification to force simplified configuration files 2023-09-22 08:22:15 +02:00
Robert Schmidt
a3f76309b3 Clean up CU&DU config files according to F1 Setup changes 2023-09-22 08:22:15 +02:00
Robert Schmidt
325ac4f8e2 Restructure config read: first PLMN info, then SIB1, then F1 Setup request
In NSA case: do not send SIB1
2023-09-22 08:22:15 +02:00
Robert Schmidt
18db5f68ac Put PLMN/TAC/CellID into SIB1, correct CellIdentity encoding 2023-09-22 08:22:15 +02:00
Robert Schmidt
c930563929 Move radio configuration parameters to MAC, SIB1 not initialized!
!SIB1 is not correctly filled! This commit does not work with COTS UEs!
The next commit fixes this.

- Move radio config (e.g., minRXTXTIME, SIB1 TDA, do_SRS, etc) down to
  MAC.
- Some parameters in MAC are redundant: delete them.
- Remove call to nr_mac_config_scc() from RRC and simulators, the MAC
  initialization routine calls it implicitly
2023-09-22 08:22:15 +02:00
Robert Schmidt
67d5f56a3c Read F1 Setup Req at MAC initialization
Previously, filling of F1 Setup Request depended on reading the RRC;
hence, for timing reasons, we only initialized and sent the F1 Setup
Request once the MAC and RRC are ready.

After moving SCC, SCD, MIB, and SIB1 to MAC, the MAC does not depend on
an RRC being present anymore, and hence, the F1 Setup Request does
neither. In this commit, we read the F1 Setup Request after initializing
the MAC.
2023-09-22 08:22:15 +02:00
Robert Schmidt
a62857a74d Compute SSB ARFCN to repair reestablishment 2023-09-22 08:22:15 +02:00
Robert Schmidt
eaf28414ca kssb < 16 or we cannot do reestablishment: add assert in DU 2023-09-22 08:22:15 +02:00
Robert Schmidt
a44a54f3d3 Move SIB1 to MAC
The SystemInformationBlock 1 is handled at the DU and sent to the CU in
the F1 Setup Request. Hence, move it down to the MAC.
2023-09-22 08:22:15 +02:00
Robert Schmidt
5d0ae84ad2 Move MIB to MAC
The MasterInformationBlock is handled at the DU and sent to the CU in
the F1 Setup Response. Hence, move it down to the MAC. Furthermore:

- Change type because MIB_PDU_t is 4G type
- Simplify schedule_nr_mib()
2023-09-22 08:22:15 +02:00
Robert Schmidt
6142d1d74c RRC sctp_in/out_streams not used 2023-09-22 08:22:15 +02:00
Robert Schmidt
0f897b4007 Move ServingCellConfigDedicated to MAC
As with the ServingCellConfigCommon, the ServingCellConfigDedicated is a
radio-related structure to be handled at the DU.
2023-09-22 08:22:15 +02:00
Robert Schmidt
2b29531591 Move ServingCellConfigCommon to MAC
Note: the reestablishment is broken, and a later commit fixes it.

The ServingCellConfigCommon is an inherently radio-related
configuration. As such, it should be handled by the DU, not the CU.
Therefore, move it "down" to the MAC.
2023-09-22 08:22:15 +02:00
Robert Schmidt
f709ee815b Move physCellId to MAC
The PCI is given to the CU from the DU in the F1 Setup Request message.
It is a part of the DU, so move it "down".
2023-09-22 08:22:15 +02:00
Robert Schmidt
b93368f46d Implement Setup Request/Response for F1AP 2023-09-22 08:22:14 +02:00
Robert Schmidt
a23a702acb Setup response handler decoder no SI 2023-09-22 08:18:28 +02:00
Robert Schmidt
f670cc6749 Bug fix F1 Setup Response encoder: check if SIs present 2023-09-22 08:18:28 +02:00
Robert Schmidt
89f3ea3dd0 Wait for F1 Setup Response before unblocking cell
The F1 Setup Response contains the cell(s) to activate. Hence, prevent
the radio from starting by waiting for the F1 Setup Response before
continuing.
2023-09-22 08:18:28 +02:00
Robert Schmidt
aaae82d7b4 Implement F1 Setup Request/Response to be used internally
- send F1 Setup using callback
- store f1 setup req locally for reference
- check F1 Setup Req against RRC data structures:
  * if matches: send F1 Setup Response using callback
  * if not matching: send F1 Setup Failure using callback
- don't send CU config update by default, we don't need this
- if the Setup Response does not contain a cell, don't activate. It is
  possible the CU sends a gNB-CU configuration update, which will
  initialize the structures
2023-09-22 08:18:28 +02:00
Alexandre Ferrieux
08cfd560f2 Fix references to "telnet", it should be "telnetsrv". Otherwise build_oai fails with a very cryptic error message. 2023-09-21 21:09:20 +00:00
francescomani
591697642b fix numerology in computing feedback for PUCCH 2023-09-21 19:04:15 +02:00
Laurent THOMAS
4219839e47 add-registration-accept-inside-nas-downlink as it is a valid 3GPP message and a commercial gNB uses it 2023-09-21 13:30:10 +02:00
Robert Schmidt
925c2d0f1e Remove NRRRC_CONFIGURATION_REQ and initalize RRC properly
Use a struct to initialize the RRC at the beginning, and remove the
NRRRC_CONFIGURATION_REQ. This message is not necessary; the RRC/CU
should be initialized from the F1 Setup Request, coming from the DU.
2023-09-21 12:49:20 +02:00
Robert Schmidt
84d8f6c272 Add stubs for F1 Setup Request/Response/Failure messages 2023-09-21 12:49:20 +02:00
Robert Schmidt
5315d69692 Read SCD in separate function to simplify code 2023-09-21 12:49:20 +02:00
Robert Schmidt
24c61fe1f9 Completely read ServingCellConfigCommon when reading conf
Before this commit, we did not read the ServingCellConfigCommon (SCC)
completely at start; rather, we read most (but not all) of it, then also
the minRXTXTIME, and at RRC initialization in
openair_rrc_gNB_configuration(), we filled the
pusch-TimeDomainAllocationList into the SCC, depending on the
minRXTXTIME.

The reason might be that we read part of the SCC, use that to fill the
NRRRC_CONFIGURATION_REQ, read also the minRXTXTIME (part of the RRC
config), and then we have all we need to "finalize the SCC". Since we
move everything to the MAC, I avoid too much upfront code changes,
hardcode the minRXTXTIME (and check with an assert), and undo this in a
later commit when the "RRC config" relevant for radio parameters, e.g.,
minRXTXTIME, is moved to MAC.

I verified the equality of the SCC before (at the end
openair_rrc_gNB_configuration()) and after (at the end of
get_scc_config()) this commit manually using a printf, assuming that
after RRC initialization, we didn't do any further modifications to the
SCC.  But in fact, I cannot know that we don't do it...
2023-09-21 12:49:20 +02:00
Robert Schmidt
ddd37ca145 Read SCC in separate function, and fill FDD values
- Simplify code by reading the SCC in a separate function
- Fill the F1 Setup Request message correctly in case of FDD, from SCC
2023-09-21 12:49:20 +02:00
Robert Schmidt
0a1b728051 F1 Setup Response: remove unused struct fields 2023-09-21 12:49:20 +02:00
Robert Schmidt
ca374e86eb Refactor F1 Setup Req: sys_info is specific to each cell 2023-09-21 12:49:20 +02:00
Robert Schmidt
d21aa79fe0 Refactor F1 Setup Req: MeasurementTimingInformation is part of cell info 2023-09-21 12:49:20 +02:00
Robert Schmidt
85d8916476 Refactor F1 Setup Req: Move radio info into cell 2023-09-21 12:49:20 +02:00
Robert Schmidt
7456cf945d Refactor F1 Setup Req: Reorganize cellIDs_t and rename to f1ap_served_cell_info_t 2023-09-21 12:49:20 +02:00
Robert Schmidt
3dbcadf244 Refactor F1 Setup Req: TAC is optional 2023-09-21 12:49:20 +02:00
Robert Schmidt
d8276eed3e F1AP: harmonize f1ap_plmn_t type in all messages 2023-09-21 12:49:20 +02:00
Robert Schmidt
d6e99a8218 gnb_config.c: Simplify F1 Setup reading 2023-09-21 12:49:20 +02:00
Robert Schmidt
fd3ecb29b0 Remove unused stuff in F1 module 2023-09-21 12:49:20 +02:00
Robert Schmidt
4badf66973 Add mutexes to CreateF1Inst(), only save data if provided 2023-09-21 12:49:20 +02:00
Robert Schmidt
a241922614 DU: Retry on unsuccessful SCTP connection attempt 2023-09-21 12:49:20 +02:00
Robert Schmidt
632ca15752 Separate F1 Setup Request and network configuration
This branch series implements the usage of the F1 Setup Request
internally at the gNB, even if CU and DU run in the same process. Until
now, the F1 Setup Request contained struct fields to pass IP
configuration to the F1AP module; this information is not necessary in
monolithic, nor should it be relevant when passing the information in
F1 Setup Request.

Therefore, this commit moves all IP connection-related information out
of the F1 Setup Request and into a separate structure instead.  In order
to give the F1AP module the necessary connection information, the
DU_REGISTER_REQ message is introduced that combines the F1 Setup Request
and IP configuration, such that the F1AP module can setup the SCTP
connection and then send the F1 Setup Request message.

In a later commit, there will be a callback for F1 Setup Request at MAC
to simply register the DU at the CU. The monolithic callback will simply
forward the F1 Setup Request The F1AP callback will look up the IP
configuration and create DU_REGISTER_REQ message containing IP
configuration and F1 Setup Request, which is then handled by the F1AP
module. To this end, a separate function in gnb_config.c allows to read
IP information from configuration.
2023-09-21 12:49:20 +02:00
Robert Schmidt
4f7ae5dd2a No double instance book keeping 2023-09-21 12:49:20 +02:00
Robert Schmidt
57876fc13f F1 setup request: message encoder takes struct
Instead of storing the F1 Setup Request implicitly in F1 context, we
provide the F1 Setup Request message to be encoded explicitly to the
encoding function.
2023-09-21 12:49:20 +02:00
Robert Schmidt
45a678cb60 Harmonize call to F1AP_get_next_transaction_identifier()
We ever only have one instance, so hard code that.
2023-09-21 12:49:20 +02:00
Robert Schmidt
96e300dabd F1AP: remove default stream ID, we never use anything else but 0 2023-09-21 12:49:20 +02:00
Robert Schmidt
6e08c4c0bd Remove unused function nr_read_config_and_init() 2023-09-21 12:49:20 +02:00
Robert Schmidt
515b71f995 Remove useless type f1ap_cu_setup_req_t 2023-09-21 12:49:20 +02:00
Robert Schmidt
4be567bb77 Remove unneeded eth_params_n from eNB/UE MAC 2023-09-21 12:49:20 +02:00
Robert Schmidt
e7b971a4af RRC: remove useless/unused variable 2023-09-21 12:49:20 +02:00
Robert Schmidt
3b8c1cd59e Fix memory leak in config_srs() 2023-09-21 12:49:20 +02:00
Robert Schmidt
15c2af2384 get_initial_SpCellConfig(): don't reuse memory
In the case of MIMO, we reused memory to point to the same PUCCH
resource. This is problematic, since ASN_STRUCT_FREE() would try to free
this resource twice.

This commit changes to create distinct memory for the PUCCH resources,
while putting the same configuration to still use the same PUCCH
resource from a radio configuration point of view.
2023-09-21 12:49:20 +02:00
Robert Schmidt
a460794792 Delete dead code 2023-09-21 12:49:20 +02:00
luis_pereira87
8571416ac8 Tutorials: upgrade UHD version to 4.5.0.0 2023-09-21 09:43:52 +01:00
rmagueta
e5804c48d6 Add UE capability config file for 4 ports 2023-09-20 17:19:29 +01:00
rmagueta
6787689537 Compute RI based on SRS up to 4 2023-09-20 17:19:29 +01:00
rmagueta
2fcd538082 SRS processing time measurement 2023-09-20 17:19:29 +01:00
ajit
a6baa6d6f1 Changed max ofdm symbol size to 8192 for 100MHzi USRP 2023-09-20 05:50:08 +05:30
francescomani
f820d74605 fix for scrambling dci and renaming ss_type field 2023-09-19 12:51:42 +02:00
Raphael Defosseux
afc75c5db9 Merge branch 'integration_2023_w37' into 'develop'
integration_2023_w37

* !1909 Rework for aarch64 support after SIMDe integration
* !1995 Fix packing/unpacking for nFAPI P5 messages
* !2228 TDLA, TDLB and TDLC channel models in DLSIM
* !2327 Bugfixes and some rewrite for nr rlc am control PDU reception
* !2331 NR UE HARQ improvements to handle more than 4 per PUCCH
* !2286 Service Models integration - KPM v03.00, GTP, MAC, RLC and PDCP
* !2336 fix(ci): HTML reporting for Ubuntu build fix
* !2338 nr-softmodem: fixed invalid length calculation, leading to segfault
* !2326 Tutorials: Update NR SA Tutorials to be compliant with OAI CN5G pre-2.0 release
* !2334 NR UE DL channel estimation fix
* !2325 Compute ULSCH TB CRC
2023-09-19 07:20:10 +00:00
Raphael Defosseux
29b4e64dfc fix(ci): properly removing docker volumes
Laurent noticed it on one of his MR and confirmed with him:
  -- Volumes have be created the 1st time they ran on avra on July 7th
  -- Volumes were created with not only the raw files but also the nr-softmodem executable

Solution: two-fold:
  1. using the `docker-compose down -v` syntax, the volume is deleted automatically
  2. I added redundancy with the custom command to remove the used volume

Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-18 15:09:30 +02:00
Bruno Mongazon-Cazavet
eac8f3b5d6 Limit some optimization to 1 tx and 1 ue 2023-09-18 13:49:48 +02:00
francescomani
38c5faba9b fix for PBCH decoding with cell ID != 0 2023-09-17 16:37:48 +02:00
ajit
20c23475a2 libuhd removal made generic in build helper 2023-09-15 18:00:27 +05:30
ajit
4ef9e17156 updating libuhd version in build_helper script 2023-09-15 17:05:15 +05:30
Raphael Defosseux
0f25438316 Merge remote-tracking branch 'origin/ULSCH-TB-CRC' into integration_2023_w37 2023-09-15 10:53:12 +02:00
Raphael Defosseux
cc57fea7b3 Merge remote-tracking branch 'origin/NR_UE_DL_channel_estimation_fix' into integration_2023_w37 2023-09-15 10:52:52 +02:00
Raphael Defosseux
7241520072 Merge remote-tracking branch 'origin/dreibh-trx_usrp_read-memory-access-fix' into integration_2023_w37 2023-09-15 10:52:37 +02:00
Raphael Defosseux
6582db99c6 Merge remote-tracking branch 'origin/NR_SA_Tutorials' into integration_2023_w37 2023-09-15 10:52:18 +02:00
luis_pereira87
0994d79585 Tutorials: Update NR SA Tutorials to be compliant with OAI CN5G pre-2.0 release 2023-09-15 07:35:02 +01:00
Robert Schmidt
1987f3259c Merge remote-tracking branch 'origin/raphael/ci-fix-ubuntu-build-log-scheme' into integration_2023_w37 2023-09-14 17:59:19 +02:00
Robert Schmidt
4c83925fc4 Merge remote-tracking branch 'origin/service-models-integration' into integration_2023_w37 2023-09-14 17:59:12 +02:00
Robert Schmidt
f66d995df7 Merge remote-tracking branch 'origin/NR_UE_harq_improvements' into integration_2023_w37 2023-09-14 17:59:04 +02:00
Raphael Defosseux
bd0457e40e doc(ci): restriction on branch naming no longer appply
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-14 15:34:59 +02:00
Teodora
fec1396fb0 Fix CU as E2 node
- when CU is used, UE ID data is filled as GNB_UE_ID_E2SM with
  CU UE ID value included
2023-09-14 12:59:08 +02:00
Robert Schmidt
cf1a0b1cd7 Merge remote-tracking branch 'origin/bugfix-nr-rlc-control-pdu' into integration_2023_w37 2023-09-14 12:31:10 +02:00
Robert Schmidt
0fe4605143 Merge remote-tracking branch 'origin/develop-DL-chModel' into integration_2023_w37 2023-09-14 12:31:03 +02:00
Robert Schmidt
e272dd89e1 Merge remote-tracking branch 'origin/Fix_FAPI_PARAM_and_CONFIG_messages' into integration_2023_w37 2023-09-14 12:30:53 +02:00
Raphael Defosseux
24efc76de0 chore(ci): removing verbose-ci useless option
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-14 12:15:44 +02:00
Raphael Defosseux
ec6e32f3e5 fix(ci): allowing the branch name to be in contributorName/branchName format
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-14 12:11:28 +02:00
Raphael Defosseux
eedcf0708f fix(ci): docker_log_split is useless with current build scheme. Just copying all txt files from ran-build image
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-14 11:35:03 +02:00
Raphael Defosseux
e0b7ebd375 chore(ci): remove the useless verbose-ci option
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-14 09:38:28 +02:00
Teodora
6c73828cd5 Add option to collect data from CU and DU for KPM 2023-09-14 09:38:27 +02:00
Teodora Vladic
505a00c3b3 Update README file in E2AP folder 2023-09-14 09:38:27 +02:00
Robert Schmidt
8db0e44d4c Log which sysctl variables are changed in RFsim 2023-09-14 09:26:35 +02:00
Rúben Soares da Silva
09d7487dc1 Fix packing/unpacking for (n)FAPI PARAM and CONFIG.request/response
- Fix 4G and 5G discrepancy in TLV padding requirements: 4G does not
  need padding, whereas 5G needs, so make separate set of function for
  padding for NR
- Fix packing/unpacking for (n)FAPI PARAM and CONFIG.request/response
  messages
- Handle message padding to next 32-bit boundary, as per SCF
  specification in packing and unpacking functions
- Account for message header size upon receiving message in PNF and VNF
2023-09-14 08:56:19 +02:00
Raphael Defosseux
59ad094271 chore(ci): adding support to cross-compile in python framework
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-13 17:20:08 +02:00
Raphael Defosseux
c6fab23af7 chore(ci): adding 2 dockerfiles to test ARM64 cross-compilation
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-13 17:20:08 +02:00
Tsung-Yu Chan
1f2098fcce feat / work with cross-compile
can compile the target ldpc_generators and generate_T with cross-compiler
2023-09-13 17:20:08 +02:00
Tsung-Yu Chan
73bc34b278 fix / compile on ARM 2023-09-13 17:20:08 +02:00
Laurent THOMAS
5c7c51089b remove useless macro, the SIMD instruction is used in other places 2023-09-13 17:20:08 +02:00
Quency Lin
cb562c2769 Remove partial 256 SIMDe dependence for ARM 2023-09-13 17:20:08 +02:00
Raymond Knopp
47e150fbb8 fixes radix-2 butterfly for NEON, dft size 512 works properly now 2023-09-13 17:20:08 +02:00
Laurent THOMAS
fa73c14df6 Reintroduce unscrambling C implemantation, use SIMDE for Intel and ARM 2023-09-13 17:20:08 +02:00
Laurent THOMAS
a62641f9f3 remove race condition on norm128 global 2023-09-13 17:20:04 +02:00
Raymond Knopp
a7bc282302 First-level of support for new aarch64 machines
Testing on Neoverse N1 (Ampere 3GHz). Tested only on a subset of phy-simulators.

- Changes:
- use SIMDE consistently
- adaptations of LDPC decoder generator for ARMv8 performance
- SIMDe modifications of Intel CRC to allow for aarch64 build.
  optimizations for 128-bit to improve performance of LDPC encode/decode
  on aarch64 (Neoverse 1)
- added BG2 files for 128-bit ldpc encoder (aarch64)
- testing on Xeon
- testing on x86
- minor changes to build/run on x86
- change in crc.h after returning to aarch64
- removed some warning in ldpc decoder generator for x86_64
- char
- Delete irrelevant constants
- Correctly declare variables
- Define stdbool for all architectures
- Remove definition of _MM_SHUFFLE and use SIMDE_MM_SHUFFLE
- Remove commented code
- Fix CMakeLists.txt
- Include SIMDE avx2 functions in tools_defs.h
2023-09-13 17:19:20 +02:00
Bruno Mongazon-Cazavet
21790f9c4f Optimize RFsimulator to improve E2E performance
This improves the RFsimulator code to reach a ~40% E2E throughput
improvement (depending on the machines).

Changes:
- reduce ring buffer size
- code cleanup for readability
- set TCP kernel parameters
2023-09-13 16:36:17 +02:00
Thomas Dreibholz
445a51f5c1 Bugfix: Fix for segfault, due to invalid pointer. 2023-09-13 15:49:51 +02:00
Robert Schmidt
e70213cdf7 CI: declare variable before use 2023-09-13 15:12:16 +02:00
Robert Schmidt
f43090fa01 CI: Wait for Attachment of UEs in L2sim 4G/5G tests 2023-09-13 15:12:16 +02:00
francescomani
07850586f5 fix for dl channel estimation 2023-09-13 08:34:22 +02:00
Robert Schmidt
79fd37b489 Merge branch 'integration_2023_w36' into 'develop'
integration_2023_w36

See merge request oai/openairinterface5g!2333

* !2185 DL delay compensation
* !2255 Add condition to call or not the function nr_mac_prepare_ra_ue()
* !2301 NR UE handling MCS for retransmissions
* !2308 Heap Allocation issue: Removed Dynamic allocation
* !2317 bugfix: don't force an UE to support en-dc, respect its capabilities
* !2318 Set security for all active SRBs after NR_RRCReestablishment
* !2321 Use appropriate CMake flags to link to UHD
* !2332 T tracer: add a trace for NR SIB1
* !2322 Remove small races in ue
* !2323 NR UE fix DCI candidates
* !2328 Add SRB1 and SRB2 received bytes to statistics
2023-09-12 11:37:40 +00:00
Robert Schmidt
f13830cf29 Include log module in ASN.1 config only if necessary 2023-09-12 08:57:16 +02:00
Robert Schmidt
59d1c14dad Merge remote-tracking branch 'origin/Stats_add_srb1_srb2_rx_bytes' into integration_2023_w36 2023-09-11 14:14:03 +02:00
Robert Schmidt
2a94583e29 Merge remote-tracking branch 'origin/NR_fix_UE_max_nb_candidates' into integration_2023_w36 2023-09-11 14:13:51 +02:00
Robert Schmidt
48dd9bb31f Merge remote-tracking branch 'origin/remove-small-races-in-ue' into integration_2023_w36 2023-09-11 14:10:26 +02:00
Robert Schmidt
52abf72c29 Merge remote-tracking branch 'origin/t-trace-nr-sib1' into integration_2023_w36 2023-09-11 09:06:30 +02:00
Robert Schmidt
378516bd4f Merge remote-tracking branch 'origin/wan-sdr_dev' into integration_2023_w36 2023-09-11 09:06:19 +02:00
francescomani
05969631b6 UL HARQ improvements to handle more than 4 per PUCCH 2023-09-11 08:25:59 +02:00
Robert Schmidt
a1c15da786 Merge remote-tracking branch 'origin/SRBs_set_security_after_reestablishment' into integration_2023_w36 2023-09-08 17:25:23 +02:00
Robert Schmidt
f5c502670a Merge remote-tracking branch 'origin/bugfix-nsa-endc' into integration_2023_w36 2023-09-08 17:25:14 +02:00
Robert Schmidt
60f99e510e Merge remote-tracking branch 'origin/HeapAllocIssue' into integration_2023_w36 2023-09-08 17:25:04 +02:00
Robert Schmidt
bb7174997b Merge remote-tracking branch 'origin/NR_UE_MCS_improvements' into integration_2023_w36 2023-09-08 15:09:19 +02:00
Robert Schmidt
0226dc76cb Merge remote-tracking branch 'origin/develop-prepare-ra' into integration_2023_w36 2023-09-08 15:08:55 +02:00
francescomani
e42e1d8065 limiting the number of DCI candidates at UE according to available CCEs 2023-09-08 14:46:00 +02:00
Cedric Roux
9cfa0f239f T tracer: add a trace for NR SIB1 2023-09-07 22:19:50 +02:00
rmagueta
bc295b3ba5 Check ULSCH transport block CRC 2023-09-07 08:31:22 +01:00
luis_pereira87
0ace73bba9 Add SRB1 and SRB2 received bytes to statistics 2023-09-06 06:57:21 +01:00
Cedric Roux
282a20578f nr rlc test: minor: change the logging 2023-09-05 21:55:15 +02:00
Cedric Roux
1272847fea nr rlc am: rewrite process_control_pdu()
A first pass checks that the control PDU is valid.
A second pass processes it for real.
2023-09-05 21:52:30 +02:00
rmagueta
f991dc9ebc Apply channel models TDLA, TDLB and TDLC in DLSIM according to TS 138.101 2023-09-04 18:53:22 +01:00
rmagueta
28438ab5c4 Add ptrs_bit_map input in add_noise() function 2023-09-04 18:37:01 +01:00
rmagueta
a629feec29 Remove duplicated nr_est_delay_pdsch()/nr_est_timing_advance_pusch() functions and just create the function nr_est_delay() 2023-09-04 17:09:35 +01:00
rmagueta
9f7b159039 Remove duplicated function freq2time() 2023-09-04 17:09:35 +01:00
rmagueta
39919152cb Implementation of delay compensation in NFAPI_NR_DMRS_TYPE2_linear_interp() at UE 2023-09-04 17:09:35 +01:00
rmagueta
087f9a0bc2 Implementation of delay estimation in NFAPI_NR_DMRS_TYPE2_linear_interp() at UE 2023-09-04 17:09:35 +01:00
rmagueta
e0ab96eedc Implementation of delay compensation in NFAPI_NR_DMRS_TYPE1_linear_interp() at UE 2023-09-04 17:09:35 +01:00
rmagueta
7611fe671f Implementation of delay estimation in NFAPI_NR_DMRS_TYPE1_linear_interp() at UE 2023-09-04 17:09:35 +01:00
rmagueta
72aae2553a Introduce delay in terms of number of samples in DLSIM 2023-09-04 17:09:35 +01:00
Cedric Roux
f7fe3b448f nr rlc am: harmonize comparisons of SNs in process_control_pdu()
Let's compare SNs in a similar way as done in previous commit, to ease
readability.
2023-09-04 12:26:17 +02:00
Cedric Roux
43f5eecd19 nr rlc am: bugfix: use sn_compare_tx() to compare SNs
The use of < is not correct. SNs are cyclic. We must use sn_compare_tx().
2023-09-04 12:13:46 +02:00
Cedric Roux
e3dbc97723 nr rlc am: prepare variable to be reused 2023-09-04 11:09:06 +02:00
Cedric Roux
b4fea523b9 nr rlc am: bugfix: discard a control PDU if ack-sn is invalid
It is possible to receive an ACK that is not expected, in which
case the whole control PDU has to be discarded.
2023-09-04 11:00:23 +02:00
Raphael Defosseux
67a3184bb3 fix(ci): in case of T1 board defect, no statistics, exit nicely
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-09-01 14:30:04 +02:00
Raphael Defosseux
4c9706a950 chore(ci): little syntax diffs post-upgrade on obelix
Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
2023-08-31 16:59:16 +02:00
maaroufi
e273f80fa8 Apply changes requested by the maintainer 2023-08-31 14:25:09 +02:00
Laurent THOMAS
1b69fc6c5d fix incorrect usage of time_meas() that is not thread safe API 2023-08-30 15:27:33 +02:00
Laurent THOMAS
e74b9a5c29 remove a frame param useless attribute 2023-08-30 15:27:33 +02:00
Robert Schmidt
97b0844031 Merge branch 'integration_2023_w34' into 'develop'
integration_2023_w34

See merge request oai/openairinterface5g!2316

* !2283 going back to sync mode when cell is barred in MIB
* !2290 fix gtp delete. we should not delete all bearer in case of dedicaded bearer release
* !2299 fix-mem-overflow_64qam
* !2288 NR UE avoid crashes upon renewal of SIB1
* !2279 web server enhancement and doc link fix
* !2302 Tutorials: update links for Open Cells SIM Card programming tool and Ubuntu 22.04 LTS
* !2303 NR gNB limit on PUCCH bits to be scheduled
* !2207 Use F1 internally: UE Context Modification Required
* !2315 Fix LCID to RB association, allow more than 8 LCIDs in the UE
2023-08-30 06:13:45 +00:00
Robert Schmidt
f08998af2c Merge remote-tracking branch 'origin/fix-lcid2rb-index-error-and-missing-lcid-greater-than-8' into integration_2023_w34 2023-08-29 14:31:54 +02:00
Laurent THOMAS
f80896f93f Fix LCID to RB association, allow more than 8 LCIDs in the UE 2023-08-29 11:05:40 +02:00
Robert Schmidt
f0923f68fb Merge remote-tracking branch 'origin/int-f1-ue-ctxt-modif-req' into integration_2023_w34 2023-08-29 10:23:34 +02:00
wan-sdr
1936bc06d8 Use UHD_INCLUDE_DIRS and UHD_LIBRARIES to link to UHD. This way works when UHD is installed to /usr/local or a custom prefix
Signed-off-by: wan-sdr <11093-wan-sdr@users.noreply.gitlab.eurecom.fr>
2023-08-28 12:33:12 -04:00
Robert Schmidt
1bb77d65a6 Merge remote-tracking branch 'origin/NR_gNB_PUCCH_bits_code_rate' into integration_2023_w34 2023-08-27 17:54:00 +02:00
francescomani
b8c1129dfe Init RA at the right time at UE 2023-08-25 11:27:42 +02:00
luis_pereira87
2509733678 Set security for all active SRBs after NR_RRCReestablishment 2023-08-25 08:03:08 +01:00
rmagueta
0fb0203c1c Add condition to call or not the function nr_mac_prepare_ra_ue() 2023-08-24 15:59:36 +01:00
Cedric Roux
9f0ec74cf4 bugfix: don't force an UE to support en-dc, respect its capabilities 2023-08-24 16:53:35 +02:00
Robert Schmidt
04eebcbdc3 Merge remote-tracking branch 'origin/NR_SA_Tutorials' into integration_2023_w34 2023-08-24 16:51:34 +02:00
Robert Schmidt
998b58da04 Merge remote-tracking branch 'origin/fix_websrvdoc' into integration_2023_w34 2023-08-24 16:51:21 +02:00
Robert Schmidt
86801cc136 Merge remote-tracking branch 'origin/NR_UE_RRC_SIBs_renewal' into integration_2023_w34 2023-08-24 16:51:09 +02:00
Robert Schmidt
014e02904a Merge remote-tracking branch 'origin/fix-mem-overflow_64qam' into integration_2023_w34 2023-08-24 16:46:48 +02:00
Robert Schmidt
9f7e553e3e Merge remote-tracking branch 'origin/fix-gtp-delete' into integration_2023_w34 2023-08-24 16:46:42 +02:00
Robert Schmidt
21f7128209 Merge remote-tracking branch 'origin/NR_UE_cell_barred' into integration_2023_w34 2023-08-24 16:46:33 +02:00
frtabu
f2849868e8 web server enhancement and doc link fix 2023-08-24 16:02:29 +02:00
francescomani
517d351430 adding a test on max number of bits to be scheduled on pucch according to coderate 2023-08-23 17:46:18 +02:00
francescomani
24dd439aec going back to sync mode when cell is barred 2023-08-23 17:45:59 +02:00
Teodora Vladic
c1864711cd Remove unnecessary include 2023-08-23 17:15:48 +02:00
Teodora Vladic
011a5a3b56 Add O-RAN KPM E2 Service Model
- Add O-RAN KPM SM with DRB.RlcSduDelayDl, DRB.UEThpDl and DRB.UEThpUl measurements
- Add L1M.PHR1.BinX KPM meas
- Add comments for all KPM meas; deleted few outputs (but added in xApp)
- Add DRB.PdcpSduVolumeDL and DRB.PdcpSduVolumeUL KPM meas
- Delete unnecessary rnd functions in ran_func_kpm.c -> path set to
  flexric submodule
2023-08-23 17:15:48 +02:00
Chieh-Chun Chen
e8944c95aa Add Custom FlexRIC E2 Service Models
Co-authored-by: Teodora Vladic <teodora.vladic@openairinterface.org>
2023-08-23 17:15:48 +02:00
Chieh-Chun Chen
76aa112cec Add more RLC stats and correct RLC stats
- Add GOL-delay and AVG-soujour
- Correct the types of/measurement the tx/rxsdu_bytes and tx/rxsdu_occ_bytes
- Update txsdu_avg_time_to_tx value only when measurements activated

Co-authored-by: Teodora Vladic <teodora.vladic@openairinterface.org>
2023-08-23 17:15:48 +02:00
Chieh-Chun Chen
8a4df37e83 nr rlc: rename delete() to delete_entity() 2023-08-23 17:15:48 +02:00
Teodora Vladic
2fef830d42 Update FlexRIC submodule 2023-08-23 17:15:48 +02:00
Laurent THOMAS
4c3d8e7581 fix-mem-overflow_64qam
fix the 64QAM modulator case, that process 192 bits per iteration, then 24 bits per iteration of the tail bits, then added the last two symboles processing (no odd number of symbols case)
2023-08-23 11:14:42 +02:00
luis_pereira87
452615f9d0 Tutorials: update links for Open Cells SIM Card programming tool and Ubuntu 22.04 LTS 2023-08-23 08:53:48 +01:00
maaroufi
1b2a64fe0a Removed white spaces 2023-08-22 12:10:13 +02:00
maaroufi
01c1eba4ff Modified some files to supress warnings 2023-08-22 12:10:13 +02:00
Moaad Maaroufi
ea9bc93f74 Added some changes that I forgot to push in the first commit 2023-08-22 12:10:13 +02:00
maaroufi
87d0eddc2c Modified the code to solve the heap Allocation issue: Removed Dynamic allocation based on the FAPI specifications 2023-08-22 12:10:13 +02:00
maaroufi
416edd1980 Corrected some typos 2023-08-22 10:24:58 +02:00
maaroufi
02c7387c0d Corrected some typos, stripped dollars from bash commands to make it easier to copy and moved section 5 to the beginning because it needs to be followed at the beginning of the tutorial 2023-08-22 10:24:58 +02:00
francescomani
30c401e0fa removing mcs sanity checks 2023-08-22 09:06:14 +02:00
Robert Schmidt
464a62dd97 Merge branch 'integration_2023_w33' into 'develop'
integration_2023_w33

See merge request oai/openairinterface5g!2300

* !2247 Fix cppcheck warnings related to nullPointerArithmeticRedundantCheck
* !2250 Fix cppcheck warnings related to negativeIndex
* !2281 avoid NR UE stalling if SIB not decoded
* !2273 NR_UE: fix limited UL data throughput in do-ra mode
* !2295 hack: see Bye. message when quitting gnb running with aw2s
* !2298 mapping LCID to RBID to index RLC entities
* !2267 Make read-only global variables const, additional fixes
* !2297 nr rlc: change retx logic
* !2230 Readme correction
* Lower scheduler PF averaging constant
2023-08-22 06:05:25 +00:00
Robert Schmidt
8ad215f680 Lower scheduler PF averaging constant
This time constant plays a major role in how long a UE has to wait
maximally before it might be scheduled. For instance, if a UE had a lot
of traffic, the average traffic will be high, pushing the PF coefficient
down. If another UE with no traffic in the past becomes active with
heavy traffic, the first UE might not be scheduled for an extended
period of time.

In the AW2S-Amarisoft UE CI test pipeline, we sometimes see that the
maximum number of RLC retransmissions was reached. While this might not
be the (only) cause, scheduling a UE more often might prevent such
situations, and we saw an improved stability.
2023-08-21 17:16:21 +02:00
Robert Schmidt
4d244c5c7c Update AW2S-Amarisoft CI configuration file 2023-08-21 17:16:19 +02:00
francescomani
e45855f41d handling reserved case of DLSCH MCS 2023-08-19 09:58:40 +02:00
francescomani
26bceb2277 handling reserved case of ULSCH MCS 2023-08-19 08:31:03 +02:00
Robert Schmidt
56ceb76a3a Merge remote-tracking branch 'origin/readme-correction' into integration_2023_w33 2023-08-18 18:17:13 +02:00
Robert Schmidt
d1ac08ffaa Merge remote-tracking branch 'origin/nr-rlc-retx-modification' into integration_2023_w33 2023-08-18 18:16:55 +02:00
Robert Schmidt
c3e04b65df Merge remote-tracking branch 'origin/remove-rw-globals-that-are-not-written' into integration_2023_w33 2023-08-18 18:16:48 +02:00
francescomani
9d45b49c38 do not change BWP at MAC and do not free SIB1 at RRC 2023-08-18 15:39:15 +02:00
Laurent THOMAS
206aa36a47 Make read-only globals const, additional fixes
- Global variables that are never written to are marked const
- Remove some EXTERN declaration
- Remove unused `log_mem_multi` from logging module
2023-08-18 14:20:37 +02:00
Robert Schmidt
a8aa383fee Merge remote-tracking branch 'origin/NR_RLC_LCID_indexing' into integration_2023_w33 2023-08-18 13:05:22 +02:00
Robert Schmidt
f8f7c40830 Merge remote-tracking branch 'origin/fix-bye-aw2s' into integration_2023_w33 2023-08-18 13:04:42 +02:00
Robert Schmidt
d0895b5ebc Merge remote-tracking branch 'origin/avoid_NR_UE_stall_if_SIB1_not_decoded' into integration_2023_w33 2023-08-18 13:04:37 +02:00
Robert Schmidt
417509d146 Merge remote-tracking branch 'origin/NR_UE_fix_do-ra_UL_throughput' into integration_2023_w33 2023-08-18 13:04:32 +02:00
Robert Schmidt
699526236c Merge remote-tracking branch 'origin/negativeIndex_cppcheck_fix_on_w27_2023' into integration_2023_w33 2023-08-18 13:04:26 +02:00
Robert Schmidt
8b87c656e0 Merge remote-tracking branch 'origin/nullPointerArithmeticRedundantCheck_cppcheck_fix_on_w27_2023' into integration_2023_w33 2023-08-18 13:04:19 +02:00
Robert Schmidt
ca96b9e9bf Improve and reformat documentation of config module 2023-08-18 13:02:18 +02:00
Robert Schmidt
336e4a5ef1 Link to LDPC doc from doc/README.md 2023-08-18 12:51:41 +02:00
Robert Schmidt
24f9f87941 Improve 5G RFsim README; clarify how to overwrite the second UE's IMSI 2023-08-18 12:48:50 +02:00
Robert Schmidt
31af346ebc Improve log messages for debugging 2023-08-18 12:34:25 +02:00
Robert Schmidt
35b5782968 CI F1 and F1+E1 tests: increase attenuation to stabilize connection 2023-08-18 12:25:51 +02:00
Robert Schmidt
27f9d6f743 Use nr_generate_Msg4() in the case of Msg.3 with C-RNTI
After removing RA.crnti, there is no need to use a separate function
nr_generate_Msg3_dcch_dtch_response() to generate Msg.4 (yes, the
function mentions Msg3 but it does Msg3 response == Msg.4).

Also, using nr_generate_Msg4() has the advantage that it waits until we
have the reconfiguration available in RLC to be sent to the UE. Finally,
we can delete the old nr_generate_Msg3_dcch_dtch_response() as we don't
need it anymore.
2023-08-18 12:25:51 +02:00
Robert Schmidt
866a76dc4a Correct READMEs of docker-compose files to reflect config mounting 2023-08-18 10:35:23 +02:00
francescomani
cb003e4f10 mapping LCID to RBID to find RLC entity 2023-08-17 10:29:18 +02:00
Cedric Roux
3f8c8b73e2 nr rlc: change retx logic
When t_poll_retransmit expires we need to consider an SDU for
retransmission.

We used to take the first SDU (which could be a segment, not a full SDU)
of the wait list and put it in the retransmit list.

When testing with some UE (Amarisoft UE) a bad behavior was detected.

This is what happens for the SDU with SN 6 (for illustration purpose).

The gNB is sending an SDU in several pieces (it is segmented).

slot n:     rlc sn 6 [1 .. 119[   p=0   RECEIVED
slot n+x:   rlc sn 6 ]120 .. 180[ p=0   RECEIVED
slot n+x+y: rlc sn 6 ]181 .. 210] p=1   not RECEIVED

Then when t_poll_retransmit expires rlc retransmits only the PDU of
slot n (with p=1 this time) and the UE replies with ack 6. So nothing
happens on the gnb side.
(We would have expected ack 7 + nack 6 181..end.)

Then after t_poll_retransmit expires again rlc retransmits only PDU
of slot n and the UE still replies with ack 6.

This goes on forever (or some other timeout occurs.)

The logic is now changed.

When t_poll_retransmit expires we transfer all the SDUs in the wait list
having the same SN as the head of the wait list into the retransmit list.

Testing with Amarisoft UE, it seems to work properly.
2023-08-15 13:16:36 +02:00
Robert Schmidt
93f59a3c6e Remove RA.crnti: it is not needed anymore
The RA.crnti field is marked as being used by NSA mode, but it is not.
OTOH, it is used in the case of RA with Msg.3 with C-RNTI MAC CE. The
latter does not necessarily need it, though, as we can change the RNTI
of the RA process when we receive C-RNTI MAC CE.

This introduces a slight complication, though, as we cannot remove the
MAC UE Context (generated when receiving Msg.3) directly when parsing
the C-RNTI MAC CE. Previously, we had both rnti and crnti in the RA
struct, and when sending Msg.4 after Msg.3 with C-RNTI MAC CE, we would
remove the UE context (this is changed in the next commit). Therefore,
we employ nr_mac_trigger_release_timer() which releases the UE after
60ms, circumventing this complication.
2023-08-14 16:25:02 +02:00
Robert Schmidt
7b7f045f1c DU: trigger UE Context Modification Required and handle 2023-08-14 16:25:02 +02:00
Robert Schmidt
3b87dd30a0 Implement ue_context_modification_required_direct() 2023-08-14 16:25:02 +02:00
Robert Schmidt
d40db13e2a Make reconfiguration work 2023-08-14 16:25:02 +02:00
Robert Schmidt
6337951182 UE Context Modification Required: add RRC handler 2023-08-14 16:25:02 +02:00
Robert Schmidt
e72fa6aa39 Implement F1 handlers 2023-08-14 16:25:01 +02:00
Robert Schmidt
bb63aa79b2 Implement F1AP UE Context Modification Required/Confirm/Refuse F1AP messages 2023-08-14 16:24:59 +02:00
Robert Schmidt
57be09efaf Stubs for F1 UE Context Modification Required/Confirm/Refuse 2023-08-14 16:24:56 +02:00
Robert Schmidt
7fbccc709a Do not trigger RLC bearer establishment from RRC
The RRC should not trigger RLC bearer establishment: this should be done
only via F1, and in the remaining code (removed here), this principle
was violated.

Further, this code was doubly wrong, as it used the CU UE ID for the
RLC, setting up bearers with IDs 1,2,3 etc instead of the RNTI.
2023-08-14 16:24:56 +02:00
Robert Schmidt
7746897f0e Fix: use correct type for F1 UE Context Release Req 2023-08-14 16:24:56 +02:00
Robert Schmidt
cd8cfab768 Remove MAC_NR target: it is not needed
The MAC_NR target is not needed; every dependent target also links
L2_NR. Therefore, this target just creates double compilation. We can
remove it without problems.
2023-08-14 16:23:47 +02:00
Robert Schmidt
f40b4ab297 hack: see Bye. message when quitting gnb running with aw2s
Same commit justification as 50bf571347
2023-08-14 12:17:09 +02:00
Robert Schmidt
5b943f598d Merge branch 'integration_2023_w32' into 'develop'
integration_2023_w32

See merge request oai/openairinterface5g!2293

* !2061 Rel16 NR PRS improvements
* !2113 handle TDD pattern2 at UE
* !2266 Use cmake3 command if on RHEL
* !2287 Initialize OAIgraph before usage
* !2285 Fix alignment of Tpool user data to 32 bytes
* !2284 USRP driver: Make it compile for UHD < 4.0.0
* !2214 Use F1 Internally: switch to CU UE ID in CU
2023-08-14 06:19:33 +00:00
Vaibhav Shrivastava
a6e11e7029 Fix review comments of cppcheck warnings related to nullPointerArithmeticRedundantCheck 2023-08-13 18:35:18 +02:00
Vaibhav Shrivastava
efc5ce39d3 Fix cppcheck warnings related to nullPointerArithmeticRedundantCheck 2023-08-13 18:35:18 +02:00
Robert Schmidt
a082f708b6 Fix: link T into oai_eth_transpro
Via the include of the logging system, the ethernet transport
library implicitly depends on T. Hence, link T into
oai_eth_transpro.
2023-08-12 13:43:40 +02:00
Robert Schmidt
9d6de3b511 Merge remote-tracking branch 'origin/int-f1-ue-ids' into integration_2023_w32 2023-08-12 11:49:40 +02:00
Robert Schmidt
d0bfaf4dcb Verify reestablishment in DU-CU split 2023-08-12 11:48:17 +02:00
Robert Schmidt
979ebdeb42 Implement RRC Reestablishment fallback with RRC Setup 2023-08-12 11:48:17 +02:00
Robert Schmidt
792cd56f63 Cleanup after RRC reestablishment 2023-08-12 11:48:17 +02:00
Robert Schmidt
7a298e73cd Repair reestablishment and make it work via F1
This commit repairs the reestablishment after the introduction of the CU
UE ID in the CU, different from the DU UE ID. Now, the CU uses an
identifier different from the RNTI, used in the MAC, to refer to UEs.

To repair the reestablishment, a number of changes needed to be
introduced:

- Handle old_gNB_DU_UE_id in MAC

The MAC handles the old_gNB_DU_UE_id field in the DL RRC Message. The
commit adds encoding/decoding of the field. The MAC will drop the old
UE, but retain the CellGroup of the corresponding UE(!). Because a UE
releases the spCellGroup on reestablishment, the MAC does the same; it
needs to reapply the old configuration after a reconfiguration. For the
latter, introduce new variables to keep a "future" CellGroupConfig to be
applied (reconfigCellGroup) and a flag (expect_reconfiguration) that
applies the CellGroupConfig if a DL RRC Message transfer on DCCH, which
is assumed to be the reconfiguration.

- Add RNTI change in RLC

The RLC needs to reuse the old UE context. Hence, we simply change the
RNTI in the old context, and delete the new one.

- No PDCP UE ID change

The previous implementation of the PDCP used the RNTI; hence, the ID
needed to be switch (as above for the RLC). Since the PDCP now also uses
the CU UE ID, no identifier change is needed, and we remove all
corresponding code.

- No MAC modifications/update from CU

As foreseen by the spec, the CU does not modify or change the
cellGroupConfig in the RRC during reestablishment. This change will be
generalized in the future to all of the RRC.  Also, the
nr_rrc_mac_remove_ue() function has been removed: the MAC handles any UE
changes autonomeously, without being triggered from the RRC explicitly.

- Remove reestablish_rnti_map

The RRC does not use RNTIs for UE identification. Hence, a
reestablish_rnti_map to link two UEs to each other is not necessary
anymore.
2023-08-12 11:48:17 +02:00
Robert Schmidt
04abbdb668 Implement PDCP reset counters for reestablishment
After a reestablishment, the PDCP sequence number counters have to be
reset. Implement an API to allow the RRC to reset the sequence numbers
for a particular UE in the case of reestablishment
2023-08-12 11:48:17 +02:00
Robert Schmidt
b90a59a671 Trigger Reestablishment via resetting RLC sequence numbers
Plugin can trigger reestablishment (on DU)
and show counters of reestablishment (on CU)
2023-08-12 11:48:17 +02:00
Vijay Chadachan
707cf8088a Addressed the review comments 2023-08-11 18:34:54 +02:00
Robert Schmidt
1c07afbeb6 RRC: Remove checks for UEs with existing RNTI
The RRC gives its own RRC UE ID. It won't intervene if DUs assign the same RNTI to different UEs: it simply does not care what the DUs do with the RNTI.
2023-08-11 17:38:12 +02:00
Robert Schmidt
644a5768a3 nrRRC_stats.log: provide info about UE (IDs, RRC state, PDU sessions) 2023-08-11 17:38:12 +02:00
Robert Schmidt
9790246daf Do-ra: write out directly 2023-08-11 17:38:12 +02:00
Robert Schmidt
763a95b12b CU-UP/E1: mirror CU-CP UE ID in CU-UP, clean up messages
- Use the same CU-UP in E1 as in CU-CP: we don't have a separate entity
  to allocate IDs, and we just use the same as the CU-CP
- Correct gNB CU-UP/CP UE IDs in E1AP message types to 32bit
- Set CU UP UE ID explicitly for clarity
- Remove RNTI from E1 messages, E1 does not know what an RNTI is
2023-08-11 17:38:12 +02:00
Robert Schmidt
5c42004e21 RRC: switch to NGAP UE ID as CU UE ID 2023-08-11 17:38:12 +02:00
Robert Schmidt
c832b7af91 Configure CU/DU UE IDs in NSA/do-ra/phytest 2023-08-11 17:38:12 +02:00
Robert Schmidt
2e1107fa41 Refactor PDCP: DRB callback for gNB to look up IDs 2023-08-11 17:38:12 +02:00
Robert Schmidt
eca89e20b0 Remove F1 module UE handling
The UE had a list of known UEs. With the introduction of a separate
module for F1 UE ID handling that is also used in monolithic (to
separate CU UE ID from DU UE ID), this functionality is not needed, and
deleted in this commit.
2023-08-11 17:38:12 +02:00
Robert Schmidt
7c2c01727e Send ue ITTI Release Complete message
Previously, the F1AP handler called various functions directly, instead
of sending an ITTI message to the RRC thread. This has two drawbacks:
- it can lead to data races if the RRC task uses functionality that is
  being accessed by the F1 task through this function
- no homogeneity: all other handlers send an ITTI message, so this one
  should too
2023-08-11 17:38:12 +02:00
Robert Schmidt
f48d86d7c5 UE Ctxt Release Req/Cmd/Complete 2023-08-11 17:38:12 +02:00
Robert Schmidt
d24454ce9a UE Context setup and modif 2023-08-11 17:38:12 +02:00
Robert Schmidt
d220ee23e2 UL RRC Message has CU/DU UE IDs 2023-08-11 17:38:12 +02:00
Robert Schmidt
0943891005 Use CU/DU UE ID in DL RRC Message Transfer, manage at DU, refactor
- The CU/DU UE ID is used in DL RRC Message Transfer
- Note: The CU UE ID currently is still the RNTI
- on every DL RRC Message, the DU verifies that the UE exists
- Refactor RRC: common function to forward protected SRB PDUs
2023-08-11 17:38:12 +02:00
Robert Schmidt
0a0f6b7952 Initial UL RRC Message: manage DU UE ID at CU 2023-08-11 17:38:12 +02:00
Robert Schmidt
3e0f07705c Init F1 UE data structs at MAC, RRC & CU-UP 2023-08-11 17:38:12 +02:00
Robert Schmidt
af545c07b7 Hashtable for F1 UE IDs and add test 2023-08-11 17:38:12 +02:00
Robert Schmidt
4574a19fc9 Rename primary RRC UE ID gNB_ue_ngap_id to rrc_ue_id
The RRC uses gNB_ue_ngap_id as its primary ID; the following commits
will introduce the usage of the (F1) gNB CU UE ID. This commits renames
the gNB_ue_ngap_id to rrc_ue_id to better reflect its usage as the RRC's
primary UE ID.

It will be used as the NGAP and F1 (CU) UE IDs.
2023-08-11 15:20:47 +02:00
Robert Schmidt
c5b9962954 Remove unnecessary dl_rrc_message_transfer_direct() 2023-08-11 15:20:47 +02:00
Robert Schmidt
97b65555fd Invalid free: do not free RRC container 2023-08-11 15:20:47 +02:00
Robert Schmidt
f1cef982f2 Bugfix: DL RRC Message: Allocate RRC Container buf 2023-08-11 15:20:47 +02:00
Robert Schmidt
d647a98f65 Make the gNB_ue_ngap_id greater than 0
To avoid 0 in the ID
2023-08-11 15:20:47 +02:00
Robert Schmidt
50bba6b287 Remove useless S1AP definitions in NR RRC 2023-08-11 15:20:47 +02:00
Robert Schmidt
ab9f9bdd76 Don't delete RA in delete_nr_ue_data()
for reusing the old UE Context after reestablishment: we have to free a
UE context, but that also free's the RA process that we still need.
Remove here

Is this necessary?
2023-08-11 15:20:47 +02:00
Robert Schmidt
435c849866 Merge remote-tracking branch 'origin/fr2-interdigital-usrp-interface2' into integration_2023_w32 2023-08-11 14:44:09 +02:00
Robert Schmidt
79c7b9a873 Merge remote-tracking branch 'origin/fix-alignment-tpool' into integration_2023_w32 2023-08-11 14:44:02 +02:00
Robert Schmidt
f3c2c12fa2 Fix alignment of Tpool user data to 32 bytes
The thread pool provides user data to be stored by (pre-)allocating the
necessary memory. A previous attempt was made to have this user data
aligned on a 32 byte boundary (e.g., to prevent segfault with SIMD
instructions, or avoid inefficient data access); the current
implementation, however, leads to unaligned memory access.

This patch attempts again to implement user data to be 32 byte aligned.
First, use memalign() to allocate the actual job on a 32 byte boundary.
Second, use alignas(32) to align the pointer to the user data to be
aligned to 32 bytes. Since it is the last member of the struct, this
ensures that user data, which is allocated right behind it, will be
aligned to 32 bytes as well.
2023-08-11 14:38:28 +02:00
Imad Al Samman
66df72d1f8 USRP driver: Make it compile for UHD < 4.0.0 2023-08-11 11:23:28 +02:00
Robert Schmidt
ee8269ea98 Merge remote-tracking branch 'origin/fix-uninitialized-var-scope' into integration_2023_w32 2023-08-11 11:03:16 +02:00
Robert Schmidt
b141450180 Merge remote-tracking branch 'origin/fix-cmake3-rhel' into integration_2023_w32 2023-08-11 11:03:11 +02:00
Robert Schmidt
934a6aeb83 Merge remote-tracking branch 'origin/NR_UE_handle_TDD_pattern2' into integration_2023_w32 2023-08-11 11:03:00 +02:00
Maud Tribaudeau
cb5f3954b6 fix gtp delete. we should not delete all bearer in case of dedicaded bearer release 2023-08-10 10:13:08 +00:00
Robert Schmidt
26ef1128d8 Initialize OAIgraph before usage
Newer GCC releases warn about the scope being uninitialized:

openair1/PHY/TOOLS/nr_phy_scope.c:1076:20: error: ‘graph.text’ is used uninitialized [-Werror=uninitialized]

This is correct, as we don't initialize the scope. This commit correctly
initializes the scope.
2023-08-09 17:40:51 +02:00
Robert Schmidt
a87cd3e83c Rewrite RUNMODEM.md section for phytest; simplify rfsim doc 2023-08-09 17:38:05 +02:00
Robert Schmidt
9f45f1d769 Deprecate NR-UE --rrc_config_path, use --r{e,b}config-file instead
Config options --reconfig_file and --rbconfig-file have been introduced
to modify the filenames of reconfig.raw and rbconfig.raw (e.g., in the
case of multiple UEs). These filen*ames* were to be prepended with
--rrc_config_path to set the path. In summary, three options were
necessary, when two are sufficient.

In this commit, change to the options --reconfig-file and
--rbconfig-file (slight change for harmonization with other options,
which mostly use dashes) to give the full path to the corresponding
files, and avoid to surprise users who would not expect to have three
options.

--rrc_config_path has been deprecated and an error will be printed if a
user attempts to use it.
2023-08-09 17:32:45 +02:00
francescomani
cd6f491b97 overwriting SIBs when new acquisition 2023-08-09 16:36:12 +02:00
Florian Kaltenberger
9983478a61 addressing reviewer comments: removing warning messages 2023-08-08 18:39:38 +02:00
Florian Kaltenberger
53171d96ea addressing reviewer comments: rename prs config files (remove "sa") and updating doc accordingly 2023-08-08 18:36:56 +02:00
Sagar Parsawar
f64179039e Applied clang formatting 2023-08-08 18:35:05 +02:00
Sagar Parsawar
4f9aa86510 Compile error fix 2023-08-08 18:31:10 +02:00
Sagar Parsawar
386881c382 Fixed PRS IDFT 16x oversampling buffer issue 2023-08-08 18:31:10 +02:00
Sagar Parsawar
970e65a4d6 Bug fix in size of ENB_PHY_OUTPUT_SIGNAL dump 2023-08-08 18:31:10 +02:00
Sagar Parsawar
3f6ed8d14a Fix for multiple gNB SSB decode in UE phy-test mode 2023-08-08 18:29:14 +02:00
Robert Schmidt
aa62ddfabd MAC: Fix check for spCellConfig before using 2023-08-08 17:56:10 +02:00
Robert Schmidt
6979b56aa7 Scheduler lock: provide additional info on failure 2023-08-08 17:56:10 +02:00
francescomani
9b8a8280ad handle TDD pattern2 at UE 2023-08-08 17:26:46 +02:00
francescomani
72e92f7e46 stop scheduling SIB reception only if it is acked otherwise UE get stalled 2023-08-03 17:06:48 +02:00
Robert Schmidt
3161add2c1 build_oai/build_helper: use $CMAKE
Some distributions, e.g., CentOS8 or RHEL8, ship with an old cmake
(v2.8). To provide a newer, they have a separate cmake3 package, where a
recent cmake version is in program cmake3. To be agnostic, build_helper
detects the distribution and choses the cmake program to use.

This commit uses the correct cmake, which is provided in the environment
variable $CMAKE.
2023-07-31 15:53:59 +02:00
Robert Schmidt
a3ddabafc6 Use cmake3 command if on RHEL 2023-07-31 15:53:59 +02:00
Thomas Schlichter
f1a095057e fix limited UL data throughput in do-ra mode
In case of noS1-mode, we initialize the 'logicalChannelBearer_exist' array element for the pre-configured DRB0 in function 'nr_l2_init_ue()'.
That array is indexed with the LCID.
For DRB0, the LCID is 4.
Unfortunately, the code incorrectly used the array at index 0.
Therefore, the UE sent neither scheduling requests nor buffer status reports, what resulted in extremely poor UL throughput.
2023-07-28 15:42:47 +02:00
Vaibhav Shrivastava
b49ac6ec4e Fix cppcheck warnings related to negativeIndex 2023-07-20 17:08:18 +05:30
690 changed files with 52280 additions and 50057 deletions

5
.gitignore vendored
View File

@@ -9,8 +9,11 @@ cmake_targets/nas_sim_tools/build/
log/
lte_build_oai/
# vscode
# IDE files
.vscode
.cproject
.project
.settings
# Tags for vim/global
GPATH

2
.gitmodules vendored
View File

@@ -1,4 +1,4 @@
[submodule "openair2/E2AP/flexric"]
path = openair2/E2AP/flexric
url = https://gitlab.eurecom.fr/mosaic5g/flexric.git
branch = remotes/origin/mir_dev
branch = remotes/origin/service-models-integration

31
.vscode/launch.json vendored
View File

@@ -1,31 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/cmake_targets/ran_build/build/lte-softmodem",
"args": [
"-O", "../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf",
"--noS1"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/cmake_targets",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "${workspaceFolder}/cmake_targets/sudo-gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}

0
CHANGELOG.md Normal file → Executable file
View File

View File

@@ -102,21 +102,23 @@ add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of bui
# in case /proc/cpuinfo exists we want to inspect available Intrinsics
# -so not to go always through SIMDE emulation
# -so to avoid AVX512 instructions generation by gcc
execute_process(COMMAND uname -m OUTPUT_VARIABLE CPUARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "CPUARCH ${CPUARCH}")
if(EXISTS "/proc/cpuinfo")
if(EXISTS "/proc/cpuinfo" AND NOT CROSS_COMPILE)
file(STRINGS "/proc/cpuinfo" CPUFLAGS REGEX flags LIMIT_COUNT 1)
else()
message(WARNING "did not find /proc/cpuinfo -- not setting any x86-specific compilation variables")
endif()
eval_boolean(AUTODETECT_AVX512 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx512")
add_boolean_option(AVX512 ${AUTODETECT_AVX512} "Whether AVX512 intrinsics is available on the host processor" ON)
eval_boolean(AUTODETECT_AVX2 DEFINED CPUFLAGS AND CPUFLAGS MATCHES "avx2")
add_boolean_option(AVX2 ${AUTODETECT_AVX2} "Whether AVX2 intrinsics is available on the host processor" ON)
if(${CPUARCH} STREQUAL "x86_64" AND DEFINED CPUFLAGS)
message(STATUS "CPU architecture is ${CMAKE_SYSTEM_PROCESSOR}")
if (CROSS_COMPILE)
message(STATUS "setting as aarch64")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -lgcc -lrt")
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
# The following intrinsics are assumed to be available on any x86 system
# (avx, f16c, fma, gnfi, mmx, pclmul, sse, sse2, sse3, xop)
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_AVX_NATIVE -DSIMDE_X86_F16C_NATIVE -DSIMDE_X86_FMA_NATIVE -DSIMDE_X86_GFNI_NATIVE -DSIMDE_X86_MMX_NATIVE -DSIMDE_X86_PCLMUL_NATIVE -DSIMDE_X86_SSE2_NATIVE -DSIMDE_X86_SSE3_NATIVE -DSIMDE_X86_SSE_NATIVE -DSIMDE_X86_XOP_HAVE_COM_ -DSIMDE_X86_XOP_NATIVE")
@@ -139,11 +141,19 @@ if(${CPUARCH} STREQUAL "x86_64" AND DEFINED CPUFLAGS)
if(CPUINFO MATCHES "ssse3")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -DSIMDE_X86_SSSE3_NATIVE")
endif()
elseif(${CPUARCH} NOT STREQUAL "x86_64")
message(FATAL_ERROR "Cannot compile for CPU architecture ${CPUARCH}")
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lgcc -lrt")
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -gdwarf-2 -lgcc -lrt")
else()
message(FATAL_ERROR "compile for CPU architecture ${CPUARCH}, CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}")
endif()
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
if (NOT CROSS_COMPILE)
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native")
else ()
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a")
endif()
# 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")
@@ -279,6 +289,15 @@ add_definitions(-DHAVE_NETINET_IN_H)
set(E2_AGENT "OFF" CACHE STRING "O-RAN-compliant E2 Agent")
set_property(CACHE E2_AGENT PROPERTY STRINGS "ON" "OFF")
set(E2AP_VERSION "E2AP_V2" CACHE STRING "E2AP version")
set_property(CACHE E2AP_VERSION PROPERTY STRINGS "E2AP_V1" "E2AP_V2" "E2AP_V3")
message(STATUS "Selected E2AP_VERSION: ${E2AP_VERSION}")
set(KPM_VERSION "KPM_V2" CACHE STRING "The KPM SM version to use")
set_property(CACHE KPM_VERSION PROPERTY STRINGS "KPM_V2" "KPM_V3")
message(STATUS "Selected KPM Version: ${KPM_VERSION}")
##################################################
# ASN.1 grammar C code generation & dependencies #
##################################################
@@ -413,6 +432,7 @@ target_link_libraries(x2ap PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
set(F1AP_DIR ${OPENAIR2_DIR}/F1AP)
add_library(f1ap
${F1AP_DIR}/f1ap_common.c
${F1AP_DIR}/f1ap_ids.c
${F1AP_DIR}/f1ap_cu_interface_management.c
${F1AP_DIR}/f1ap_cu_paging.c
${F1AP_DIR}/f1ap_cu_rrc_message_transfer.c
@@ -431,7 +451,7 @@ add_library(f1ap
${F1AP_DIR}/f1ap_itti_messaging.c)
target_include_directories(f1ap PUBLIC F1AP_DIR)
target_link_libraries(f1ap PUBLIC asn1_f1ap)
target_link_libraries(f1ap PRIVATE ngap nr_rrc)
target_link_libraries(f1ap PRIVATE ngap nr_rrc HASHTABLE)
# LPP
##############
@@ -855,7 +875,7 @@ target_link_libraries(ldpc_parityCheck PRIVATE ldpc_gen_HEADERS)
add_library(coding MODULE ${PHY_TURBOSRC} )
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
set(PHY_SRC_COMMON
@@ -1029,6 +1049,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/ptrs_nr.c
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_freq_equalization.c
${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_measurements_gNB.c
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
@@ -1108,9 +1129,9 @@ if (${SMBV})
endif (${SMBV})
set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
set(PHY_NR_UE_SRC ${PHY_NR_UE_SRC} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
add_library(PHY_COMMON ${PHY_SRC_COMMON})
target_link_libraries(PHY_COMMON PRIVATE shlib_loader)
add_dependencies(PHY_COMMON dfts)
target_link_libraries(PHY_COMMON PRIVATE asn1_lte_rrc_hdrs)
@@ -1133,6 +1154,7 @@ add_library(PHY_NR_COMMON ${PHY_NR_SRC_COMMON})
add_library(PHY_NR ${PHY_NR_SRC})
add_library(PHY_NR_UE ${PHY_NR_UE_SRC})
target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs)
add_library(PHY_RU ${PHY_SRC_RU})
target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs)
@@ -1396,15 +1418,14 @@ add_library(L2
)
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
if(E2_AGENT)
target_link_libraries(L2 PUBLIC e2_agent e2_ran_func)
target_compile_definitions(L2 PRIVATE E2_AGENT)
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
endif()
add_library(MAC_NR ${MAC_NR_SRC})
target_link_libraries(MAC_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
add_library(MAC_UE_NR ${MAC_NR_SRC_UE})
target_link_libraries(MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
@@ -1433,6 +1454,7 @@ target_link_libraries(e1_pdcp_if PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap nr_rlc)
if(E2_AGENT)
target_link_libraries(L2_NR PUBLIC e2_agent e2_ran_func)
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
target_compile_definitions(L2_NR PRIVATE E2_AGENT)
endif()
@@ -1955,6 +1977,7 @@ target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
if(E2_AGENT)
target_compile_definitions(lte-softmodem PRIVATE E2_AGENT)
target_compile_definitions(lte-softmodem PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
endif()
add_executable(oairu
@@ -2051,6 +2074,11 @@ target_link_libraries(nr-softmodem PRIVATE
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt sctp)
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
if(E2_AGENT)
target_compile_definitions(nr-softmodem PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
endif()
add_dependencies(nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc)
@@ -2232,7 +2260,7 @@ add_executable(nr_dlsim
${PHY_INTERFACE_DIR}/queue_t.c
)
target_link_libraries(nr_dlsim PRIVATE
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
m pthread ${T_LIB} ITTI dl shlib_loader
)
target_link_libraries(nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
@@ -2276,7 +2304,7 @@ if (ENABLE_LDPC_T1)
endif()
target_link_libraries(nr_ulsim PRIVATE
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
m pthread ${T_LIB} ITTI dl shlib_loader
)
target_link_libraries(nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
@@ -2338,7 +2366,7 @@ if (${T_TRACER})
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
MISC_NFAPI_LTE_LIB MISC_NFAPI_NR_LIB
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR ngap
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_UE_NR ngap
CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU SIMU_ETH OPENAIR0_LIB
ldpc_orig ldpc_optim ldpc_optim8seg ldpc dfts)
if (TARGET ${i})

View File

@@ -16,8 +16,6 @@ Please refer to the steps described on our website: [How to contribute to OAI](h
* This decision was made for the license reasons.
* The Continuous Integration will reject your merge request.
- All merge requests SHALL have `develop` branch as target branch.
- All merge requests SHALL have source branch names that SHALL not contain the `/` character.
* We are using a `docker` registry scheme and the image names are based on the source branch name.
## Coding Styles ##

View File

@@ -31,6 +31,9 @@ def do5Gtest = false
//
def gitCommitAuthorEmailAddr
// list of failing stages
def failingStages = ""
pipeline {
agent {
label nodeExecutor
@@ -117,44 +120,49 @@ pipeline {
}
}
// Build Stages are Mandatory
// Later we will add a Ubuntu20 build
stage ("Image Building Processes") {
when { expression {doBuild} }
parallel {
stage ("Ubuntu18-Image-Builder") {
stage ("Ubuntu-Image-Builder") {
steps {
script {
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu18-Image-Builder')
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu-Image-Builder')
}
}
post {
always {
script {
finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
ubuntuBuildStatus = finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += ubuntuBuildStatus
}
}
}
}
stage ("RHEL8-Cluster-Image-Builder") {
stage ("RHEL-Cluster-Image-Builder") {
steps {
script {
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL8-Cluster-Image-Builder')
triggerSlaveJob ('RAN-RHEL8-Cluster-Image-Builder', 'RHEL-Cluster-Image-Builder')
}
}
post {
always {
script {
finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rhelBuildStatus = finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += rhelBuildStatus
}
}
}
@@ -168,12 +176,37 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-cppcheck')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
cppcheckStatus = finalizeSlaveJob('RAN-cppcheck')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += cppcheckStatus
}
}
}
}
stage ("ARM-Cross-Compile") {
steps {
script {
triggerSlaveJob ('RAN-ARM-Cross-Compile-Builder', 'ARM-Cross-Compilation')
}
}
post {
always {
script {
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
armBuildStatus = finalizeSlaveJob('RAN-ARM-Cross-Compile-Builder')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += armBuildStatus
}
}
}
@@ -193,12 +226,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-PhySim-Cluster')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
physimStatus = finalizeSlaveJob('RAN-PhySim-Cluster')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += physimStatus
}
}
}
@@ -213,12 +249,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-RF-Sim-Test-4G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rfSim4GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-4G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += rfSim4GStatus
}
}
}
@@ -233,12 +272,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-RF-Sim-Test-5G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
rfSim5GStatus = finalizeSlaveJob('RAN-RF-Sim-Test-5G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += rfSim5GStatus
}
}
}
@@ -253,12 +295,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-L2-Sim-Test-4G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
l2Sim4GStatus = finalizeSlaveJob('RAN-L2-Sim-Test-4G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += l2Sim4GStatus
}
}
}
@@ -273,12 +318,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-L2-Sim-Test-5G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
l2Sim5GStatus = finalizeSlaveJob('RAN-L2-Sim-Test-5G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += l2Sim5GStatus
}
}
}
@@ -293,12 +341,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteTDDB200Status = finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += lteTDDB200Status
}
}
}
@@ -314,12 +365,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteFDDB200OAIUEStatus = finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += lteFDDB200OAIUEStatus
}
}
}
@@ -334,12 +388,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteFDDB200Status = finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += lteFDDB200Status
}
}
}
@@ -354,12 +411,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
nsaTDDB200Status = finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += nsaTDDB200Status
}
}
}
@@ -374,12 +434,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saTDDB200Status = finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += saTDDB200Status
}
}
}
@@ -394,12 +457,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
phytestLDPCoffloadStatus = finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += phytestLDPCoffloadStatus
}
}
}
@@ -414,12 +480,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
lteTDD2x2N3xxStatus = finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += lteTDD2x2N3xxStatus
}
}
}
@@ -434,12 +503,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-SA-AW2S-CN5G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saAW2SStatus = finalizeSlaveJob('RAN-SA-AW2S-CN5G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += saAW2SStatus
}
}
}
@@ -454,12 +526,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-Interop-F1')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
f1InteropStatus = finalizeSlaveJob('RAN-Interop-F1')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += f1InteropStatus
}
}
}
@@ -474,12 +549,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
cn5gCOTSUESanityCheck = finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += cn5gCOTSUESanityCheck
}
}
}
@@ -494,12 +572,15 @@ pipeline {
post {
always {
script {
finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
// Using a unique variable name for each test stage to avoid overwriting on a global variable
// due to parallel-time concurrency
saOAIUEStatus = finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
}
}
failure {
script {
currentBuild.result = 'FAILURE'
failingStages += saOAIUEStatus
}
}
}
@@ -518,6 +599,7 @@ pipeline {
script {
echo "Push to Docker-Hub KO"
currentBuild.result = 'FAILURE'
failingStages += '\n * RAN-DockerHub-Push'
}
}
}
@@ -541,7 +623,8 @@ pipeline {
script {
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
if ("MERGE".equals(env.gitlabActionType)) {
addGitLabMRComment comment: message
def fullMessage = message + '\n\nList of failing test stages:' + failingStages
addGitLabMRComment comment: fullMessage
def message2 = message + " -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
sendSocialMediaMessage('ci-enb', 'danger', message2)
} else {
@@ -589,6 +672,7 @@ def triggerCN5GSlaveJob (jobName, gitlabStatusName) {
if ("MERGE".equals(env.gitlabActionType)) {
shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" --abbrev=8 ' + env.gitlabMergeRequestLastCommit
shortenShaOne = shortenShaOne.trim()
branchName = env.gitlabSourceBranch.replaceAll("/", "-").trim()
fullRanTag = 'porcepix.sboai.cs.eurecom.fr/oai-gnb:' + env.gitlabSourceBranch + '-' + shortenShaOne
} else {
shortenShaOne = sh returnStdout: true, script: 'git log -1 --pretty=format:"%h" --abbrev=8 ' + env.GIT_COMMIT
@@ -643,21 +727,29 @@ def triggerSlaveJobNoGitLab (jobName) {
}
def finalizeSlaveJob(jobName) {
// In case of any non-success, we are retrieving the HTML report of the last completed
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
if (jobName == 'OAI-CN5G-COTS-UE-Test') {
fileName = "test_results_oai_cn5g_cots_ue.html"
} else {
fileName = "test_results-${jobName}.html"
}
if (!fileExists(fileName)) {
copyArtifacts(projectName: jobName,
filter: 'test_results*.html',
selector: lastCompleted())
if (fileExists(fileName)) {
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
archiveArtifacts artifacts: fileName
lock ('Parent-Lock') {
// In case of any non-success, we are retrieving the HTML report of the last completed
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
if (jobName == 'OAI-CN5G-COTS-UE-Test') {
fileName = "test_results_oai_cn5g_cots_ue.html"
} else {
fileName = "test_results-${jobName}.html"
}
artifactUrl = BUILD_URL
if (!fileExists(fileName)) {
copyArtifacts(projectName: jobName,
filter: 'test_results*.html',
selector: lastCompleted())
if (fileExists(fileName)) {
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
archiveArtifacts artifacts: fileName
// BUILD_URL is like http://server:port/jenkins/job/foo/15/
// no need to add a prefixed '/'
artifactUrl += 'artifact/' + fileName
}
}
artifactUrl = "\n * [${jobName}](${artifactUrl})"
return artifactUrl
}
}

View File

@@ -67,6 +67,13 @@ pipeline {
}
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ('Verify Parameters') {
steps {
script {

View File

@@ -61,6 +61,13 @@ pipeline {
}
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ('Verify Parameters') {
steps {
script {

View File

@@ -61,6 +61,13 @@ pipeline {
}
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ('Verify Parameters') {
steps {
script {

View File

@@ -66,6 +66,13 @@ pipeline {
}
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ("Verify Parameters") {
steps {
script {

View File

@@ -54,6 +54,13 @@ pipeline {
lock(extra: lockResources)
}
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ("Verify Parameters") {
steps {
script {

View File

@@ -66,32 +66,14 @@ pipeline {
ansiColor('xterm')
lock(extra: lockResources)
}
// the following parameter options are commented out so it shows the ones
// that you SHALL have to run the job.
// You can use them as template
/*
parameters {
//node-test parameters
string(name: 'pythonExecutor', defaultValue: 'nodea', description: 'Node where the pipeline - python scripts will be executed')
string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
string(name: 'lockResources', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource')
//eNB parameters
string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
credentials(name: 'eNB_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for eNB')
string(name: 'eNB_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of eNB source code')
//EPC parameters
string(name: 'EPC_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of EPC')
string(name: 'EPC_Type', defaultValue: 'ltebox', description: 'EPC type: OAI or ltebox')
credentials(name: 'EPC_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for EPC')
string(name: 'EPC_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of EPC source code')
}
*/
stages {
stage("Build Init") {
steps {
// update the build name and description
buildName "${params.eNB_MR}"
buildDescription "Branch : ${params.eNB_Branch}"
}
}
stage ("Verify Parameters") {
steps {
script {

View File

@@ -185,9 +185,12 @@ rfsim4g_enb_nos1:
l2sim5g_ue:
Host: localhost
AttachScript: docker start l2sim-oai-nr-ue0
DetachScript: docker stop l2sim-oai-nr-ue0
NetworkScript: docker exec l2sim-oai-nr-ue0 ip a show dev oaitun_ue1
CmdPrefix: docker exec l2sim-oai-nr-ue0
IF: oaitun_ue1
MTU: 1500
l2sim5g_ext_dn:
Host: localhost
@@ -196,9 +199,12 @@ l2sim5g_ext_dn:
l2sim4g_ue:
Host: localhost
AttachScript: docker start l2sim4g-oai-lte-ue1
DetachScript: docker stop l2sim4g-oai-lte-ue1
NetworkScript: docker exec l2sim4g-oai-lte-ue1 ip a show dev oaitun_ue1
CmdPrefix: docker exec l2sim4g-oai-lte-ue1
IF: oaitun_ue1
MTU: 1500
l2sim4g_ext_dn:
Host: localhost

View File

@@ -266,7 +266,8 @@ class Cluster:
baseTag = 'develop'
forceBaseImageBuild = False
if self.ranAllowMerge: # merging MR branch into develop -> temporary image
imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}'
branchName = self.ranBranch.replace('/','-')
imageTag = f'{branchName}-{self.ranCommitID[0:8]}'
if self.ranTargetBranch == 'develop':
ret = self.cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base.rhel9 | grep --colour=never -i INDEX')
result = re.search('index', ret.stdout)
@@ -412,7 +413,6 @@ class Cluster:
imageSize = {}
for image in attemptedImages:
self.cmd.run(f'mkdir -p cmake_targets/log/{image}')
self.cmd.run(f'python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/{image}.log')
tag = imageTag if image != 'ran-base' else baseTag
size = self._get_image_size(image, tag)
if size <= 0:

View File

@@ -97,7 +97,9 @@ def CreateWorkspace(sshSession, sourcePath, ranRepository, ranCommitID, ranTarge
def ImageTagToUse(imageName, ranCommitID, ranBranch, ranAllowMerge):
shortCommit = ranCommitID[0:8]
if ranAllowMerge:
tagToUse = f'{ranBranch}-{shortCommit}'
# Allowing contributor to have a name/branchName format
branchName = ranBranch.replace('/','-')
tagToUse = f'{branchName}-{shortCommit}'
else:
tagToUse = f'develop-{shortCommit}'
fullTag = f'{imageName}:{tagToUse}'
@@ -153,17 +155,13 @@ def AnalyzeBuildLogs(buildRoot, images, globalStatus):
committed = False
tagged = False
with open(f'{buildRoot}/{image}.log', mode='r') as inputfile:
startOfTargetImageCreation = False # check for tagged/committed only after image created
for line in inputfile:
result = re.search(f'FROM .* [aA][sS] {image}$', str(line))
if result is not None:
startOfTargetImageCreation = True
if startOfTargetImageCreation:
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
tagged = tagged or lineHasTag
# the OpenShift Cluster builder prepends image registry URL
lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None
committed = committed or lineHasCommit
lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None
lineHasTag2 = re.search(f'naming to docker.io/library/{image}:', str(line)) is not None
tagged = tagged or lineHasTag or lineHasTag2
# the OpenShift Cluster builder prepends image registry URL
lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None
committed = committed or lineHasCommit
errorandwarnings['errors'] = 0 if committed or tagged else 1
errorandwarnings['warnings'] = 0
errorandwarnings['status'] = committed or tagged
@@ -370,22 +368,23 @@ class Containerize():
# Creating a tupple with the imageName and the DockerFile prefix pattern on obelix
if result is not None:
imageNames.append(('oai-enb', 'eNB'))
else:
result = re.search('gNB', self.imageKind)
if result is not None:
imageNames.append(('oai-gnb', 'gNB'))
else:
result = re.search('all', self.imageKind)
if result is not None:
imageNames.append(('oai-enb', 'eNB'))
imageNames.append(('oai-gnb', 'gNB'))
imageNames.append(('oai-nr-cuup', 'nr-cuup'))
imageNames.append(('oai-lte-ue', 'lteUE'))
imageNames.append(('oai-nr-ue', 'nrUE'))
if self.host == 'Red Hat':
imageNames.append(('oai-physim', 'phySim'))
if self.host == 'Ubuntu':
imageNames.append(('oai-lte-ru', 'lteRU'))
result = re.search('gNB', self.imageKind)
if result is not None:
imageNames.append(('oai-gnb', 'gNB'))
result = re.search('all', self.imageKind)
if result is not None:
imageNames.append(('oai-enb', 'eNB'))
imageNames.append(('oai-gnb', 'gNB'))
imageNames.append(('oai-nr-cuup', 'nr-cuup'))
imageNames.append(('oai-lte-ue', 'lteUE'))
imageNames.append(('oai-nr-ue', 'nrUE'))
if self.host == 'Red Hat':
imageNames.append(('oai-physim', 'phySim'))
if self.host == 'Ubuntu':
imageNames.append(('oai-lte-ru', 'lteRU'))
result = re.search('build_cross_arm64', self.imageKind)
if result is not None:
self.dockerfileprefix = '.ubuntu20.cross-arm64'
# Workaround for some servers, we need to erase completely the workspace
if self.forcedWorkspaceCleanup:
@@ -434,7 +433,7 @@ class Containerize():
if ret.returncode != 0:
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
# Recover the name of the failed container?
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs {self.cli} rm -f")
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
cmd.run(f"{self.cli} image prune --force")
cmd.close()
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
@@ -467,17 +466,20 @@ class Containerize():
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
if image != 'ran-build':
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', timeout=1200)
# split the log
cmd.run(f"mkdir -p cmake_targets/log/{image}")
cmd.run(f"python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/{image}.log")
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', timeout=1200)
if image == 'ran-build' and ret.returncode == 0:
cmd.run(f"docker run --name test-log -d {image}:{imageTag} /bin/true")
cmd.run(f"docker cp test-log:/oai-ran/cmake_targets/log/ cmake_targets/log/{image}/")
cmd.run(f"docker rm -f test-log")
else:
cmd.run(f"mkdir -p cmake_targets/log/{image}")
# check the status of the build
ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {image}:{imageTag}")
if ret.returncode != 0:
logging.error('\u001B[1m Could not build properly ' + image + '\u001B[0m')
status = False
# Here we should check if the last container corresponds to a failed command and destroy it
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs {self.cli} rm -f")
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
allImagesSize[image] = 'N/A -- Build Failed'
break
else:
@@ -986,14 +988,11 @@ class Containerize():
for svcName in services:
# head -n -1 suppresses the final "X exited with status code Y"
filename = f'{svcName}-{HTML.testCase_id}.log'
#mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} | head -n -1 &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 30)
mySSH.command(f'docker-compose -f ci-docker-compose.yml logs --no-log-prefix -- {svcName} &> {lSourcePath}/cmake_targets/log/{filename}', '\$', 120)
mySSH.command('docker-compose -f ci-docker-compose.yml down', '\$', 5)
# Cleaning any created tmp volume
mySSH.command('docker volume prune --force', '\$', 20)
mySSH.command('docker-compose -f ci-docker-compose.yml down -v', '\$', 5)
mySSH.close()
# Analyzing log file!
files = ','.join([f'{s}-{HTML.testCase_id}' for s in services])
if len(services) > 1:
@@ -1296,7 +1295,7 @@ class Containerize():
logging.debug('\u001B[1m Undeploying \u001B[0m')
logging.debug(f'Working dir is back {self.yamlPath[0]}')
cmd = 'docker-compose -f docker-compose-ci.yml down'
cmd = 'docker-compose -f docker-compose-ci.yml down -v'
deployStatus = myCmd.run(cmd, timeout=100)
if deployStatus.returncode != 0:
myCmd.close()
@@ -1307,9 +1306,6 @@ class Containerize():
return
self.deployedContainers = []
# Cleaning any created tmp volume
cmd = 'docker volume prune --force'
deployStatus = myCmd.run(cmd, timeout=100, reportNonZero=False)
myCmd.close()
if fullStatus:

View File

@@ -519,6 +519,7 @@ class OaiCiTest():
ping_cmd = f'{ue.getCmdPrefix()} ping {interface} {self.ping_args} 2>&1 | tee /tmp/{ping_log_file}'
cmd = cls_cmd.getConnection(ue.getHost())
response = cmd.run(ping_cmd, timeout=int(ping_time[0])*1.5)
ue_header = f'UE {ue.getName()} ({ueIP})'
if response.returncode != 0:
message = ue_header + ': ping crashed: TIMEOUT?'
logging.error('\u001B[1;37;41m ' + message + ' \u001B[0m')
@@ -528,7 +529,6 @@ class OaiCiTest():
cmd.copyin(src=f'/tmp/{ping_log_file}', tgt=local_ping_log_file)
cmd.close()
ue_header = f'UE {ue.getName()} ({ueIP})'
with open(local_ping_log_file, 'r') as f:
ping_output = "".join(f.readlines())
result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', ping_output)

View File

@@ -98,6 +98,15 @@ class PhySim:
for line in g:
if 'decoding time' in line:
runResultsT1.append(line)
# In case the T1 board does work properly, there is no statistics
if len(runResultsT1) == 0:
logging.error('no statistics')
HTML.CreateHtmlTestRowQueue(self.runargs, 'KO', ['no statistics'])
self.exitStatus = 1
os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.')
return HTML
info = runResultsT1[0][15:-13]
result = int(''.join(filter(str.isdigit, info)))/100
#once parsed move the local logfile to its folder for tidiness

View File

@@ -106,7 +106,8 @@ class PhySim:
if self.ranCommitID != '':
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30)
if self.ranAllowMerge:
imageTag = f'{self.ranBranch}-{self.ranCommitID[0:8]}'
branchName = self.ranBranch.replace('/','-')
imageTag = f'{branchName}-{self.ranCommitID[0:8]}'
if self.ranTargetBranch == '':
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 30)
@@ -160,7 +161,7 @@ class PhySim:
isRunning = False
count = 0
# Check whether the containers are in Running state or not under 2 mins
while(count < 2 and isRunning == False):
while(count < 5 and isRunning == False):
time.sleep(60)
mySSH.command('oc get pods -o wide -l app=physim | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 30, resync=True)
running_count = mySSH.getBefore().count('Running')

View File

@@ -283,7 +283,7 @@ class StaticCodeAnalysis():
if re.search('=== Files with incorrect define protection ===', str(line)) is not None:
circularHeaderDependency = True
if circularHeaderDependency:
if re.search('Removing intermediate container', str(line)) is not None:
if re.search('DONE', str(line)) is not None:
circularHeaderDependency = False
elif re.search('Running in|Files with incorrect define protection', str(line)) is not None:
pass
@@ -293,7 +293,7 @@ class StaticCodeAnalysis():
if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None:
gnuGplLicence = True
if gnuGplLicence:
if re.search('Removing intermediate container', str(line)) is not None:
if re.search('DONE', str(line)) is not None:
gnuGplLicence = False
elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None:
pass
@@ -303,7 +303,7 @@ class StaticCodeAnalysis():
if re.search('=== Files with a suspect Banner ===', str(line)) is not None:
suspectLicence = True
if suspectLicence:
if re.search('Removing intermediate container', str(line)) is not None:
if re.search('DONE', str(line)) is not None:
suspectLicence = False
elif re.search('Running in|Files with a suspect Banner', str(line)) is not None:
pass
@@ -340,7 +340,7 @@ class StaticCodeAnalysis():
html_cell = f'Number of files not respecting: {len(gnuGplLicenceFiles)}\n'
for nFile in gnuGplLicenceFiles:
html_cell += str(nFile).strip() + '\n'
HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', html_queue)
HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', [html_cell])
del(html_cell)
finalStatus = -1

View File

@@ -19,7 +19,6 @@ gNBs =
nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1";
@@ -30,136 +29,7 @@ gNBs =
local_s_portd = 2153;
remote_s_portc = 500;
remote_s_portd = 2153;
min_rxtxtime = 6;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
absoluteFrequencySSB = 641280;
dl_frequencyBand = 78;
# this is 3600 MHz
dl_absoluteFrequencyPointA = 640008;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106;
#initialDownlinkBWP
#genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875;
# 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 = 13;
preambleReceivedTargetPower = -96;
#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 = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
#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 =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# 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 = 6;
nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25;
}
);
# ------- SCTP definitions
SCTP :
{

View File

@@ -19,7 +19,6 @@ gNBs =
nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1";
@@ -30,135 +29,7 @@ gNBs =
local_s_portd = 2153;
remote_s_portc = 500;
remote_s_portd = 2153;
min_rxtxtime = 6;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
absoluteFrequencySSB = 641280;
dl_frequencyBand = 78;
# this is 3600 MHz
dl_absoluteFrequencyPointA = 640008;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106;
#initialDownlinkBWP
#genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875;
# 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 = 13;
preambleReceivedTargetPower = -96;
#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 = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
#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 =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# 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 = 6;
nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25;
}
);
# ------- SCTP definitions
SCTP :
{

View File

@@ -20,7 +20,6 @@ gNBs =
nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1";
@@ -31,136 +30,7 @@ gNBs =
local_s_portd = 2152;
remote_s_portc = 500;
remote_s_portd = 2152;
ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
absoluteFrequencySSB = 641280;
dl_frequencyBand = 78;
# this is 3600 MHz
dl_absoluteFrequencyPointA = 640008;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106;
#initialDownlinkBWP
#genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875;
# 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 = 13;
preambleReceivedTargetPower = -96;
#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 = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
#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 =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# 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 = 6;
nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25;
}
);
# ------- SCTP definitions
SCTP :
{

View File

@@ -20,7 +20,6 @@ gNBs =
nr_cellid = 12345678L;
force_256qam_off = 1;
tr_s_preference = "f1";
@@ -31,136 +30,7 @@ gNBs =
local_s_portd = 2153;
remote_s_portc = 500;
remote_s_portd = 2153;
ssb_SubcarrierOffset = 0;
min_rxtxtime = 6;
servingCellConfigCommon = (
{
#spCellConfigCommon
physCellId = 0;
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
absoluteFrequencySSB = 641280;
dl_frequencyBand = 78;
# this is 3600 MHz
dl_absoluteFrequencyPointA = 640008;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
dl_subcarrierSpacing = 1;
dl_carrierBandwidth = 106;
#initialDownlinkBWP
#genericParameters
# this is RBstart=27,L=48 (275*(L-1))+RBstart
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
#pdcch-ConfigCommon
initialDLBWPcontrolResourceSetZero = 11;
initialDLBWPsearchSpaceZero = 0;
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 78;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
ul_subcarrierSpacing = 1;
ul_carrierBandwidth = 106;
pMax = 20;
#initialUplinkBWP
#genericParameters
initialULBWPlocationAndBandwidth = 28875;
# 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 = 13;
preambleReceivedTargetPower = -96;
#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 = 4;
#oneHalf (0..15) 4,8,12,16,...60,64
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
#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 =-90;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -90;
# 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 = 6;
nrofDownlinkSlots = 7;
nrofDownlinkSymbols = 6;
nrofUplinkSlots = 2;
nrofUplinkSymbols = 4;
ssPBCH_BlockPower = -25;
}
);
# ------- SCTP definitions
SCTP :
{

View File

@@ -22,7 +22,6 @@ gNBs =
////////// Physical parameters:
min_rxtxtime = 6;
force_256qam_off = 1;
servingCellConfigCommon = (
{

View File

@@ -22,7 +22,6 @@ gNBs =
////////// Physical parameters:
min_rxtxtime = 6;
force_256qam_off = 1;
servingCellConfigCommon = (

View File

@@ -32,7 +32,7 @@ gNBs =
absoluteFrequencySSB = 432990;
dl_frequencyBand = 66;
# this is 3600 MHz
dl_absoluteFrequencyPointA = 430000;
dl_absoluteFrequencyPointA = 430002;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
@@ -53,7 +53,7 @@ gNBs =
#uplinkConfigCommon
#frequencyInfoUL
ul_frequencyBand = 66;
ul_absoluteFrequencyPointA = 350000;
ul_absoluteFrequencyPointA = 350002;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing

View File

@@ -32,7 +32,7 @@ gNBs =
absoluteFrequencySSB = 430590;
dl_frequencyBand = 66;
# this is 2150 MHz
dl_absoluteFrequencyPointA = 430000;
dl_absoluteFrequencyPointA = 430002;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
@@ -54,7 +54,7 @@ gNBs =
#frequencyInfoUL
ul_frequencyBand = 66;
# this is 1750 MHz
ul_absoluteFrequencyPointA = 350000;
ul_absoluteFrequencyPointA = 350002;
#scs-SpecificCarrierList
ul_offstToCarrier = 0;
# subcarrierSpacing

View File

@@ -22,7 +22,7 @@ gNBs =
////////// Physical parameters:
pdsch_AntennaPorts_XP = 2;
pusch_AntennaPorts = 2;
pusch_AntennaPorts = 1;
do_CSIRS = 1;
do_SRS = 0;
@@ -220,7 +220,7 @@ RUs = (
tr_preference = "udp_ecpri_if5"
nb_tx = 2
nb_rx = 2
att_tx = 16
att_tx = 18
att_rx = 0;
num_tp_cores = 4;
rxfh_core_id = 9;

View File

@@ -30,7 +30,7 @@ gNBs =
absoluteFrequencySSB = 620736;
dl_frequencyBand = 78;
# this is 3300.30 MHz
dl_absoluteFrequencyPointA = 620020;
dl_absoluteFrequencyPointA = 620052;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing

View File

@@ -15,7 +15,7 @@ Ref :
DLSCH encoding : 137.0
L1 Rx processing : 345.0
PUSCH inner-receiver : 210.0
PUSCH decoding : 210.0
PUSCH decoding : 2200.0
Schedule Response : 48.0
DL & UL scheduling timing : 13.0
UL Indication : 60.0

View File

@@ -15,7 +15,7 @@ Ref :
DLSCH encoding : 177.0
L1 Rx processing : 345.0
PUSCH inner-receiver : 210.0
PUSCH decoding : 210.0
PUSCH decoding : 2200.0
Schedule Response : 111.0
DL & UL scheduling timing : 20.0
UL Indication : 127.0

View File

@@ -15,7 +15,7 @@ Ref :
DLSCH encoding : 118.0
L1 Rx processing : 305.0
PUSCH inner-receiver : 150.0
PUSCH decoding : 210.0
PUSCH decoding : 2200.0
Schedule Response : 30.0
DL & UL scheduling timing : 10.0
UL Indication : 40.0

View File

@@ -1,92 +0,0 @@
#/*
# * 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
# */
#---------------------------------------------------------------------
# Python for CI of OAI-eNB + COTS-UE
#
# Required Python Version
# Python 3.x
#
# Required Python Package
# pexpect
#---------------------------------------------------------------------
#-----------------------------------------------------------
# Import Libs
#-----------------------------------------------------------
import sys # arg
import re # reg
import os
import subprocess
class SplitReport():
def __init__(self):
self.logfilename = ''
self.destinationFolder = ''
def split(self):
self.destinationFolder = self.logfilename.replace(".log","")
if os.path.isfile(self.logfilename):
newImageLog = open(self.logfilename + '.new', 'w')
copyFlag = True
with open(self.logfilename, 'r') as imageLog:
for line in imageLog:
header = False
ret = re.search('====== Start of log for ([0-9\.A-Za-z\-\_]+) ======', line)
if ret is not None:
copyFlag = False
header = True
detailedLogFile = open(self.destinationFolder + '/' + ret.group(1), 'w')
if copyFlag:
newImageLog.write(line)
ret = re.search('====== End of log for ([0-9\.A-Za-z\-\_]+) ======', line)
if ret is not None:
copyFlag = True
detailedLogFile.close()
elif not copyFlag and not header:
detailedLogFile.write(line)
imageLog.close()
newImageLog.close()
os.rename(self.logfilename + '.new', self.logfilename)
else:
print('Cannot split unfound file')
#--------------------------------------------------------------------------------------------------------
#
# Start of main
#
#--------------------------------------------------------------------------------------------------------
argvs = sys.argv
argc = len(argvs)
SP = SplitReport()
while len(argvs) > 1:
myArgv = argvs.pop(1)
if re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE)
SP.logfilename = matchReg.group(1)
SP.split()
sys.exit(0)

View File

@@ -679,7 +679,7 @@ class EPCManagement():
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme.conf', self.SourceCodePath + '/scripts')
mySSH.command('chmod 775 entrypoint.sh', '\$', 60)
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
mySSH.command('docker-compose down', '\$', 60)
mySSH.command('docker-compose down -v', '\$', 60)
mySSH.command('docker-compose up -d db_init', '\$', 60)
# databases take time...
time.sleep(10)
@@ -831,8 +831,7 @@ class EPCManagement():
listOfContainers += ' prod-trf-gen'
nbContainers += 1
mySSH.command('docker-compose down', '\$', 60)
mySSH.command('docker volume prune --force || true', '\$', 60)
mySSH.command('docker-compose down -v', '\$', 60)
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
noMoreContainerNb = mySSH.getBefore().count('No such object')
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)

View File

@@ -750,7 +750,6 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
elif action == 'WaitEndBuild_eNB':
RAN.WaitBuildeNBisFinished(HTML)
elif action == 'Custom_Command':
logging.info(f"Executing custom command")
RAN.CustomCommand(HTML)
if RAN.prematureExit:
CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS)

View File

@@ -260,6 +260,7 @@ class RANManagement():
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)], HTML)
def CustomCommand(self, HTML):
logging.info(f"Executing custom command on {self.node}")
cmd = cls_cmd.getConnection(self.node)
ret = cmd.run(self.command)
cmd.close()

View File

@@ -36,7 +36,7 @@
<eNB_instance>1</eNB_instance>
<eNB_serverId>1</eNB_serverId>
<forced_workspace_cleanup>True</forced_workspace_cleanup>
<proxy_commit>a2fa216</proxy_commit>
<proxy_commit>b64d9bce986b38ca59e8582864ade3fcdd05c0dc</proxy_commit>
</testCase>
</testCaseList>

View File

@@ -32,7 +32,7 @@
000001
000002
000003
000011
000004
200000
020001
020002
@@ -82,10 +82,10 @@
<nb_healthy>10</nb_healthy>
</testCase>
<testCase id="000011">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
<testCase id="000004">
<class>Attach_UE</class>
<desc>Attach OAI UE</desc>
<id>l2sim4g_ue</id>
</testCase>
<testCase id="020001">

View File

@@ -32,7 +32,7 @@
000001
000002
000003
000011
000004
200000
020001
020002
@@ -80,10 +80,10 @@
<nb_healthy>9</nb_healthy>
</testCase>
<testCase id="000011">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
<testCase id="000004">
<class>Attach_UE</class>
<desc>Attach OAI UE</desc>
<id>l2sim5g_ue</id>
</testCase>
<testCase id="020001">

View File

@@ -28,6 +28,7 @@
<TestCaseRequestedList>
111111
100011
004000
000010
000011
020011
@@ -45,6 +46,13 @@
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_fdd_phytest_rrc.config</command>
</testCase>
<testCase id="000010">
<class>DeployGenObject</class>
<desc>Deploy OAI 5G gNB RF sim SA</desc>

View File

@@ -26,6 +26,7 @@
<htmlTabIcon>trash</htmlTabIcon>
<TestCaseRequestedList>
100012
004000
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
@@ -36,6 +37,13 @@
<yaml_path>yaml_files/5g_rfsimulator_fdd_phytest</yaml_path>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_fdd_phytest_rrc.config</command>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<desc>Clean Test Images on Test Server</desc>

View File

@@ -28,6 +28,7 @@
<TestCaseRequestedList>
111111
100001
004000
000000
000001
020001
@@ -43,6 +44,13 @@
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config</command>
</testCase>
<testCase id="000000">
<class>DeployGenObject</class>
<desc>Deploy OAI gNB</desc>

View File

@@ -26,6 +26,7 @@
<htmlTabIcon>trash</htmlTabIcon>
<TestCaseRequestedList>
100002
004000
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
@@ -36,6 +37,13 @@
<yaml_path>yaml_files/5g_rfsimulator_fr2_32prb</yaml_path>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config</command>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<desc>Clean Test Images on Test Server</desc>

View File

@@ -28,6 +28,7 @@
<TestCaseRequestedList>
111111
100001
004000
000000
000001
020001
@@ -43,6 +44,13 @@
<images_to_pull>oai-gnb oai-nr-ue</images_to_pull>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_tdd_dora_rrc.config</command>
</testCase>
<testCase id="000000">
<class>DeployGenObject</class>
<desc>Deploy OAI gNB</desc>

View File

@@ -26,6 +26,7 @@
<htmlTabIcon>trash</htmlTabIcon>
<TestCaseRequestedList>
100002
004000
222222
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
@@ -36,6 +37,13 @@
<yaml_path>yaml_files/5g_rfsimulator_tdd_dora</yaml_path>
</testCase>
<testCase id="004000">
<class>Custom_Command</class>
<desc>Clean-Up any residual volume</desc>
<node>localhost</node>
<command>docker volume rm 5g_rfsimulator_tdd_dora_rrc.config</command>
</testCase>
<testCase id="222222">
<class>Clean_Test_Server_Images</class>
<desc>Clean Test Images on Test Server</desc>

View File

@@ -0,0 +1,41 @@
<!--
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>build-tab</htmlTabRef>
<htmlTabName>Build Container Images</htmlTabName>
<htmlTabIcon>wrench</htmlTabIcon>
<TestCaseRequestedList>
000001
</TestCaseRequestedList>
<TestCaseExclusionList></TestCaseExclusionList>
<testCase id="000001">
<class>Build_Image</class>
<desc>Cross-Compile for ARM64</desc>
<kind>build_cross_arm64</kind>
<eNB_instance>0</eNB_instance>
<eNB_serverId>0</eNB_serverId>
<forced_workspace_cleanup>True</forced_workspace_cleanup>
</testCase>
</testCaseList>

View File

@@ -36,7 +36,7 @@
<eNB_instance>1</eNB_instance>
<eNB_serverId>1</eNB_serverId>
<forced_workspace_cleanup>True</forced_workspace_cleanup>
<proxy_commit>a2fa216</proxy_commit>
<proxy_commit>b64d9bce986b38ca59e8582864ade3fcdd05c0dc</proxy_commit>
</testCase>
</testCaseList>

View File

@@ -111,7 +111,7 @@
<testCase id="000002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
</testCase>
@@ -168,14 +168,14 @@
<class>Custom_Command</class>
<desc>Trigger Reestablishment</desc>
<node>ofqot</node>
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command>
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
<command_fail>yes</command_fail>
</testCase>
<testCase id="060002">
<class>Custom_Command</class>
<desc>Verify Reestablishment</desc>
<node>ofqot</node>
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command>
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
<command_fail>yes</command_fail>
</testCase>

View File

@@ -39,6 +39,10 @@
110011
110001
150001
160001
100002
160002
150001
110011
110001
150000
@@ -114,7 +118,7 @@
<testCase id="100002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
</testCase>
<testCase id="150000">
@@ -184,6 +188,21 @@
<iperf_profile>single-ue</iperf_profile>
</testCase>
<testCase id="160001">
<class>Custom_Command</class>
<desc>Trigger Reestablishment (on DU)</desc>
<node>ofqot</node>
<command>echo ci force_reestab | nc -N 192.168.68.195 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
<command_fail>yes</command_fail>
</testCase>
<testCase id="160002">
<class>Custom_Command</class>
<desc>Verify Reestablishment (on CU)</desc>
<node>ofqot</node>
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
<command_fail>yes</command_fail>
</testCase>
<testCase id="130201">
<class>Undeploy_Object</class>
<desc>Undeploy CU-DU</desc>

View File

@@ -105,7 +105,7 @@
<testCase id="200002">
<class>IdleSleep</class>
<desc>Sleep</desc>
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
</testCase>
@@ -162,14 +162,14 @@
<class>Custom_Command</class>
<desc>Trigger Reestablishment</desc>
<node>ofqot</node>
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'force-remove UE RNTI [0-9a-f]{4} from RLC to trigger reestablishment'</command>
<command>echo ci force_reestab | nc -N 192.168.68.194 9090 | grep -E 'Reset RLC counters of UE RNTI [0-9a-f]{4} to trigger reestablishment'</command>
<command_fail>yes</command_fail>
</testCase>
<testCase id="260002">
<class>Custom_Command</class>
<desc>Verify Reestablishment</desc>
<node>ofqot</node>
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1 reconf_after_reestab 1'</command>
<command>echo ci get_reestab_count | nc -N 192.168.68.194 9090 | grep -E 'UE RNTI [0-9a-f]{4} reestab 1'</command>
<command_fail>yes</command_fail>
</testCase>

View File

@@ -52,7 +52,7 @@
<testCase id="090102">
<class>Initialize_OAI_UE</class>
<desc>Initialize NR UE USRP</desc>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --rrc_config_path . --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
<air_interface>NR</air_interface>
</testCase>

View File

@@ -52,7 +52,7 @@
<testCase id="090104">
<class>Initialize_OAI_UE</class>
<desc>Initialize NR UE USRP</desc>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
<air_interface>NR</air_interface>
</testCase>

View File

@@ -410,16 +410,33 @@ in HSS config:
NB_USERS: 10
```
in UE config:
All UE parameter values will be taken from the mounted config file, so modify
the corresponding UE file to reflect the above changes
```yaml
MCC: '208'
MNC: '96'
SHORT_IMSI: '0100000001'
LTE_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
OPC: 'c42449363bbad02b66d16bc975d77cc1'
MSISDN: '001011234561010'
HPLMN: 20896
oai_ue0:
[...]
volumes:
- ../../conf_files/lteue.usim-ci.conf:/opt/oai-lte-ue/etc/ue_usim.conf
```
and in the UE file, you should have
```
PLMN: {
PLMN0: {
FULLNAME="OpenAirInterface";
SHORTNAME="OAICN";
MNC="96";
MCC="208";
};
};
[...]
SIM: {
MSIN="0100000001";
USIM_API_K="fec86ba6eb707ed08905757b1bb44b8f";
OPC="c42449363bbad02b66d16bc975d77cc1";
MSISDN="001011234561010";
};
```
As you can see: `LTE_K` and `LTE_KEY` are the same value. And `OP_KEY` and `OPC` can be deduced from each other. Look in HSS logs.
@@ -471,13 +488,19 @@ in SPGW-C/-U configs:
REALM: openairinterface.org
```
in eNB config:
In eNB, all the parameter values will be taken from the mounted config file.
```yaml
MCC: '208'
MNC: '96'
MNC_LENGTH: 2
TAC: 1
oai_enb0:
[...]
volumes:
- ../../conf_files/enb.band7.25prb.rfsim.conf:/opt/oai-enb/etc/enb.conf
```
with the eNB config reading:
```libconfig
plmn_list = ( { mcc = 208; mnc = 96; mnc_length = 2; } );
```
The values SHALL match, and `TAC` shall match `TAC_0` from MME.

View File

@@ -185,7 +185,7 @@ services:
privileged: true
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169080000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169090000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
depends_on:
- oai-gnb
networks:

View File

@@ -12,18 +12,81 @@
</tr>
</table>
This page is only valid for an `Ubuntu18` host.
This page is valid for an `Ubuntu18` host.
It is also valid for `Ubuntu 20.04`.
This tutorial is only valid once this file is merged into the `develop` branch.
# 1. Adapt the `docker-compose` to your environment #
The yaml file is in the following directory: `ci-scripts/yaml_files/5g_l2sim_tdd`
# 1. Retrieving the images on Docker-Hub #
In the `SMF` section, provide your own DNS IP address:
```yaml
DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
```
gNB section:
All the parameter values will be taken from the mounted config file:
```yaml
oai-gnb:
[...]
volumes:
- ../../conf_files/gnb.sa.band78.106prb.l2sim.conf:/opt/oai-gnb/etc/gnb.conf
```
You need to provide your docker-host primary IP address and interface name: in our case `172.21.16.128` and `eno1`.
The following refers to the contents of the previously mentioned .conf file
```yaml
GNB_NGA_IF_NAME: eno1
GNB_NGA_IP_ADDRESS: 172.21.16.128
GNB_NGU_IF_NAME: eno1
GNB_NGU_IP_ADDRESS: 172.21.16.128
```
For the UE, all the parameter values will be taken from the mounted config
file, in the section `oai-nr-ue0`:
```yaml
oai-nr-ue0:
[...]
volumes:
- ../../conf_files/nrue.band78.106prb.l2sim.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
```
In this section, you need to set the proper values for `local_n_if_name` and `remote_n_address`
where the UE configuration (mounted to `/opt/oai-nr-ue/etc/nr-ue.conf`) reads:
```libconfig
MACRLCs = (
{
num_cc = 1;
tr_n_preference = "nfapi";
local_n_if_name = "eno1";
remote_n_address = "127.0.0.1"; //Proxy IP
local_n_address = "127.0.0.1";
...
```
This tutorial is a first draft. This nFAPI feature and the proxy are still under development.
At time of writing, we were able to run in `host-mode`, 1 `NR-UE` and just ping traffic.
# 2. Retrieving the images on Docker-Hub #
Currently the images are hosted under the team account `oaisoftwarealliance`. They were previously hosted under the user account `rdefosseoai`.
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
```bash
$ docker login
docker login
```
```bash
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
@@ -32,33 +95,33 @@ Password:
Now pull images.
```bash
$ docker pull mysql:8.0
$ docker pull oaisoftwarealliance/oai-amf:v1.5.0
$ docker pull oaisoftwarealliance/oai-nrf:v1.5.0
$ docker pull oaisoftwarealliance/oai-smf:v1.5.0
$ docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
$ docker pull oaisoftwarealliance/trf-gen-cn5g:focal
docker pull mysql:8.0
docker pull oaisoftwarealliance/oai-amf:v1.5.0
docker pull oaisoftwarealliance/oai-nrf:v1.5.0
docker pull oaisoftwarealliance/oai-smf:v1.5.0
docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
docker pull oaisoftwarealliance/trf-gen-cn5g:focal
$ docker pull oaisoftwarealliance/oai-gnb:develop
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
$ docker pull oaisoftwarealliance/proxy:develop
docker pull oaisoftwarealliance/oai-gnb:develop
docker pull oaisoftwarealliance/oai-nr-ue:develop
docker pull oaisoftwarealliance/proxy:develop
```
And **re-tag** them for tutorials' docker-compose file to work.
```bash
$ docker image tag oaisoftwarealliance/proxy:develop oai-lte-multi-ue-proxy:latest
docker image tag oaisoftwarealliance/proxy:develop oai-lte-multi-ue-proxy:latest
```
```bash
$ docker logout
docker logout
```
Note that the proxy image is based on the source available at [https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy).
At time of writing, the `latest` tag corresponded to `56cfdc046a5f96d5e67d42a2fc2bf6ba2fe58b41` commit.
# 2. Deploy containers #
# 3. Deploy containers #
**CAUTION: this SHALL be done in multiple steps.**
@@ -72,11 +135,13 @@ The `gNB`, `proxy` and `NR-UE` containers will be deployed in `host`-mode. It wi
sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
```
## 2.1. Deploy OAI 5G Core Network ##
## 3.1. Deploy OAI 5G Core Network ##
```bash
$ cd ci-scripts/yaml_files/5g_l2sim_tdd
$ docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
cd ci-scripts/yaml_files/5g_l2sim_tdd
docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
```
```bash
Creating network "l2sim-oai-public-net" with driver "bridge"
Creating network "l2sim-oai-traffic_net-net" with driver "bridge"
Creating l2sim-oai-nrf ... done
@@ -90,7 +155,9 @@ Creating l2sim-oai-ext-dn ... done
Wait for a bit.
```bash
$ docker-compose ps -a
docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
@@ -104,7 +171,9 @@ l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 880
At this point, you can prepare a capture on the newly-created public docker bridges:
```bash
$ ifconfig
ifconfig
```
```bash
...
l2sim-public: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.71.129 netmask 255.255.255.192 broadcast 192.168.71.191
@@ -124,16 +193,19 @@ l2sim-traffic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
TX packets 3999 bytes 23367972 (23.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
$ sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)" -i l2sim-public -i l2sim-traffic -w /tmp/capture_5g_l2sim_tdd.pcap > /tmp/tshark.log 2>&1 &
```
```bash
sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)" -i l2sim-public -i l2sim-traffic -w /tmp/capture_5g_l2sim_tdd.pcap > /tmp/tshark.log 2>&1 &
```
## 2.2. Deploy OAI gNB in Standalone Mode as a VNF ##
## 3.2. Deploy OAI gNB in Standalone Mode as a VNF ##
**CAUTION: To execute this 2nd step, the whole `CN5G` SHALL be in `healthy` state (especially the `mysql` container).**
```bash
$ docker-compose up -d oai-gnb
docker-compose up -d oai-gnb
```
```bash
l2sim-oai-nrf is up-to-date
l2sim-oai-spgwu is up-to-date
l2sim-oai-ext-dn is up-to-date
@@ -144,6 +216,8 @@ Wait for a bit.
```bash
$ docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
@@ -157,8 +231,10 @@ l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 880
You can verify that the `gNB` is connected with the `AMF`:
```bagh
$ docker logs rfsim5g-oai-amf
```bash
docker logs l2sim-oai-amf
```
```bash
...
[AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
[AMF] [amf_app] [info ] | Index | Status | Global ID | gNB Name | PLMN |
@@ -167,10 +243,12 @@ $ docker logs rfsim5g-oai-amf
...
```
## 2.3. Deploy OAI NR-UE and proxy
## 3.3. Deploy OAI NR-UE and proxy
```bash
$ docker-compose up -d proxy oai-nr-ue0
docker-compose up -d proxy oai-nr-ue
```
```bash
l2sim-mysql is up-to-date
l2sim-oai-nrf is up-to-date
l2sim-oai-amf is up-to-date
@@ -185,7 +263,9 @@ Creating l2sim-proxy ... done
Wait for a bit.
```bash
$ docker-compose ps -a
docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
@@ -197,8 +277,11 @@ l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/
l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
l2sim-proxy /oai-lte-multi-ue-proxy/bi ... Up (healthy)
$ docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-nrf l2sim-oai-smf l2sim-oai-spgwu l2sim-proxy
```
```bash
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-nrf l2sim-oai-smf l2sim-oai-spgwu l2sim-proxy
```
```bash
CONTAINER CPU % MEM USAGE / LIMIT MEM %
l2sim-mysql 0.03% 206.7MiB / 62.54GiB 0.32%
l2sim-oai-amf 4.05% 29.49MiB / 62.54GiB 0.05%
@@ -216,7 +299,9 @@ l2sim-proxy 6.97% 290.4MiB / 62.54GiB 0.45%
But the CPU speed matters; I am running on a fast server:
```bash
$ lscpu
lscpu
```
```bash
Architecture: x86_64
CPU(s): 16
...
@@ -239,7 +324,9 @@ We will work on this issue.
Making sure the OAI UE is connected:
```bash
$ docker exec -it l2sim-oai-nr-ue /bin/bash
docker exec -it l2sim-oai-nr-ue0 /bin/bash
```
```bash
root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.71.137 netmask 255.255.255.192 broadcast 192.168.71.191
@@ -266,14 +353,19 @@ oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```
# 3. Check traffic #
# 4. Check traffic #
## 3.1. Check your Internet connectivity ##
## 4.1. Check your Internet connectivity ##
You can also check with the `ext-dn` container (IP address is `192.168.72.135` in docker-compose)
```bash
$ docker exec -it l2sim-oai-nr-ue /bin/bash
docker exec -it l2sim-oai-nr-ue0 /bin/bash
```
```bash
ping -I oaitun_ue1 -c 20 192.168.72.135
```
```bash
root@bb4d400a832d# ping -I oaitun_ue1 -c 20 192.168.72.135
PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
64 bytes from 192.168.72.135: icmp_seq=1 ttl=63 time=65.1 ms
@@ -287,10 +379,12 @@ PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of d
rtt min/avg/max/mdev = 16.413/120.639/209.673/57.159 ms
```
# 4. Un-deployment #
# 5. Un-deployment #
```bash
$ docker-compose down
docker-compose down
```
```bash
Stopping l2sim-oai-nr-ue2 ... done
Stopping l2sim-oai-nr-ue ... done
Stopping l2sim-oai-gnb ... done
@@ -313,35 +407,3 @@ Removing network l2sim-oai-public-net
Removing network l2sim-oai-traffic-net
```
# 5. Adapt the `docker-compose` to your environment #
In the `SMF` section, provide your own DNS IP address:
```yaml
DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
```
In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `172.21.16.128` and `eno1`.
```yaml
GNB_NGA_IF_NAME: eno1
GNB_NGA_IP_ADDRESS: 172.21.16.128
GNB_NGU_IF_NAME: eno1
GNB_NGU_IP_ADDRESS: 172.21.16.128
```
Same thing in the `nr-ue` section:
```yaml
NR_UE_NFAPI_IF_NAME: eno1
```
This tutorial is a first draft. This nFAPI feature and the proxy are still under development.
At time of writing, we were able to run in `host-mode`, 1 `NR-UE` and just ping traffic.
Later development will include:
- deploying `gNB-VNF`, `proxy` and `UE` in isolated containers (with their own IP address)
- more UEs
- more traffic (`UDP` and `TCP`)

View File

@@ -234,24 +234,23 @@ oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
## 2.4. Deploy Second OAI NR-UE in RF simulator mode and in Standalone Mode ##
```bash
Create a entry for new IMSI (208990100001101) in oai_db.sql file
Refer Section - [Making the NR-UE connect to the core network](#51-making-the-nr-ue-connect-to-the-core-network)
Create a entry for new IMSI (208990100001101) in oai_db.sql file.
For this, refer to section [Making the NR-UE connect to the core
network](#51-making-the-nr-ue-connect-to-the-core-network)
Create entry for Second UE in docker-compose.yaml file as follows:
Create the entry for the second UE in `docker-compose.yaml` file as follows:
```yaml
oai-nr-ue2:
image: oai-nr-ue:develop
privileged: true
container_name: rfsim5g-oai-nr-ue2
environment:
FULL_IMSI: '208990100001101'
FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
OPC: 'C42449363BBAD02B66D16BC975D77CC1'
DNN: oai
NSSAI_SST: 1
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
depends_on:
- oai-gnb
volumes:
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
networks:
public_net:
ipv4_address: 192.168.71.151
@@ -496,13 +495,31 @@ INSERT INTO `users` VALUES ('208990100001101','1','55000000000000',NULL,'PURGED'
As you can see, 2 other values shall match in the NR-UE section of `docker-compose.yaml`:
OAI UE - 1
* `FULL_IMSI: '208990100001100'`
* `FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'`
All the values such as IMSI and KEY are taken from the configuration file mounted into the container. For the first UE, provision as usual through the config file
OAI UE - 2
* `FULL_IMSI: '208990100001101'`
* `FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'`
```yaml
oai-nr-ue:
[...]
volumes:
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
```
with the config having:
```libconfig
uicc0 = {
imsi = "208990100001100";
key = "fec86ba6eb707ed08905757b1bb44b8f";
opc= "C42449363BBAD02B66D16BC975D77CC1";
dnn= "oai";
nssai_sst=1;
}
```
The second UE's IMSI might be changed by either having the second UEs
docker-compose entry mount another config, or add `--uicc0.imsi
208990100001101` in `USE_ADDITIONAL_OPTIONS` entry. Note that the latter is a
feature of the configuration module to overwrite any configuration option in
the config file on the command line.
We are also using a dedicated `oai-smf.conf` for the `SMF` container: the `oai` DNN shall match the one in the NR-UE section of `docker-compose.yaml` (`DNN: oai`).

View File

@@ -23,7 +23,7 @@ services:
privileged: true
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
volumes:
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- rrc.config:/opt/oai-nr-ue/etc/rrc/

View File

@@ -23,7 +23,7 @@ services:
privileged: true
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
volumes:
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- rrc.config:/opt/oai-nr-ue/etc/rrc/

View File

@@ -23,7 +23,7 @@ services:
privileged: true
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --rrc_config_path etc/rrc/ --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
volumes:
- ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- rrc.config:/opt/oai-nr-ue/etc/rrc/

View File

@@ -186,7 +186,7 @@ services:
privileged: true
container_name: rfsim5g-oai-nr-ue
environment:
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152250000 --CO -400000000 --ssb 76 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152260000 --CO -400000000 --ssb 76 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
depends_on:
- oai-gnb
networks:

View File

@@ -43,7 +43,7 @@ services:
container_name: sa-du-b200-gnb
environment:
USE_B2XX: 'yes'
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx 14
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 18 --RUs.[0].att_tx 18
volumes:
- ../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
- /dev:/dev

View File

@@ -6,7 +6,7 @@ services:
privileged: true
container_name: sa-cu-gnb
environment:
USE_ADDITIONAL_OPTIONS: --sa --log_config.global_log_options level,nocolor,time,line_num,function
USE_ADDITIONAL_OPTIONS: --sa --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function
volumes:
- ../../conf_files/gnb-cu.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
networks:
@@ -26,7 +26,7 @@ services:
container_name: sa-du-b200-gnb
environment:
USE_B2XX: 'yes'
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 14 --RUs.[0].att_tx 14
USE_ADDITIONAL_OPTIONS: --sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 18 --RUs.[0].att_tx 18
volumes:
- ../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
- /dev:/dev

View File

@@ -110,11 +110,11 @@
</testCase>
<testCase id="nr_pbchsim.106rb">
<desc>nr_pbchsim Test cases. (Test1: PBCH-only, 106 PRB),
<desc>nr_pbchsim Test cases. (Test1: PBCH-only, 106 PRB, NID 2),
(Test2: PBCH and synchronization, 106PBR),
(Test3: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc>
<main_exec>nr_pbchsim</main_exec>
<main_exec_args>-s-11 -S-8 -n10 -R106
<main_exec_args>-s-11 -S-8 -n10 -R106 -N2
-s-11 -S-8 -n10 -o8000 -I -R106
-s-11 -S-8 -n10 -R106 -O6</main_exec_args>
<tags>test1 test2 test3</tags>
@@ -200,8 +200,8 @@
-n100 -e16 -s11 -S13
-n100 -q1 -e26 -s30
-n100 -e0 -t95 -S-1.0 -i 2 1 0
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
-n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
-n10 -s20 -U 3 0 0 2 -gA -x1 -y4 -z4
-n10 -s20 -U 3 0 0 2 -gA -x2 -y4 -z4
-n10 -s20 -U 3 0 0 2 -x4 -y4 -z4</main_exec_args>
<tags>test1 test2 test3 test4 test5 test6 test7</tags>
<search_expr_true>PDSCH test OK</search_expr_true>

View File

@@ -38,7 +38,6 @@ gen_nvram_path=$OPENAIR_DIR/cmake_targets/ran_build/build
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
HW=""
VERBOSE_CI=0
VERBOSE_COMPILE=0
RUN_GROUP=0
TEST_CASE_GROUP=""
@@ -110,8 +109,6 @@ Options:
Adds a debgging facility to the binary files: GUI with major internal synchronization events
-x | --xforms
Will compile with software oscilloscope features
--verbose-ci
Compile with verbose instructions in CI Docker env
--verbose-compile
Shows detailed compilation instructions in makefile
--build-doxygen
@@ -336,10 +333,6 @@ function main() {
-x | --xforms)
echo_info "Will generate the software oscilloscope features"
shift;;
--verbose-ci)
VERBOSE_CI=1
echo_info "Will compile with verbose instructions in CI Docker env"
shift;;
--verbose-compile)
VERBOSE_COMPILE=1
echo_info "Will compile with verbose instructions"
@@ -529,7 +522,7 @@ function main() {
echo_info "Doxygen generation log is located here: $doxygen_log"
echo_info "Generating Doxygen files....please wait"
(
cmake --build . --target doc
$CMAKE --build . --target doc
) >& $doxygen_log
fi

View File

@@ -0,0 +1,16 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc-9)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++-9)
set(CROSS_COMPILE 1)
set(bnProc_gen_128_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(bnProc_gen_avx2_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(bnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(cnProc_gen_128_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(cnProc_gen_avx2_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(cnProc_gen_avx512_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(genids_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)
set(_check_vcd_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NATIVE_DIR}) # /../build)

View File

@@ -32,7 +32,7 @@ OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g")
OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g")
case "$OS_DISTRO" in
fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;;
rhel) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; 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" ;;
@@ -54,16 +54,17 @@ fi
###############################
## echo and family
###############################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[1;34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
reset_color='\E[00m'
COLORIZE=1
# only emit color if connected to a terminal, and if it supports colors
if [ -t 1 ]; then
num_colors=$(tput colors)
if [ -n "$num_colors" ] && [ "$num_colors" -ge 8 ]; then
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[1;34m'
reset_color='\E[00m'
fi
fi
cecho() {
# Color-echo
@@ -72,8 +73,7 @@ cecho() {
local default_msg="No Message."
message=${1:-$default_msg}
color=${2:-$green}
[ "$COLORIZE" = "1" ] && message="$color$message$reset_color"
echo -e "$message"
echo -e "$color$message$reset_color"
return
}
@@ -226,18 +226,15 @@ compilations() {
local verbose=$([ "$VERBOSE_COMPILE" == "1" ] && echo "-v" || echo "")
echo cd $OPENAIR_DIR/cmake_targets/$dir/build
cd $OPENAIR_DIR/cmake_targets/$dir/build
echo_info "Running \"cmake --build . $verbose --target $targets -- -j$(nproc)\"" $green
echo_info "Running \"$CMAKE --build . $verbose --target $targets -- -j$(nproc)\"" $green
echo "Log file for compilation is being written to: $dlog/$logfile"
set +e
{
cmake --build . $verbose --target $targets -- -j$(nproc)
$CMAKE --build . $verbose --target $targets -- -j$(nproc)
ret=$?
} > $dlog/$logfile 2>&1
if [ "$VERBOSE_CI" == "1" ]; then
echo "====== Start of log for $logfile ======"
cat $dlog/$logfile
echo "====== End of log for $logfile ======"
fi
# Print the errors and warnings for CI purposes
egrep -A3 "warning:|error:" $dlog/$logfile || true
check_warnings "$dlog/$logfile"
if [[ $ret -eq 0 ]]; then
echo_success "$targets compiled"
@@ -324,8 +321,7 @@ check_install_usrp_uhd_driver(){
$SUDO apt-get remove libuhd3.15.0 -y || true
local distribution=$(get_distribution_release)
if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then
$SUDO apt-get remove libuhd4.0.0 -y || true
$SUDO apt-get remove libuhd4.1.0 -y || true
$SUDO apt-get remove libuhd4.?.? -y || true
fi
v=$(lsb_release -cs)
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
@@ -355,7 +351,7 @@ check_install_usrp_uhd_driver(){
$SUDO apt-get -y install python-tk $boost_libs_ubuntu libusb-1.0-0-dev
case "$(get_distribution_release)" in
"ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04")
$SUDO apt-get -y install libuhd-dev libuhd4.4.0 uhd-host
$SUDO apt-get -y install libuhd-dev libuhd4.5.0 uhd-host
;;
esac
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
@@ -689,6 +685,15 @@ install_simde_from_source(){
$SUDO rm -rf /tmp/simde
git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
cd /tmp/simde
# we can specify a given version of SIMDE (sha-one or tag)
if [[ -v SIMDE_VERSION ]]; then
git checkout -f $SIMDE_VERSION
else
# At time of writing, last working commit for OAI
git checkout 389f360a66d4a3bec62b7d71ad8be877487809ba
fi
# Showing which version is used
git log -n1
# brute force copy into /usr/include
$SUDO \cp -rv ../simde /usr/include
}

View File

@@ -1,7 +1,7 @@
The configuration module objectives are
1. Allow easy parameters management in oai, helping the development of a flexible, modularized and fully configurable softmodem.
1. Use a common configuration API in all oai modules
1. Allow development of alternative configuration sources without modifying the oai code. Today the only delivered configuration source is the libconfig format configuration file.
2. Use a common configuration API in all oai modules
3. Allow development of alternative configuration sources without modifying the oai code. Today the only delivered configuration source is the libconfig format configuration file.
As a developer you may need to look at these sections:

View File

@@ -1,7 +1,7 @@
The configuration module maps a configuration file section to a `paramdef_t` structure array. One `config_get` call can be used to return the values of all the parameters described in the `paramdef_t` array.
Retrieving a single occurence of a parameter set ( a group in the libconfig terminology) is just a two steps task:
1. describe the parameters in a `paramdef_t` array
1. call the `config_get` function
2. call the `config_get` function
[config_get example](../../config/devusage/addaparam.md)

View File

@@ -1,9 +1,16 @@
[[_TOC_]]
-O is the only mandatory command line option to start the eNodeb softmodem (lte-softmodem executable), it is used to specify the configuration source with the associated parameters:
# General usage
`-O` is the only mandatory command line option to start the softmodems (4G/5G xNB, UEs). It is used to specify the configuration source with the associated parameters:
```bash
$ ./lte-softmodem -O <configsource>:<parameter1>:<parameter2>:...
```
The configuration module can also be used without a configuration source, ie to only parse the command line. In this case the -O switch is optional. This mode is used in the ue-softmodem executable and by the phy_simulators executables (ulsim, dlsim)
The same applies for `nr-softmodem`, `lte-uesoftmodem`, `nr-uesoftmodem`.
The configuration module can also be used without a configuration source, ie to only parse the command line. In this case the -O switch is optional. This mode is typically used in the `lte-uesoftmodem` executable and by the physical simulator executables (`ulsim`, `dlsim`).
# Configuration sources
Currently the available config sources are:
@@ -13,6 +20,8 @@ $ ./lte-softmodem -O libconfig:<config>:dbgl<debuglevel>
```
- **cmdlineonly**: command line only, the default mode for lte-uesoftmodem and the phy simiulators. In this case -O may be used to specify the config module debug level.
# Detailed configuration information and debugging
The debug level is a mask:
* bit 1: print parameters values
* bit 2: print memory allocation/free performed by the config module
@@ -32,8 +41,8 @@ bit 5 (dbgl32) can be useful to detect unused parameters from a config file or t
To get help on supported parameters you can use specific options:
* ---help: print help for command line only parameters and for parameters not defined in a specific section
* ---help_< prefix > : print help for parameters defined under the section < prefix >
* `--help`: print help for command line only parameters and for parameters not defined in a specific section
* `--help_<prefix>` : print help for parameters defined under the section `<prefix>`
```
./lte-softmodem -O libconfig:/usr/local/oai/conf/enb.nbiot.band7.tm1.50PRB.usrpb210.conf --help
@@ -84,15 +93,16 @@ Getting ENBSParams
--------------------------------------------------------------------
/usr/local/oai/issue390_configmodule_cmdlinebug/openairinterface5g/common/config/config_cmdline.c:224 config_process_cmdline() Exiting OAI softmodem: [CONFIG] Exiting after displaying help
```
For the lte-softmodem (the eNodeB) The config source parameter defaults to libconfig, preserving the initial -O option format. In this case you cannot specify the debug level.
For the lte-softmodem (the eNodeB), the config source parameter defaults to libconfig, preserving the initial -O option format. In this case you cannot specify the debug level.
```bash
$ ./lte-softmodem -O <config>
```
# Configuration of the configuration module
Configuration file parameters, except for the configuration file path, can be specified in a **config** section in the configuration file:
```
@@ -101,7 +111,12 @@ config:
debugflags = 1;
}
```
Configuration files examples can be found in the targets/PROJECTS/GENERIC-LTE-EPC/CONF sub-directory of the oai source tree. To minimize the number of configuration file to maintain, any parameter can also be specified on the command line. For example to modify the lte bandwidth to 20 MHz where the configuration file specifies 10MHz you can enter:
Configuration files examples can be found in the `targets/PROJECTS/GENERIC-LTE-EPC/CONF` sub-directory of the oai source tree.
# Overwriting config options from the command line
To minimize the number of configuration file to maintain, any parameter can also be specified on the command line. For example to modify the lte bandwidth to 20 MHz where the configuration file specifies 10MHz you can enter:
```bash
$ ./lte-softmodem -O <config> --eNBs.[0].component_carriers.[0].N_RB_DL 100

View File

@@ -52,11 +52,14 @@
// Fixme: a better place to be shure it is called
void read_cpu_hardware (void) __attribute__ ((constructor));
void read_cpu_hardware (void) {__builtin_cpu_init(); }
#if !defined(__arm__) && !defined(__aarch64__)
void read_cpu_hardware (void) {__builtin_cpu_init(); }
#else
void read_cpu_hardware (void) {}
#endif
log_mem_cnt_t log_mem_d[2];
int log_mem_flag=0;
int log_mem_multi=1;
int log_mem_flag = 0;
volatile int log_mem_side=0;
pthread_mutex_t log_mem_lock;
pthread_cond_t log_mem_notify;
@@ -88,9 +91,9 @@ const mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
mapping log_maskmap[] = LOG_MASKMAP_INIT;
static const char *log_level_highlight_start[] =
static const char *const 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[] =
static const char *const 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);
@@ -852,15 +855,6 @@ void flush_mem_to_file(void)
}
}
const char logmem_log_level[NUM_LOG_LEVEL] = {
[OAILOG_ERR] = 'E',
[OAILOG_WARNING] = 'W',
[OAILOG_ANALYSIS] = 'A',
[OAILOG_INFO] = 'I',
[OAILOG_DEBUG] = 'D',
[OAILOG_TRACE] = 'T',
};
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)
{
//logRecord_mt(file,func,line, pthread_self(), comp, level, format, ##args)
@@ -941,35 +935,24 @@ static void log_output_memory(log_component_t *c, const char *file, const char *
int logInit_log_mem (void)
{
if(log_mem_flag==1){
if(log_mem_multi==1){
printf("log-mem multi!!!\n");
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
log_mem_d[0].buf_index=0;
log_mem_d[0].enable_flag=1;
log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
log_mem_d[1].buf_index=0;
log_mem_d[1].enable_flag=1;
log_mem_side=0;
if ((pthread_mutex_init (&log_mem_lock, NULL) != 0)
|| (pthread_cond_init (&log_mem_notify, NULL) != 0)) {
if (log_mem_flag == 1) {
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
log_mem_d[0].buf_index = 0;
log_mem_d[0].enable_flag = 1;
log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
log_mem_d[1].buf_index = 0;
log_mem_d[1].enable_flag = 1;
log_mem_side = 0;
if ((pthread_mutex_init(&log_mem_lock, NULL) != 0) || (pthread_cond_init(&log_mem_notify, NULL) != 0)) {
log_mem_d[1].enable_flag=0;
return -1;
}
pthread_create(&log_mem_thread, NULL, (void *(*)(void *))flush_mem_to_file, (void*)NULL);
}else{
printf("log-mem single!!!\n");
log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
log_mem_d[0].buf_index=0;
log_mem_d[0].enable_flag=1;
log_mem_d[1].enable_flag=0;
log_mem_side=0;
}
}else{
log_mem_d[0].buf_p=NULL;
log_mem_d[1].buf_p=NULL;
log_mem_d[0].enable_flag=0;
log_mem_d[1].enable_flag=0;
pthread_create(&log_mem_thread, NULL, (void *(*)(void *))flush_mem_to_file, (void *)NULL);
} else {
log_mem_d[0].buf_p = NULL;
log_mem_d[1].buf_p = NULL;
log_mem_d[0].enable_flag = 0;
log_mem_d[1].enable_flag = 0;
}
printf("log init done\n");
@@ -989,7 +972,6 @@ void close_log_mem(void){
while(log_mem_write_flag==1){
usleep(100);
}
if(log_mem_multi==1){
snprintf(f_name,1024, "%s_%d.log",log_mem_filename,log_mem_file_cnt);
fp=open(f_name, O_WRONLY | O_CREAT, 0666);
int ret = write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
@@ -1009,16 +991,6 @@ void close_log_mem(void){
}
close(fp);
free(log_mem_d[1].buf_p);
}else{
fp=open(log_mem_filename, O_WRONLY | O_CREAT, 0666);
int ret = write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
if ( ret < 0) {
fprintf(stderr,"{LOG} %s %d Couldn't write in %s \n",__FILE__,__LINE__,log_mem_filename);
exit(EXIT_FAILURE);
}
close(fp);
free(log_mem_d[0].buf_p);
}
}
}

View File

@@ -1,8 +1,13 @@
add_executable(genids genids.c)
set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
if (CROSS_COMPILE)
find_package(genids)
else()
add_executable(genids genids.c)
set_target_properties(genids PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
export(TARGETS genids FILE
"${CMAKE_BINARY_DIR}/genidsConfig.cmake")
endif()
add_custom_command(OUTPUT T_IDs.h
COMMAND ./genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
COMMAND genids ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt T_IDs.h
DEPENDS genids
COMMENT "Generating T_IDs.h from T_messages.txt"
)
@@ -12,14 +17,19 @@ add_custom_command(OUTPUT T_messages.txt.h
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
target_include_directories(_check_vcd PRIVATE
.. ../itti ../../../openair2/COMMON tracer
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_options(_check_vcd PRIVATE -Wall)
target_link_libraries(_check_vcd PRIVATE m pthread)
set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
if (CROSS_COMPILE)
find_package(_check_vcd)
else ()
add_executable(_check_vcd check_vcd.c tracer/database.c tracer/utils.c T_IDs.h T_messages.txt.h)
target_include_directories(_check_vcd PRIVATE
.. ../itti ../../../openair2/COMMON tracer
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_options(_check_vcd PRIVATE -Wall)
target_link_libraries(_check_vcd PRIVATE m pthread)
set_target_properties(_check_vcd PROPERTIES RUNTIME_OUTPUT_DIRECTORY .)
export(TARGETS _check_vcd FILE
"${CMAKE_BINARY_DIR}/_check_vcdConfig.cmake")
endif()
add_custom_target(check_vcd
COMMAND _check_vcd ${CMAKE_CURRENT_SOURCE_DIR}/T_messages.txt ${CMAKE_CURRENT_SOURCE_DIR}/../LOG/vcd_signal_dumper.h
DEPENDS _check_vcd

View File

@@ -274,6 +274,7 @@ void sr(void *_d, event e)
#define NR_NO_RNTI 0
#define NR_RA_RNTI 2
#define NR_C_RNTI 3
#define NR_SI_RNTI 4
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
int frame, int slot, int harq_pid, void *buf, int bufsize,
@@ -346,8 +347,17 @@ void nr_dl(void *_d, event e)
{
ev_data *d = _d;
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
if (e.e[d->dl_rnti].i == 0xffff) {
if (d->no_sib) return;
if (d->max_sib && d->cur_sib == d->max_sib) return;
d->cur_sib++;
}
trace_nr(d, NR_DIRECTION_DOWNLINK,
e.e[d->dl_rnti].i != 0xffff ? NR_C_RNTI : NR_SI_RNTI,
e.e[d->nr_dl_rnti].i, e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
e.e[d->nr_dl_harq_pid].i, e.e[d->nr_dl_data].b,
e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
}

View File

@@ -49,8 +49,8 @@
* ```
*/
#include "common/utils/LOG/log.h"
#if TRACE_ASN1C_ENC_DEC
#include "common/utils/LOG/log.h"
#define ASN_DEBUG(x...) do{ LOG_I(ASN1,x);LOG_I(ASN1,"\n"); } while(false)
#else
#define ASN_DEBUG(x...)

View File

@@ -22,6 +22,7 @@
#include "byte_array.h"
#include "common/utils/assertions.h"
#include <assert.h>
#include <string.h>
byte_array_t copy_byte_array(byte_array_t src)
@@ -56,3 +57,19 @@ bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1)
return true;
}
byte_array_t cp_str_to_ba(const char* str)
{
assert(str != NULL);
const size_t sz = strlen(str);
byte_array_t dst = {.len = sz};
dst.buf = calloc(sz,sizeof(uint8_t));
assert(dst.buf != NULL && "Memory exhausted");
memcpy(dst.buf, str, sz);
return dst;
}

View File

@@ -19,8 +19,10 @@
* contact@openairinterface.org
*/
#ifndef BYTE_ARRAY_H_OAI
#define BYTE_ARRAY_H_OAI
#ifndef BYTE_ARRAY_H
#define BYTE_ARRAY_H
/* WARNING: This file is also defined at XXXXX. Both files need to be completely equal. Same applies for *.c */
#include <stdbool.h>
#include <stdint.h>
@@ -39,4 +41,6 @@ byte_array_t copy_byte_array(byte_array_t src);
void free_byte_array(byte_array_t ba);
bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1);
byte_array_t cp_str_to_ba(const char* str);
#endif

View File

@@ -36,215 +36,416 @@
#include "PHY/LTE_TRANSPORT/transport_common.h"
// This is table 5.7.1-4 from 36.211
PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
// TDD Configuration Index 0
{ {1,{{0,1,0,2}}},{1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {1,{{0,1,0,2}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {1,{{0,1,0,2}}}},
// TDD Configuration Index 1
{ {1,{{0,2,0,2}}},{1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {1,{{0,2,0,2}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {1,{{0,2,0,2}}}},
// TDD Configuration Index 2
{ {1,{{0,1,1,2}}},{1,{{0,1,1,1}}}, {1,{{0,1,1,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,1}}}},
// TDD Configuration Index 3
{ {1,{{0,0,0,2}}},{1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {1,{{0,0,0,2}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {1,{{0,0,0,2}}}},
// TDD Configuration Index 4
{ {1,{{0,0,1,2}}},{1,{{0,0,1,1}}}, {1,{{0,0,1,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,1}}}},
// TDD Configuration Index 5
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
// TDD Configuration Index 6
{ {2,{{0,0,0,2},{0,0,1,2}}}, {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {2,{{0,0,0,1},{0,0,0,2}}}, {2,{{0,0,0,0},{0,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {2,{{0,0,0,2},{0,0,1,1}}}},
// TDD Configuration Index 7
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,0,2}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
// TDD Configuration Index 8
{ {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,0,1}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{0,0,1,1}}}},
// TDD Configuration Index 9
{ {3,{{0,0,0,1},{0,0,0,2},{0,0,1,2}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,1,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,0,2}}}, {3,{{0,0,0,0},{0,0,0,1},{1,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {3,{{0,0,0,1},{0,0,0,2},{0,0,1,1}}}},
// TDD Configuration Index 10
{ {3,{{0,0,0,0},{0,0,1,0},{0,0,1,1}}}, {3,{{0,0,0,1},{0,0,1,0},{0,0,1,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,2},{0,0,1,0}}}},
// TDD Configuration Index 11
{ {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{0,0,0,1},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{0,0,1,1}}}},
// TDD Configuration Index 12
{ {4,{{0,0,0,1},{0,0,0,2},{0,0,1,1},{0,0,1,2}}}, {4,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}}},
{4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,2}}},
{4,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1}}},
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
{4,{{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
},
// TDD Configuration Index 13
{ {4,{{0,0,0,0},{0,0,0,2},{0,0,1,0},{0,0,1,2}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,1}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,1}}}
},
// TDD Configuration Index 14
{ {4,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
},
// TDD Configuration Index 15
{ {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,1},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,1}}},
{5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,1},{1,0,0,2}}},
{5,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,1}}}, {5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}},
{5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1}}}
},
// TDD Configuration Index 16
{ {5,{{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,1,1}}},
{5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,1,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,2}}},
{5,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}
},
// TDD Configuration Index 17
{ {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,2}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,1}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}
},
// TDD Configuration Index 18
{ {6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{0,0,1,2}}},
{6,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,1},{1,0,1,1}}},
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{1,0,0,0},{1,0,0,1},{1,0,0,2}}},
{6,{{0,0,0,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{2,0,0,0},{2,0,0,1}}},
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{1,0,0,2}}}
},
// TDD Configuration Index 19
{ {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{1,0,0,0},{1,0,1,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,0},{0,0,0,1},{0,0,0,2},{0,0,1,0},{0,0,1,1},{1,0,1,1}}}
},
// TDD Configuration Index 20
{ {1,{{0,1,0,1}}},{1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}},
// TDD Configuration Index 21
{ {1,{{0,2,0,1}}},{1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}},
const PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
// TDD Configuration Index 0
{{1, {{0, 1, 0, 2}}},
{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{1, {{0, 1, 0, 2}}},
{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{1, {{0, 1, 0, 2}}}},
// TDD Configuration Index 1
{{1, {{0, 2, 0, 2}}},
{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{1, {{0, 2, 0, 2}}},
{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{1, {{0, 2, 0, 2}}}},
// TDD Configuration Index 2
{{1, {{0, 1, 1, 2}}},
{1, {{0, 1, 1, 1}}},
{1, {{0, 1, 1, 0}}},
{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 1, 1}}}},
// TDD Configuration Index 3
{{1, {{0, 0, 0, 2}}},
{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 2}}},
{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 2}}}},
// TDD Configuration Index 4
{{1, {{0, 0, 1, 2}}},
{1, {{0, 0, 1, 1}}},
{1, {{0, 0, 1, 0}}},
{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 1, 1}}}},
// TDD Configuration Index 5
{{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 1}}}},
// TDD Configuration Index 6
{{2, {{0, 0, 0, 2}, {0, 0, 1, 2}}},
{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{2, {{0, 0, 0, 1}, {0, 0, 0, 2}}},
{2, {{0, 0, 0, 0}, {0, 0, 0, 1}}},
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
{2, {{0, 0, 0, 2}, {0, 0, 1, 1}}}},
// TDD Configuration Index 7
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 0}, {0, 0, 0, 2}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
// TDD Configuration Index 8
{{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 0}, {0, 0, 0, 1}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 0}, {0, 0, 1, 1}}}},
// TDD Configuration Index 9
{{3, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 2}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 1}}},
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 1}}},
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}}}},
// TDD Configuration Index 10
{{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}}}},
// TDD Configuration Index 11
{{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
// TDD Configuration Index 12
{{4, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 2}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}}},
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
{4, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
// TDD Configuration Index 13
{{4, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 2}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 1}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}}}},
// TDD Configuration Index 14
{{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
// TDD Configuration Index 15
{{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 1}, {1, 0, 0, 2}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}}}},
// TDD Configuration Index 16
{{5, {{0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 1, 1}}},
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 1, 0}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 2}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}}},
// TDD Configuration Index 17
{{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 2}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{5, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 1}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}}},
// TDD Configuration Index 18
{{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 2}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {1, 0, 0, 0}, {1, 0, 0, 1}, {1, 0, 0, 2}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {2, 0, 0, 0}, {2, 0, 0, 1}}},
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 2}}}},
// TDD Configuration Index 19
{{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 0, 2}, {0, 0, 1, 0}, {0, 0, 1, 1}, {1, 0, 1, 1}}}},
// TDD Configuration Index 20
{{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 1}}}},
// TDD Configuration Index 21
{{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 1}}}},
// TDD Configuration Index 22
{ {1,{{0,1,1,1}}},{1,{{0,1,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,0}}}},
// TDD Configuration Index 22
{{1, {{0, 1, 1, 1}}},
{1, {{0, 1, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 1, 0}}}},
// TDD Configuration Index 23
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
// TDD Configuration Index 23
{{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 1}}}},
// TDD Configuration Index 24
{ {1,{{0,0,1,1}}},{1,{{0,0,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,0}}}},
// TDD Configuration Index 24
{{1, {{0, 0, 1, 1}}},
{1, {{0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 1, 0}}}},
// TDD Configuration Index 25
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{1,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
// TDD Configuration Index 25
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 1}, {1, 0, 0, 1}}},
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
// TDD Configuration Index 26
{ {3,{{0,0,0,1},{0,0,1,1},{1,0,0,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{1,0,0,1},{2,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{1,0,0,1}}}},
// TDD Configuration Index 26
{{3, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}}}},
// TDD Configuration Index 27
{ {4,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1}}}, {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1}}},
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0}}}
},
// TDD Configuration Index 27
{{4, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}}},
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}}}},
// TDD Configuration Index 28
{ {5,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1}}}, {5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1}}},
{5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{5,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1}}}
},
// TDD Configuration Index 28
{{5, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{5, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{5, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}}}},
// TDD Configuration Index 29
{ {6,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1},{2,0,1,1}}},
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1},{5,0,0,1}}},
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1},{2,0,1,0}}}
},
// TDD Configuration Index 29
{{6, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}, {2, 0, 1, 1}}},
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}, {5, 0, 0, 1}}},
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}, {2, 0, 1, 0}}}},
// TDD Configuration Index 30
{{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 1}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 1}}}},
// TDD Configuration Index 30
{ {1,{{0,1,0,1}}},{1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,1}}}},
// TDD Configuration Index 31
{{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 1}}},
{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 1}}}},
// TDD Configuration Index 31
{ {1,{{0,2,0,1}}},{1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,1}}}},
// TDD Configuration Index 32
{{1, {{0, 1, 1, 1}}},
{1, {{0, 1, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 1, 0}}}},
// TDD Configuration Index 32
{ {1,{{0,1,1,1}}},{1,{{0,1,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,1,0}}}},
// TDD Configuration Index 33
{{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 1}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 1}}}},
// TDD Configuration Index 33
{ {1,{{0,0,0,1}}},{1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,1}}}},
// TDD Configuration Index 34
{{1, {{0, 0, 1, 1}}},
{1, {{0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 1, 0}}}},
// TDD Configuration Index 34
{ {1,{{0,0,1,1}}},{1,{{0,0,1,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,1,0}}}},
// TDD Configuration Index 35
{{2, {{0, 0, 0, 1}, {0, 0, 1, 1}}},
{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 1}, {1, 0, 0, 1}}},
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 1}, {0, 0, 1, 0}}}},
// TDD Configuration Index 35
{ {2,{{0,0,0,1},{0,0,1,1}}}, {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{1,0,0,1}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,1},{0,0,1,0}}}},
// TDD Configuration Index 36
{{3, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}}},
{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}}},
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}}}},
// TDD Configuration Index 36
{ {3,{{0,0,0,1},{0,0,1,1},{1,0,0,1}}}, {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{1,0,0,1},{2,0,0,1}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,1},{0,0,1,0},{1,0,0,1}}}},
// TDD Configuration Index 37
{{4, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}}},
{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}}},
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}}}},
// TDD Configuration Index 37
{ {4,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1}}}, {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1}}},
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0}}}
},
// TDD Configuration Index 38
{{5, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{5, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}}},
{5, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{5, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}}}},
// TDD Configuration Index 38
{ {5,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1}}}, {5,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {5,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1}}},
{5,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{5,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1}}}
},
// TDD Configuration Index 39
{{6, {{0, 0, 0, 1}, {0, 0, 1, 1}, {1, 0, 0, 1}, {1, 0, 1, 1}, {2, 0, 0, 1}, {2, 0, 1, 1}}},
{6, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}, {2, 0, 0, 0}, {2, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 1}, {1, 0, 0, 1}, {2, 0, 0, 1}, {3, 0, 0, 1}, {4, 0, 0, 1}, {5, 0, 0, 1}}},
{6, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}, {4, 0, 0, 0}, {5, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{6, {{0, 0, 0, 1}, {0, 0, 1, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {2, 0, 0, 1}, {2, 0, 1, 0}}}},
// TDD Configuration Index 39
{ {6,{{0,0,0,1},{0,0,1,1},{1,0,0,1},{1,0,1,1},{2,0,0,1},{2,0,1,1}}},
{6,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0},{2,0,0,0},{2,0,1,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,1},{1,0,0,1},{2,0,0,1},{3,0,0,1},{4,0,0,1},{5,0,0,1}}},
{6,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0},{4,0,0,0},{5,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{6,{{0,0,0,1},{0,0,1,0},{1,0,0,1},{1,0,1,0},{2,0,0,1},{2,0,1,0}}}
},
// TDD Configuration Index 40
{{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 1, 0, 0}}}},
// TDD Configuration Index 41
{{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 2, 0, 0}}}},
// TDD Configuration Index 40
{ {1,{{0,1,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,1,0,0}}}},
// TDD Configuration Index 41
{ {1,{{0,2,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,2,0,0}}}},
// TDD Configuration Index 42
{{1, {{0, 1, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}}},
// TDD Configuration Index 42
{ {1,{{0,1,1,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}},
// TDD Configuration Index 43
{{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{1, {{0, 0, 0, 0}}}},
// TDD Configuration Index 43
{ {1,{{0,0,0,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {1,{{0,0,0,0}}}},
// TDD Configuration Index 44
{{1, {{0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}}}},
// TDD Configuration Index 44
{ {1,{{0,0,1,0}}},{0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}, {0,{{0,0,0,0}}}},
// TDD Configuration Index 45
{{2, {{0, 0, 0, 0}, {0, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}}},
{2, {{0, 0, 0, 0}, {1, 0, 0, 0}}}},
// TDD Configuration Index 45
{ {2,{{0,0,0,0},{0,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0}}}, {2,{{0,0,0,0},{1,0,0,0}}}},
// TDD Configuration Index 46
{ {3,{{0,0,0,0},{0,0,1,0},{1,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0}}}, {3,{{0,0,0,0},{1,0,0,0},{2,0,0,0}}}},
// TDD Configuration Index 47
{ {4,{{0,0,0,0},{0,0,1,0},{1,0,0,0},{1,0,1,0}}}, {0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{0,{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}},
{4,{{0,0,0,0},{1,0,0,0},{2,0,0,0},{3,0,0,0}}}
}
};
// TDD Configuration Index 46
{{3, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{3, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}}}},
// TDD Configuration Index 47
{{4, {{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 0}, {1, 0, 1, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{0, {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}},
{4, {{0, 0, 0, 0}, {1, 0, 0, 0}, {2, 0, 0, 0}, {3, 0, 0, 0}}}}};
uint8_t get_prach_fmt(int prach_ConfigIndex,int frame_type) {
if (frame_type == FDD) // FDD

View File

@@ -33,15 +33,56 @@
#include <stdint.h>
#include "assertions.h"
#include "nr_common.h"
#include <complex.h>
const char *duplex_mode[]={"FDD","TDD"};
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
static const uint8_t bit_reverse_table_256[] = {
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8,
0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC,
0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 0x06, 0x86, 0x46, 0xC6,
0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1,
0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD,
0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB,
0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF};
// Reverse bits implementation based on http://graphics.stanford.edu/~seander/bithacks.html
uint64_t reverse_bits(uint64_t in, int n_bits)
{
// Reverse n_bits in uint64_t variable, example:
// n_bits: 10
// in: 10 0000 1111
// return: 11 1100 0001
AssertFatal(n_bits <= 64, "Maximum bits to reverse is 64, impossible to reverse %d bits!\n", n_bits);
uint64_t rev_bits = 0;
uint8_t *p = (uint8_t *)&in;
uint8_t *q = (uint8_t *)&rev_bits;
int n_bytes = n_bits >> 3;
for (int n = 0; n < n_bytes; n++) {
q[n_bytes - 1 - n] = bit_reverse_table_256[p[n]];
}
// Reverse remaining bits (not aligned with 8-bit)
rev_bits = rev_bits << (n_bits % 8);
for (int i = n_bytes * 8; i < n_bits; i++) {
rev_bits |= ((in >> i) & 0x1) << (n_bits - i - 1);
}
return rev_bits;
}
static const 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)
@@ -738,3 +779,89 @@ uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
AssertFatal(sco % scs_scaling == 0, "ssb offset %d can create frequency offset\n", sco);
return ssb_offset_point_a;
}
int get_delay_idx(int delay, int max_delay_comp)
{
int delay_idx = max_delay_comp + delay;
// If the measured delay is less than -MAX_DELAY_COMP, a -MAX_DELAY_COMP delay is compensated.
delay_idx = max(delay_idx, 0);
// If the measured delay is greater than +MAX_DELAY_COMP, a +MAX_DELAY_COMP delay is compensated.
delay_idx = min(delay_idx, max_delay_comp << 1);
return delay_idx;
}
void init_delay_table(uint16_t ofdm_symbol_size,
int max_delay_comp,
int max_ofdm_symbol_size,
c16_t delay_table[][max_ofdm_symbol_size])
{
for (int delay = -max_delay_comp; delay <= max_delay_comp; delay++) {
for (int k = 0; k < ofdm_symbol_size; k++) {
double complex delay_cexp = cexp(I * (2.0 * M_PI * k * delay / ofdm_symbol_size));
delay_table[max_delay_comp + delay][k].r = (int16_t)round(256 * creal(delay_cexp));
delay_table[max_delay_comp + delay][k].i = (int16_t)round(256 * cimag(delay_cexp));
}
}
}
void freq2time(uint16_t ofdm_symbol_size,
int16_t *freq_signal,
int16_t *time_signal)
{
switch (ofdm_symbol_size) {
case 128:
idft(IDFT_128, freq_signal, time_signal, 1);
break;
case 256:
idft(IDFT_256, freq_signal, time_signal, 1);
break;
case 512:
idft(IDFT_512, freq_signal, time_signal, 1);
break;
case 1024:
idft(IDFT_1024, freq_signal, time_signal, 1);
break;
case 1536:
idft(IDFT_1536, freq_signal, time_signal, 1);
break;
case 2048:
idft(IDFT_2048, freq_signal, time_signal, 1);
break;
case 4096:
idft(IDFT_4096, freq_signal, time_signal, 1);
break;
case 6144:
idft(IDFT_6144, freq_signal, time_signal, 1);
break;
case 8192:
idft(IDFT_8192, freq_signal, time_signal, 1);
break;
default:
AssertFatal (1 == 0, "Invalid ofdm_symbol_size %i\n", ofdm_symbol_size);
break;
}
}
void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay)
{
freq2time(ofdm_symbol_size, (int16_t *)ls_est, (int16_t *)ch_estimates_time);
int max_pos = delay->delay_max_pos;
int max_val = delay->delay_max_val;
const int sync_pos = 0;
for (int i = 0; i < ofdm_symbol_size; i++) {
int temp = c16amp2(ch_estimates_time[i]) >> 1;
if (temp > max_val) {
max_pos = i;
max_val = temp;
}
}
if (max_pos > ofdm_symbol_size / 2)
max_pos = max_pos - ofdm_symbol_size;
delay->delay_max_pos = max_pos;
delay->delay_max_val = max_val;
delay->est_delay = max_pos - sync_pos;
}

View File

@@ -42,6 +42,7 @@
#define NR_MAX_HARQ_PROCESSES 16
#define NR_NB_REG_PER_CCE 6
#define NR_NB_SC_PER_RB 12
#define NR_MAX_NUM_LCID 32
typedef enum {
nr_FR1 = 0,
@@ -72,6 +73,15 @@ typedef enum frequency_range_e {
FR2
} frequency_range_t;
typedef struct {
/// Time shift in number of samples estimated based on DMRS-PDSCH/PUSCH
int est_delay;
/// Max position in OFDM symbol related to time shift estimation based on DMRS-PDSCH/PUSCH
int delay_max_pos;
/// Max value related to time shift estimation based on DMRS-PDSCH/PUSCH
int delay_max_val;
} delay_t;
extern const nr_bandentry_t nr_bandtable[];
static inline int get_num_dmrs(uint16_t dmrs_mask ) {
@@ -80,6 +90,8 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) {
return(num_dmrs);
}
uint64_t reverse_bits(uint64_t in, int n_bits);
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols);
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);
@@ -114,6 +126,14 @@ uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB,
int ssbSubcarrierSpacing,
int frequency_range);
int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA);
int get_delay_idx(int delay, int max_delay_comp);
void freq2time(uint16_t ofdm_symbol_size,
int16_t *freq_signal,
int16_t *time_signal);
void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay);
#define CEILIDIV(a,b) ((a+b-1)/b)
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))

View File

@@ -49,6 +49,7 @@ extern "C" {
int nb_fd_epoll=0;
int epoll_fd=-1;
int sem_fd=-1;
size_t last_log_size = 0;
} task_list_t;
int timer_expired(int fd);
@@ -131,11 +132,23 @@ extern "C" {
int message_id = message->ittiMsgHeader.messageId;
size_t s=t->message_queue.size();
if ( s > t->admin.queue_size )
LOG_E(TMR,"Queue for %s task contains %ld messages\n", itti_get_task_name(destination_task_id), s );
if ( s > 50 )
LOG_I(ITTI,"Queue for %s task size: %ld (last message %s)\n",itti_get_task_name(destination_task_id), s+1,ITTI_MSG_NAME(message));
// to reduce the number of logs, we give a message each increase of 25%
if ((s > t->last_log_size * 1.25) && (s > t->admin.queue_size / 10)) {
if (s > t->admin.queue_size) {
LOG_E(TMR, "Queue for %s task contains %ld messages\n", itti_get_task_name(destination_task_id), s);
} else {
LOG_I(ITTI,
"Queue for %s task size: %ld (last message %s)\n",
itti_get_task_name(destination_task_id),
s + 1,
ITTI_MSG_NAME(message));
}
t->last_log_size = s;
} else if (t->last_log_size && s < t->admin.queue_size / 10) {
// Inform when the queue decreases
LOG_I(ITTI, "Queue for %s task size is back under 10%% of max size\n", itti_get_task_name(destination_task_id));
t->last_log_size = 0;
}
t->message_queue.insert(t->message_queue.begin(), message);
eventfd_t sem_counter = 1;

View File

@@ -59,8 +59,13 @@ add_library(telnetsrv_ci MODULE telnetsrv_ci.c)
target_link_libraries(telnetsrv_ci PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
add_dependencies(telnetsrv telnetsrv_ci)
message(STATUS "Add bearer specific telnet functions in libtelnetsrv_bearer.so")
add_library(telnetsrv_bearer MODULE telnetsrv_bearer.c)
target_link_libraries(telnetsrv_bearer PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
add_dependencies(telnetsrv telnetsrv_bearer)
# all libraries should be written to root build dir
set_target_properties(telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci
set_target_properties(telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci telnetsrv_bearer
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../..
)

View File

@@ -0,0 +1,121 @@
/*
* 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
*/
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
static int get_single_ue_rnti(void)
{
rrc_gNB_ue_context_t *ue_context_p = NULL;
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(RC.nrrrc[0]->rrc_ue_head)) {
return ue_context_p->ue_context.rnti;
}
return -1;
}
int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
{
if (buf)
ERROR_MSG_RET("no parameter allowed\n");
int rnti = get_single_ue_rnti();
if (rnti < 1)
ERROR_MSG_RET("different number of UEs\n");
prnt("single UE RNTI %04x\n", rnti);
return 0;
}
void rrc_gNB_trigger_new_bearer(int rnti);
int add_bearer(char *buf, int debug, telnet_printfunc_t prnt)
{
int rnti = -1;
if (!buf) {
rnti = get_single_ue_rnti();
if (rnti < 1)
ERROR_MSG_RET("no UE found\n");
} else {
rnti = strtol(buf, NULL, 16);
if (rnti < 1 || rnti >= 0xfffe)
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
}
// verify it exists in RRC as well
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
if (!rrcue)
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
rrc_gNB_trigger_new_bearer(rnti);
prnt("called rrc_gNB_trigger_new_bearer(%04x)\n", rnti);
return 0;
}
void rrc_gNB_trigger_release_bearer(int rnti);
int release_bearer(char *buf, int debug, telnet_printfunc_t prnt)
{
int rnti = -1;
if (!buf) {
rnti = get_single_ue_rnti();
if (rnti < 1)
ERROR_MSG_RET("no UE found\n");
} else {
rnti = strtol(buf, NULL, 16);
if (rnti < 1 || rnti >= 0xfffe)
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
}
// verify it exists in RRC as well
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
if (!rrcue)
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
rrc_gNB_trigger_release_bearer(rnti);
prnt("called rrc_gNB_trigger_release_bearer(%04x)\n", rnti);
return 0;
}
static telnetshell_cmddef_t bearercmds[] = {
{"get_single_rnti", "", get_single_rnti},
{"add_bearer", "[rnti(hex,opt)]", add_bearer},
{"release_bearer", "[rnti(hex,opt)]", release_bearer},
{"", "", NULL},
};
static telnetshell_vardef_t bearervars[] = {
{"", 0, 0, NULL}
};
void add_bearer_cmds(void) {
add_telnetcmd("bearer", bearervars, bearercmds);
}

View File

@@ -28,15 +28,17 @@
#include <stdarg.h>
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
static int get_single_ue_rnti(void)
static int get_single_ue_rnti_mac(void)
{
NR_UE_info_t *ue = NULL;
UE_iterator(RC.nrmac[0]->UE_info.list, it) {
@@ -48,11 +50,6 @@ static int get_single_ue_rnti(void)
if (!ue)
return -1;
// verify it exists in RRC as well
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], ue->rnti);
if (!rrcue)
return -1;
return ue->rnti;
}
@@ -61,7 +58,7 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
if (buf)
ERROR_MSG_RET("no parameter allowed\n");
int rnti = get_single_ue_rnti();
int rnti = get_single_ue_rnti_mac();
if (rnti < 1)
ERROR_MSG_RET("different number of UEs\n");
@@ -71,23 +68,32 @@ int get_single_rnti(char *buf, int debug, telnet_printfunc_t prnt)
int get_reestab_count(char *buf, int debug, telnet_printfunc_t prnt)
{
if (!RC.nrrrc)
ERROR_MSG_RET("no RRC present, cannot list counts\n");
rrc_gNB_ue_context_t *ue = NULL;
int rnti = -1;
if (!buf) {
rnti = get_single_ue_rnti();
if (rnti < 1)
ERROR_MSG_RET("no UE found\n");
rrc_gNB_ue_context_t *l = NULL;
int n = 0;
RB_FOREACH(l, rrc_nr_ue_tree_s, &RC.nrrrc[0]->rrc_ue_head) {
if (ue == NULL) ue = l;
n++;
}
if (!ue)
ERROR_MSG_RET("could not find any UE in RRC\n");
if (n > 1)
ERROR_MSG_RET("more than one UE in RRC present\n");
} else {
rnti = strtol(buf, NULL, 16);
if (rnti < 1 || rnti >= 0xfffe)
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
if (!ue)
ERROR_MSG_RET("could not find UE with RNTI %04x in RRC\n");
}
rrc_gNB_ue_context_t *ue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
if (!ue)
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
prnt("UE RNTI %04x reestab %d reconf_after_reestab %d\n",
rnti,
ue->ue_context.rnti,
ue->ue_context.ue_reestablishment_counter,
ue->ue_context.ue_reconfiguration_after_reestablishment_counter);
return 0;
@@ -95,9 +101,11 @@ int get_reestab_count(char *buf, int debug, telnet_printfunc_t prnt)
int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
{
if (!RC.nrmac)
ERROR_MSG_RET("no MAC/RLC present, cannot trigger reestablishment\n");
int rnti = -1;
if (!buf) {
rnti = get_single_ue_rnti();
rnti = get_single_ue_rnti_mac();
if (rnti < 1)
ERROR_MSG_RET("no UE found\n");
} else {
@@ -106,13 +114,9 @@ int trigger_reestab(char *buf, int debug, telnet_printfunc_t prnt)
ERROR_MSG_RET("RNTI needs to be [1,0xfffe]\n");
}
// verify it exists in RRC as well
rrc_gNB_ue_context_t *rrcue = rrc_gNB_get_ue_context_by_rnti(RC.nrrrc[0], rnti);
if (!rrcue)
ERROR_MSG_RET("could not find UE with RNTI %04x\n", rnti);
nr_rlc_test_trigger_reestablishment(rnti);
nr_rlc_remove_ue(rnti);
prnt("force-remove UE RNTI %04x from RLC to trigger reestablishment\n", rnti);
prnt("Reset RLC counters of UE RNTI %04x to trigger reestablishment\n", rnti);
return 0;
}

View File

@@ -110,8 +110,6 @@
{"ulsch_ldpc_encoding_stats", &(UE->ulsch_ldpc_encoding_stats),0,1},\
{"ulsch_interleaving_stats", &(UE->ulsch_interleaving_stats),0,1},\
{"ulsch_multiplexing_stats", &(UE->ulsch_multiplexing_stats),0,1},\
{"generic_stat", &(UE->generic_stat),0,1},\
{"generic_stat_bis", &(UE->generic_stat_bis[0]),0,LTE_SLOTS_PER_SUBFRAME},\
{"ofdm_demod_stats", &(UE->ofdm_demod_stats),0,1},\
{"dlsch_rx_pdcch_stats", &(UE->dlsch_rx_pdcch_stats),0,1},\
{"rx_dft_stats", &(UE->rx_dft_stats),0,1},\

View File

@@ -26,6 +26,8 @@
#define THREAD_POOL_H
#include <stdbool.h>
#include <stdint.h>
#include <malloc.h>
#include <stdalign.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
@@ -64,7 +66,10 @@ typedef struct notifiedFIFO_elt_s {
oai_cputime_t startProcessingTime;
oai_cputime_t endProcessingTime;
oai_cputime_t returnTime;
void *msgData;
// use alignas(32) to align msgData to 32b
// user data behind it will be aligned to 32b as well
// important! this needs to be the last member in the struct
alignas(32) void *msgData;
} notifiedFIFO_elt_t;
typedef struct notifiedFIFO_s {
@@ -80,14 +85,15 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
uint64_t key,
notifiedFIFO_t *reponseFifo,
void (*processingFunc)(void *)) {
notifiedFIFO_elt_t *ret;
AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), "");
notifiedFIFO_elt_t *ret = (notifiedFIFO_elt_t *)memalign(32, sizeof(notifiedFIFO_elt_t) + size);
AssertFatal(NULL != ret, "out of memory\n");
ret->next=NULL;
ret->key=key;
ret->reponseFifo=reponseFifo;
ret->processingFunc=processingFunc;
// We set user data piece aligend 32 bytes to be able to process it with SIMD
ret->msgData=(void *)((uint8_t*)ret+(sizeof(notifiedFIFO_elt_t)/32+1)*32);
// msgData is aligned to 32bytes, so everything after will be as well
ret->msgData = ((uint8_t *)ret) + sizeof(notifiedFIFO_elt_t);
ret->malloced=true;
return ret;
}

View File

@@ -38,7 +38,7 @@ static time_stats_t **measur_table;
notifiedFIFO_t measur_fifo;
double get_cpu_freq_GHz(void)
{
if (cpu_freq_GHz <1 ) {
if (cpu_freq_GHz <0.01 ) {
time_stats_t ts = {0};
reset_meas(&ts);
ts.trials++;
@@ -46,8 +46,7 @@ double get_cpu_freq_GHz(void)
sleep(1);
ts.diff = (rdtsc_oai()-ts.in);
cpu_freq_GHz = (double)ts.diff/1000000000;
printf("CPU Freq is %f \n", cpu_freq_GHz);
}
}
return cpu_freq_GHz;
}

View File

@@ -106,8 +106,16 @@ static inline unsigned long long rdtsc_oai(void) {
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
return (d<<32) | a;
}
#elif defined(__aarch64__)
static inline uint64_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint64_t rdtsc_oai(void)
{
uint64_t r = 0;
asm volatile("mrs %0, cntvct_el0" : "=r"(r));
return r;
}
#elif defined(__arm__) || defined(__aarch64__)
#elif defined(__arm__)
static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint32_t rdtsc_oai(void) {
uint32_t r = 0;

View File

@@ -118,12 +118,6 @@ char *itoa(int i) {
return strdup(buffer);
}
void *memcpy1(void *dst,const void *src,size_t n) {
void *ret=dst;
asm volatile("rep movsb" : "+D" (dst) : "c"(n), "S"(src) : "cc","memory");
return(ret);
}
void set_priority(int priority)
{

View File

@@ -102,8 +102,6 @@ int hex_char_to_hex_value (char c);
// Converts an hexadecimal ASCII coded string into its value.**
int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
void *memcpy1(void *dst,const void *src,size_t n);
void set_priority(int priority);
char *itoa(int i);

View File

@@ -1,7 +1,7 @@
The oai web server is an optional monitoring and debugging tool. Purpose is to give access to oai softmodems functionalities via a web interface. In this first release interface to the telnet server commands and to the softscope are delivered.
The oai web server is an optional monitoring and debugging tool. Purpose is to give access to oai softmodems functionalities via a web interface. In this release interface to the telnet server commands and to the softscope are delivered.
* [Using the web server](webserverusage.md)
* [enhancing the webserver](webserverdevcmd.md)
* [web server architecture ](webserverarch.md)
* [Using the web server](websrvuse.md)
* [enhancing the webserver](websrvdev.md)
* [web server architecture ](websrvarch.md)
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)

View File

@@ -1,21 +1,24 @@
# web server interface principles
The web server interface is implemented in two parts: a back-end, included in the softmodem process and a front-end which is a browser application.
The web server interface is implemented in two parts: a back-end, included in the softmodem process and a front-end which is a browser application.
The oai web server back-end is implemented in a shared library to be loaded by the [oai shared library loader](loader) when `--websrv` option is specified on the command line. `libwebsrv.so ` code is common to all oai softmodem executables, the current release has been tested with the nr UE and the gNB.
The oai web server back-end is implemented in a shared library to be loaded by the [oai shared library loader](../../DOC/loader.md) when `--websrv` option is specified on the command line. `libwebsrv.so` code is common to all oai softmodem executables,
the current release has been tested with the nr UE and the gNB.
The front-end is an [angular](https://angular.io/docs) application. After being built and installed it is delivered to browsers by the back-end at connection time.
Front-end and back-end communicate via http request - http response transactions, including `json` body. these `json` interfaces are defined in the [frontend/src/app/api/XXXX.api.ts](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/src/frontend/src/app/api/) files. Back-end decapsulates the http requests it receives, looking for the `json`body to determine the requested information or command. Then the back-end builds a http response, with a `json`body encapsulating the requested information or the requested command result.
Front-end and back-end communicate via http request - http response transactions, including `json` body. these `json` interfaces are defined in the [frontend/src/app/api/XXXX.api.ts](../frontend/src/app/api/) files.
Back-end uses a callback machanism to map received http requests to dedicated functions. Typically a callback function decapsulates the http requests it receives, looking for the `json`body to determine the requested information or command. Then the back-end builds a
http response, with a `json`body encapsulating the requested information or the requested command result.
When unsolicited communication, from back-end to front-end is necessary, a [websocket](https://www.rfc-editor.org/rfc/rfc6455) link is opened. This is the case for the softscope interface.
# web server interface source files
web server source files are located in [common/utils/websrv](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv)
web server source files are located in [common/utils/websrv](..)
1. back-end files are directly located in the `websrv` repository
1. The [frontend/src](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/src/frontend) sub-directory contains the angular front-end source tree.
1. [common/utils/websrv/helpfiles](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/websrv/helpfiles) contains files delivered to the front-end to respond to help requests.
1. The [frontend/src](../frontend/src) sub-directory contains the angular front-end source tree.
1. [common/utils/websrv/helpfiles](../helpfiles) contains files delivered to the front-end to respond to help requests.
[oai web server interface home](websrv.md)
[oai web server interface home](websrv.md)

View File

@@ -0,0 +1,52 @@
# enhancing the web server
###### development platform
Backend devlopment is classical C programming, using [libulfius](https://github.com/babelouest/ulfius/blob/master/API.md) for the web server implementation
and [libjansson](https://jansson.readthedocs.io/en/latest/) for formatting and accessing the JSON http bodies which are used by the angular frontend to exchange data with the server.
The backend processes the http requests coming from the frontend using the ulfius callback mechanism. backend can also send unsollicited data to the frontend using a websocket
Frontend has been developped using the [angular framework](https://angular.io/) which implies TypeScript and HTML programming with the specificity of the node.js libraries and
angular extensions.
Debugging the frontend side may be more difficult than the backend, some tools may help:
- Some IDE such as [vscode]( https://code.visualstudio.com/) are "angular aware" and can ease debugging your modifications .
- Setting UTIL log level to informational in the backend and websrv debug flag to 2 ( `--log_config.util_log_level info --websrv.debug 2` ) will trigger backend traces which may help, including the dump of JSON type http content
- Browser devloper tools such as console may also help
There is a dedicated CMakeLists.txt, located in the websrv directory, to build both backend and frontend. Including the websrv option when configuring cmake ( `./build_oai --build-lib websrv` ) is required to be able to include the web server targets in the oai build scripts (either Makefile or ninja).
`libwebsrv.so` shared library is the backend binary. It is possibly dynamically loaded at runtime, which then triggers the execution of the
`websrv_autoinit` function that initializes the http server. Re-building the backend can be done using either `make websrv` or `ninja websrv` and it also re-builds the frontend .
The frontend run-time is made of a set of files generated from the TypeScript, HTML, CSS sources via the npm utility. It also includes some directly edited files such as the helpfiles. Frontend run-time is installed in the `websrv` sub-directory of the build path
(usually `<oai repository>/cmake_targets/ran_build/build`) Re-building frontend can be done via the websrvfront target: `make websrvfront` or `ninja websrvfront`.
###### backend source files
They are all located in the websrv repository
| source file |description |
|---|---|
| websrv.c | main backend file, starts the http server and contains functions for telnet server interface ( softmodem commands tab) |
| websrv.h | the only web server include file, contains utils prototypes, constants definitions, message definitions. Note that it must be kept consistent with frontend, unfortunatly we have not found a way to have common include files between C and javascript |
| websrv_utils.c | utility functions common to all backend sources: dump http request and JSON content. format string response from a file, a C string, a buffer asynchronously loaded. format help from help file |
| websrv_websockets.c | contains functions for the softscope interface (scope tab): initialize, close websocket, dispatch incoming messages, send a websocket message to frontend |
| websrv_scope.c | softscope specific functions: callbacks to process softope frontend request and function to send, receive and process softscope websocket messages |
| websrv_noforms.c websrv_noforms.h | stub functions to help using a common softscope interface for xforms softscope and the webserver softscope, could be removed when improving softscope architecture (don't use interface specific function in nr_physcope.c) |
###### main frontend source files
Frontend directory tree comes from the angular framework. The root of this tree is `websrv/frontend/`. Main sub directories or files are:
- `src/app/api` contains TypeScript files with functions to send http requests to the backend. These functions are used from components sources.
- `src/app/components/<component name>` contains the code (TypeScript, HTML and possibly CSS or XCSS) for a web page, for example the softscope, or popup page used to ask a question or return transaction status.
- `src/app/components/controls` contains TypeScript code used for managing some form fields used in the `softmodem commands` tab.
- `src/app/components/services` contain TypeScript code for utilities such as managing the websocket interface with the backend or downloading a file.
- `src/app/app-routing-module.ts` defines mapping between urls as entered by user and components
- `src/app/app.component.ts` `src/app/app.component.html` define the first page displayed to user
- `src/environments` contains environment.<build type>.ts file wich defines the `environment` variable depending on the build type. The delivered build scripts are using the `prod` version which has been written to make frontend and backend to interact properly in a production platform. Other build type is to be used in debug environment where frontend is not downloaded from the backend.
- `src/commondefs.ts`: constant definitions common to several TypeScript sources
[oai web serverinterface home](websrv.md)

View File

@@ -1,104 +1,151 @@
back-end and front-end are both built when the build of the `websrv` optional library is requested. When cmake configuration has been completed, with websrv enabled,font-end and back-end can be built separatly, using respectively `make frontend` or `make websrv` from the build repository.
[[_TOC_]]
When all dependencies are met, you can build the web server interface components using the build_oai script with the `--build-lib all` option . As the web interface is an optional component, if it's dependencies are not found it won't stop the build. Web interface components (back-end or front-end) which cannot be built are just skipped. If you specifically ask for the webserver build ( `--build-lib websrv`) the build will fail if dependencies check failed.
###### build example when missing dependencies
```
./build_oai --build-lib all
Enabling build of all optional shared libraries (telnetsrv enbscope uescope nrscope websrv websrvfront)
RF HW set to None
OPENAIR_DIR = /usr/local/oai/websrv3/openairinterface5g
FreeDiameter prefix not found, install freeDiameter if EPC, HSS
running cmake -DENABLE_WEBSRV=ON -DENABLE_TELNETSRV=ON ../../..
NETTLE VERSION_INSTALLED = 3.5.1
NETTLE_VERSION_MAJOR = 3
NETTLE_VERSION_MINOR = 5
cuda include /usr/include
cuda library
-- CMAKE_BUILD_TYPE is RelWithDebInfo
-- CPUARCH x86_64
-- AVX512 intrinsics are OFF
-- AVX2 intrinsics are ON
-- No T1 Offload support detected
gcc -Wall -I. -I.. -I../itti -I../../../openair2/COMMON -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
rm -f ./_check_vcd
-- Add enb specific telnet functions in libtelnetsrv_enb.so
-- No specific telnet functions for gnb
-- No specific telnet functions for 4Gue
-- Add 5Gue specific telnet functions in libtelnetsrv_5Gue.so
CMake Error at common/utils/websrv/CMakeLists.txt:3 (message):
ulfius library (https://github.com/babelouest/ulfius) not found, install
libulfius-dev (ubuntu) if you need to build websrv back-end
# Building the webserver
-- Configuring incomplete, errors occurred!
See also "/usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
See also "/usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeError.log".
build have failed
back-end (the http server) and front-end (the html and javascript code for the browsers) are both built when the build of the `websrv` optional library is requested.
You can include the web server interface components in your build using the `build_oai` script with the `--build-lib "telnetsrv websrv"` option.
The related cmake cache entry in `ran_build/build/CMakeCache.txt` for building the web server
is `ENABLE_WEBSRV:BOOL=ON`
When cmake configuration has been completed, with websrv enabled and all dependencies met, font-end and back-end
can be built separately, using respectively `make websrvfront` or `make websrv` from the build repository (replace make by ninja if you
build using ninja).
## Additional dependencies for the backend
To build the webserver frontend, you need additionally
1. the [ulfius library](https://github.com/babelouest/ulfius)
2. the [jansson library](https://github.com/akheron/jansson-debian)
These libraries are not handled by `build_oai -I`
### Ubuntu
```bash
$ sudo apt-get update
$ sudo apt-get install -y libulfius-dev libjansson-dev npm curl wget
```
###### build example (build-lib all) when dependencies are met
```
./build_oai --build-lib all
Enabling build of all optional shared libraries (telnetsrv enbscope uescope nrscope websrv websrvfront)
RF HW set to None
OPENAIR_DIR = /usr/local/oai/websrv3/openairinterface5g
FreeDiameter prefix not found, install freeDiameter if EPC, HSS
running cmake -DENABLE_WEBSRV=ON -DENABLE_TELNETSRV=ON ../../..
NETTLE VERSION_INSTALLED = 3.5.1
NETTLE_VERSION_MAJOR = 3
NETTLE_VERSION_MINOR = 5
cuda include /usr/include
cuda library
-- CMAKE_BUILD_TYPE is RelWithDebInfo
-- CPUARCH x86_64
-- AVX512 intrinsics are OFF
-- AVX2 intrinsics are ON
-- No T1 Offload support detected
gcc -Wall -I. -I.. -I../itti -I../../../openair2/COMMON -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
rm -f ./_check_vcd
-- Add enb specific telnet functions in libtelnetsrv_enb.so
-- No specific telnet functions for gnb
-- No specific telnet functions for 4Gue
-- Add 5Gue specific telnet functions in libtelnetsrv_5Gue.so
-- found libulfius for websrv
-- found libjansson for websrv
-- found npm for websrv
-- Configuring webserver backend
-- Configuring webserver frontend
-- No Doxygen documentation requested
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/ran_build/build
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/telnetsrv.txt
telnetsrv compiled
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/enbscope.txt
enbscope compiled
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/uescope.txt
uescope compiled
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/nrscope.txt
nrscope compiled
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/websrv.txt
websrv compiled
Log file for compilation is being written to: /usr/local/oai/websrv3/openairinterface5g/cmake_targets/log/websrvfront.txt
websrvfront compiled
BUILD SHOULD BE SUCCESSFUL
### Fedora(-based OS)
```bash
$ sudo dnf update -y
$ sudo dnf install -y jansson-devel npm curl wget
```
# building and installing the front-end after cmake has been configured
ulfius has to be installed as explained [here](https://github.com/babelouest/ulfius/blob/master/INSTALL.md#pre-compiled-packages).
Before building the front-end you need to install the npm node.js installer, otherwise the make target won't exist:
## Additional dependencies for the frontend
`apt-get install npm` for ubuntu or `dnf install npm`for fedora
Currently the web server frontend can run with nodejs 18, you can check the
version (if any) installed on your system entering the `node -v` command.
then configure cmake to be able to build and install the frontend without using the build_oai script:
To prevent difficult situations with nodejs or npm versions it is better to
specifically install the required nodejs version (after removing existing
versions of npm and nodejs), as explained
[here](https://www.stewright.me/2023/04/install-nodejs-18-on-ubuntu-22-04/) for
ubuntu. Similar instructions can be found for other distributions. It is also
possible to make several nodejs versions co-habiting on your system, this is
beyond this doc.
``` bash
cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
make websrvfront
For example, to install a specific nodeJS version, you can run the below
command, with the typical output printed below for your convenience:
```bash
$ curl -s https://deb.nodesource.com/setup_18.x | sudo bash
## Populating apt-get cache...
apt-get update
## Confirming "jammy" is supported...
+ curl -sLf -o /dev/null 'https://deb.nodesource.com/node_18.x/dists/jammy/Release'
## Adding the NodeSource signing key to your keyring...
+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | tee /usr/share/keyrings/nodesource.gpg >/dev/null
## Creating apt sources list file for the NodeSource Node.js 18.x repo...
+ echo 'deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x jammy main' > /etc/apt/sources.list.d/nodesource.list
+ echo 'deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x jammy main' >> /etc/apt/sources.list.d/nodesource.list
## Running `apt-get update` for you...
+ apt-get update
## Run `sudo apt-get install -y nodejs` to install Node.js 18.x and npm
## You may also need development tools to build native addons:
sudo apt-get install gcc g++ make
## To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
sudo apt install nodejs -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
diodon libdiodon0 libxdo3 xdotool
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
nodejs
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
Need to get 28.9 MB of archives.
After this operation, 188 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_18.x jammy/main amd64 nodejs amd64 18.17.1-deb-1nodesource1 [28.9 MB]
Fetched 28.9 MB in 3s (11.3 MB/s)
Selecting previously unselected package nodejs.
(Reading database ... 399541 files and directories currently installed.)
Preparing to unpack .../nodejs_18.17.1-deb-1nodesource1_amd64.deb ...
Unpacking nodejs (18.17.1-deb-1nodesource1) ...
Setting up nodejs (18.17.1-deb-1nodesource1) ...
Processing triggers for man-db (2.10.2-1) ...
```
If you want to put a more recent version, refer to the steps below, which is
common for any OS:
```bash
$ sudo npm -g install @angular/cli@latest npm@latest
$ sudo npm install n -g
# Install the LTS version
$ n lts
# Or install the latest version
$ n latest
$ node --version
```
## Building the webserver
### Backend
The websrv targets won't be available till cmake has been successfully configured with the websrv option enabled
```bash
$ cd <oai repository>/openairinterface5g/cmake_targets
$ ./build_oai --build-lib websrv
```
or, without the help of the `build_oai` script:
```bash
$ cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
$ make websrv
```
This will create the `libwebsrv.so` file in the `cmake_targets/ran_build/build` directory.
### Frontend
The frontend targets needs to be triggered explicitly:
```bash
$ cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
$ make websrvfront
up to date, audited 1099 packages in 3s
142 packages are looking for funding
@@ -135,38 +182,62 @@ Built target websrvfront
```
## Examples
# Building and installing the web server back-end after cmake has been configured
**build example when back-end dependency is not installed**
```bash
$ ./build_oai --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
[...]
CMake Error at common/utils/websrv/CMakeLists.txt:31 (find_library):
Could not find ULFIUS using the following names: libulfius.so
-- Configuring incomplete, errors occurred!
See also "/usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
build have failed
```
The back-end has two dependencies:
**build example when front-end dependency is not installed**
```bash
$ ./build_oai --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
[...]
-- found libulfius for websrv
-- found libjansson for websrv
CMake Error at common/utils/websrv/CMakeLists.txt:45 (find_program):
Could not find NPM using the following names: npm
1. the [ulfius library](https://github.com/babelouest/ulfius) and the corresponding include files which are provided by the ubuntu libulfius-dev package: `sudo apt-get install -y libulfius-dev`
2. the [jansson](https://github.com/akheron/jansson-debian) library and the corresponding include files which are provided by the ubuntu libjansson-dev package: `sudo apt-get install -y libjansson-dev`
Dependencies can also be installed on fedora distribution, the jansson package is `jansson-devel`, ulfius has to be installed as explained [here](https://github.com/babelouest/ulfius/blob/master/INSTALL.md#pre-compiled-packages).
-- Configuring incomplete, errors occurred!
See also "/usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build/CMakeFiles/CMakeOutput.log".
build have failed
```
The websrv targets won't be available till cmake has been successfully configured with the websrv option enabled
**build example when dependencies are met**
```bash
cd \<oai repository\>/openairinterface5g
source oaienv
cd cmake_targets
./build_oai --build-lib websrv
$ ./build_oai --ninja -c -C --gNB --nrUE -w USRP --build-lib "telnetsrv websrv nrscope"
[...]
-- found libulfius for websrv
-- found libjansson for websrv
-- found npm for websrv
-- Configuring webserver backend
-- Configuring webserver frontend
[...]
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build
cd /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/ran_build/build
Running "cmake --build . --target nr-softmodem nr-cuup nr-uesoftmodem oai_usrpdevif telnetsrv websrv nrscope params_libconfig coding rfsimulator dfts -- -j8"
Log file for compilation is being written to: /usr/local/oai/develop_unmodified/openairinterface5g/cmake_targets/log/all.txt
nr-softmodem nr-cuup nr-uesoftmodem oai_usrpdevif telnetsrv websrv nrscope params_libconfig coding rfsimulator dfts compiled
BUILD SHOULD BE SUCCESSFUL
```
or, without the help of the `build_oai` script:
```bash
cd \<oai repository\>/openairinterface5g/cmake_targets/ran_build/build
make websrv
```
This will create the `libwebsrv.so` file in the `targets/bin` and `cmake_targets/ran_build/build` sub directories of the oai repository.
When starting the softmodem, you must specify the **_\-\-websrv_** option to load and start the web server. The web server is loaded via the [oai shared library loader](loader).
# Testing the web server interface
# Running the web server interface
When starting the softmodem, you must specify the `--websrv` option to load and start the web server. The web server is loaded via the [oai shared library loader](loader).
## web server parameters
The web server back-end is using the [oai configuration module](Config/Rtusage). web server parameters must be specified in the websrv section.
The web server back-end is using the [oai configuration module](Config/Rtusage). web server parameters must be specified in the websrv section.
| name | type | default | description |
|:---:|:---:|:---:|:----|
@@ -178,9 +249,9 @@ The web server back-end is using the [oai configuration module](Config/Rtusage).
| | | | |
## running the back-end
To trigger the back-end use the `--websrv` option, possibly modifying the parameters as explained in the previous chapter. The two following commands allow starting the oai gNB and the oai 5G UE on the same computer, starting the telnet server and the web interface on both executables.
To trigger the back-end use the `--websrv` option, possibly modifying the parameters as explained in the [previous section](./websrvuse.md#web-server-parameters). The two following commands allow starting the oai gNB and the oai 5G UE on the same computer, starting the telnet server and the web interface on both executables.
`./nr-softmodem -O /usr/local/oai/conf/gnb.band78.sa.fr1.106PRB.usrpb210.conf --rfsim --rfsimulator.serveraddr server --telnetsrv --telnetsrv.listenstdin --websrv --rfsimulator.options chanmod`
`./nr-softmodem -O /usr/local/oai/conf/gnb.band78.sa.fr1.106PRB.usrpb210.conf --rfsim --rfsimulator.serveraddr server --telnetsrv --telnetsrv.listenstdin --websrv --rfsimulator.options chanmod`
.`/nr-uesoftmodem -O /usr/local/oai/conf/nrue_sim.conf --sa --numerology 1 -r 106 -C 3649440000 --rfsim --rfsimulator.serveraddr 127.0.0.1 --websrv --telnetsrv --websrv.listenport 8092 --telnetsrv.listenport 8091`
@@ -191,18 +262,21 @@ To trigger the back-end use the `--websrv` option, possibly modifying the parame
Assuming that the previous commands run successfully and that you also run your browser on the same host, you should be able to connect to the gNB and UE web interface using respectively the following url's:
http://127.0.0.1:8090/websrv/index.html
http://127.0.0.1:8092/websrv/index.html
The interface should be intuitive enough, keeping in mind the following restrictions:
- The command tab is not available if the telnet server is not enabled
- The softscope tab is not available if the xforms scope is started `(-d` option)
- The softscope tab is not available if the xforms scope is started (`-d` option)
- Only one connection is supported to a back-end, especially for the scope interface
Some front-end objects, which usage are less intuitive provide a tooltip to help interface usage.
## some webserver screenshots
![main page](/usr/local/oai/websrv3/openairinterface5g/common/utils/websrv/DOC/main.png "main page")
![Configuring logs](/usr/local/oai/websrv3/openairinterface5g/common/utils/websrv/DOC/logscfg.png "Configuring logs")
![scope interface](/usr/local/oai/websrv3/openairinterface5g/common/utils/websrv/DOC/scope.png "scope interface")
- [main page](main.png)
- [Configuring logs](logscfg.png)
- [scope interface](scope.png)
[oai web serverinterface home](websrv.md)

View File

@@ -165,18 +165,18 @@ After completing the build, the binaries are available in the `cmake_targets/ran
## Building Optional Binaries
There are a number of optional libraries that can be built in support of the
RAN, such as telnet, scopes, offloading libraries, etc.
RAN, such as telnetsrv, scopes, offloading libraries, etc.
Using the help option of the build script you can get the list of available optional libraries.
```bash
./build_oai --build-lib all # build all
./build_oai --build-lib telnet # build only telnet
./build_oai --build-lib "telnet enbscope uescope nrscope nrqtscope"
./build_oai --build-lib telnet --build-lib nrqtscope
./build_oai --build-lib telnetsrv # build only telnetsrv
./build_oai --build-lib "telnetsrv enbscope uescope nrscope nrqtscope"
./build_oai --build-lib telnetsrv --build-lib nrqtscope
```
The following libraries are build in CI and should always work: `telnet`,
The following libraries are build in CI and should always work: `telnetsrv`,
`enbscope`, `uescope`, `nrscope`, `nrqtscope`.
Some libraries have further dependencies and might not build on every system:
@@ -195,7 +195,7 @@ mkdir build && cd build
cmake .. -GNinja && ninja nr-softmodem nr-uesoftmodem nr-cuup params_libconfig coding rfsimulator ldpc
```
To build additional libraries, e.g., telnet, do the following:
To build additional libraries, e.g., telnetsrv, do the following:
```bash
cmake .. -GNinja -DENABLE_TELNETSRV=ON && ninja telnetsrv
```
@@ -215,3 +215,8 @@ ccmake ../../..
cmake-gui ../../..
```
You can of course use all standard cmake/ninja/make commands in this directory.
# Cross Compile
If you want to use cross-compiler on x86 platform for aarch64 version, please refer the [cross-compile.md](./cross-compile.md) for more information.

View File

@@ -21,7 +21,7 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
Minimum hardware requirements:
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
- CPU: 8 cores x86_64 @ 3.5 GHz
- RAM: 32 GB
- Laptop for UE
@@ -45,7 +45,7 @@ Please install and configure OAI CN5G as described here:
## 2.2 SIM Card
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v3.2](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v3.2.tgz).
```bash
sudo ./program_uicc --adm 12345678 --imsi 001010000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
@@ -62,7 +62,7 @@ sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils p
git clone https://github.com/EttusResearch/uhd.git ~/uhd
cd ~/uhd
git checkout v4.4.0.0
git checkout v4.5.0.0
cd host
mkdir build
cd build
@@ -90,7 +90,7 @@ cd ~/openairinterface5g/cmake_targets
cd ~/openairinterface5g
source oaienv
cd cmake_targets
./build_oai -w USRP --ninja --gNB -c
./build_oai -w USRP --ninja --gNB -C
```
# 4. Run OAI CN5G and OAI gNB

View File

@@ -21,7 +21,7 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
Minimum hardware requirements:
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
- CPU: 8 cores x86_64 @ 3.5 GHz
- RAM: 32 GB
@@ -66,8 +66,8 @@ docker pull oaisoftwarealliance/oai-udr:develop
docker pull oaisoftwarealliance/oai-udm:develop
docker pull oaisoftwarealliance/oai-ausf:develop
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
docker build --target ims --tag asterisk-ims:latest --file ~/oai-cn5g/Dockerfile .
docker pull oaisoftwarealliance/trf-gen-cn5g:jammy
docker pull oaisoftwarealliance/ims:latest
```
# 3. Run OAI CN5G

View File

@@ -21,11 +21,11 @@ In this tutorial we describe how to configure and run a 5G end-to-end setup with
Minimum hardware requirements:
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
- CPU: 8 cores x86_64 @ 3.5 GHz
- RAM: 32 GB
- Laptop for UE
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.2-desktop-amd64.iso)
- Operating System: [Ubuntu 22.04 LTS](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso)
- CPU: 8 cores x86_64 @ 3.5 GHz
- RAM: 8 GB
- [USRP B210](https://www.ettus.com/all-products/ub210-kit/), [USRP N300](https://www.ettus.com/all-products/USRP-N300/) or [USRP X300](https://www.ettus.com/all-products/x300-kit/)
@@ -50,7 +50,7 @@ sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils p
git clone https://github.com/EttusResearch/uhd.git ~/uhd
cd ~/uhd
git checkout v4.4.0.0
git checkout v4.5.0.0
cd host
mkdir build
cd build
@@ -81,7 +81,7 @@ sudo apt install -y libforms-dev libforms-bin
cd ~/openairinterface5g
source oaienv
cd cmake_targets
./build_oai -w USRP --ninja --nrUE --gNB --build-lib "nrscope" -c
./build_oai -w USRP --ninja --nrUE --gNB --build-lib "nrscope" -C
```
# 4. Run OAI CN5G and OAI gNB

View File

@@ -19,6 +19,7 @@
- [FEATURE_SET.md](./FEATURE_SET.md): lists supported features
- [GET_SOURCES.md](./GET_SOURCES.md): how to download the sources
- [BUILD.md](./BUILD.md): how to build the sources
- [cross-compile.md](./cross-compile.md): how to cross-compile OAI for ARM
- [clang-format.md](./clang-format.md): how to format the code
- [environment-variables.md](./environment-variables.md): the environment variables used by OAI
@@ -81,6 +82,7 @@ Legacy unmaintained files:
- The [logging module](../common/utils/LOG/DOC/log.md)
- The [shared object loader](../common/utils/DOC/loader.md)
- The [threadpool](../common/utils/threadPool/thread-pool.md) used in L1
- The [LDPC implementation](../openair1/PHY/CODING/DOC/LDPCImplementation.md) is a shared library
## SDRs

View File

@@ -127,27 +127,30 @@ Some other useful paramters of the UE are
## phy-test setup with OAI UE
The OAI UE can also be used in front of a OAI gNB without the support of eNB or EPC. In this case both gNB and eNB need to be run with the --phy-test flag. At the gNB this flag does the following
The OAI UE can also be used in front of a OAI gNB without the support of eNB or EPC and circumventing random access. In this case both gNB and eNB need to be run with the `--phy-test` flag. At the gNB this flag does the following
- it reads the RRC configuration from the configuration file
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files rbconfig.raw and reconfig.raw
- the MAC uses a pre-configured allocation of PDSCH and PUSCH with randomly generated payload
At the UE the --phy-test flag will
- read the binary files rbconfig.raw and reconfig.raw from the current directory (a different directory can be specified with the flag --rrc_config_path) and process them.
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files `rbconfig.raw` and `reconfig.raw` in the current directory
- the MAC uses a pre-configured allocation of PDSCH and PUSCH with randomly generated payload instead of the standard scheduler. The options `-m`, `-l`, `-t`, `-M`, `-T`, `-D`, and `-U` can be used to configure this scheduler. See `./nr-softmodem -h` for more information.
At the UE, the `--phy-test` flag will read the binary files `rbconfig.raw` and `reconfig.raw` from the current directory and process them. If you wish to provide a different path for these files, please use the options `--reconfig-file` and `--rbconfig-file`.
```bash
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test
```
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports1.xml` (1 layer) or `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports2.xml` (2 layers).
```bash
sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]
sudo ./nr-uesoftmodem --phy-test [--reconfig-file ../../../ci-scripts/rrc-files/reconfig.raw --rbconfig-file ../../../ci-scripts/rrc-files/rbconfig.raw]
```
You need to provide `--rrc_config_path` if you don't start the UE after the gNB
in the same directory.
In summary:
- If you are running on the same machine and launched the 2 executables (`nr-softmodem` and `nr-uesoftmodem`) from the same directory, nothing has to be done.
- If you launched the 2 executables from 2 different folders, just point to the location where you launched the `nr-softmodem`:
* `sudo ./nr-uesoftmodem --rfsim --phy-test --reconfig-file /the/path/where/you/launched/nr-softmodem/reconfig-file --rbconfig-file /the/path/where/you/launched/nr-softmodem/rbconfig-file --rfsimulator.serveraddr <TARGET_GNB_INTERFACE_ADDRESS>`
- If you are not running on the same machine, you need to **COPY** the two raw files
* `scp usera@machineA:/the/path/where/you/launched/nr-softmodem/r*config.raw userb@machineB:/the/path/where/you/will/launch/nr-uesoftmodem/`
* Obviously this operation should be done before launching the `nr-uesoftmodem` executable.
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports1.xml` (1 layer) or `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap_ports2.xml` (2 layers).
## noS1 setup with OAI UE

View File

@@ -31,7 +31,7 @@ sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfap
```
### UE command
```
sudo ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d --rfsimulator.serveraddr 127.0.0.1
sudo ./nr-uesoftmodem --rfsim --phy-test -d --rfsimulator.serveraddr 127.0.0.1
```
## Procedure to run NR nFAPI using Hardware (tested with USRP x310)
@@ -48,7 +48,7 @@ sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfap
```
### UE command
```
sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test --rrc_config_path ../../../ci-scripts/rrc-files
sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test
```

Some files were not shown because too many files have changed in this diff Show More