Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
spbro
OpenXG-RAN
Commits
8404da75
Commit
8404da75
authored
Mar 13, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nullPointerRedundantCheck
parent
ddf3b161
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
78 additions
and
75 deletions
+78
-75
common/config/config_load_configmodule.c
common/config/config_load_configmodule.c
+4
-6
executables/nr-softmodem.c
executables/nr-softmodem.c
+1
-1
nfapi/oai_integration/aerial/fapi_vnf_p7.c
nfapi/oai_integration/aerial/fapi_vnf_p7.c
+1
-1
nfapi/oai_integration/nfapi_vnf.c
nfapi/oai_integration/nfapi_vnf.c
+1
-1
openair1/PHY/CODING/nr_polar_init.c
openair1/PHY/CODING/nr_polar_init.c
+2
-3
openair1/PHY/LTE_TRANSPORT/power_control.c
openair1/PHY/LTE_TRANSPORT/power_control.c
+7
-7
openair1/PHY/NR_TRANSPORT/nr_ulsch.c
openair1/PHY/NR_TRANSPORT/nr_ulsch.c
+1
-1
openair1/SIMULATION/LTE_PHY/mbmssim.c
openair1/SIMULATION/LTE_PHY/mbmssim.c
+1
-2
openair1/SIMULATION/RF/dac.c
openair1/SIMULATION/RF/dac.c
+1
-1
openair1/SIMULATION/TOOLS/channel_sim.c
openair1/SIMULATION/TOOLS/channel_sim.c
+1
-1
openair1/SIMULATION/TOOLS/random_channel.c
openair1/SIMULATION/TOOLS/random_channel.c
+5
-3
openair2/E1AP/e1ap.c
openair2/E1AP/e1ap.c
+3
-3
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
+1
-1
openair2/F1AP/f1ap_ids.c
openair2/F1AP/f1ap_ids.c
+2
-2
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+17
-11
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+2
-3
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+2
-2
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+2
-3
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+4
-4
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+2
-2
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+3
-3
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+3
-3
openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
+1
-1
openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
+1
-1
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+1
-1
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+2
-1
openair2/RRC/NR/nr_rrc_config.c
openair2/RRC/NR/nr_rrc_config.c
+5
-5
openair2/RRC/NR/rrc_gNB_du.c
openair2/RRC/NR/rrc_gNB_du.c
+2
-2
No files found.
common/config/config_load_configmodule.c
View file @
8404da75
...
@@ -395,11 +395,9 @@ void write_parsedcfg(configmodule_interface_t *cfgptr)
...
@@ -395,11 +395,9 @@ void write_parsedcfg(configmodule_interface_t *cfgptr)
cfgptr
->
status
->
emptyla
,
cfgptr
->
status
->
emptyla
,
cfgptr
->
status
->
num_write
);
cfgptr
->
status
->
num_write
);
}
}
if
(
cfgptr
!=
NULL
)
{
if
(
cfgptr
->
write_parsedcfg
!=
NULL
)
{
if
(
cfgptr
->
write_parsedcfg
!=
NULL
)
{
printf
(
"[CONFIG] calling config module write_parsedcfg function...
\n
"
);
printf
(
"[CONFIG] calling config module write_parsedcfg function...
\n
"
);
cfgptr
->
write_parsedcfg
(
cfgptr
);
cfgptr
->
write_parsedcfg
(
cfgptr
);
}
}
}
}
}
...
@@ -407,8 +405,8 @@ void write_parsedcfg(configmodule_interface_t *cfgptr)
...
@@ -407,8 +405,8 @@ void write_parsedcfg(configmodule_interface_t *cfgptr)
/* config module could be initialized again after this call */
/* config module could be initialized again after this call */
void
end_configmodule
(
configmodule_interface_t
*
cfgptr
)
void
end_configmodule
(
configmodule_interface_t
*
cfgptr
)
{
{
write_parsedcfg
(
cfgptr
);
if
(
cfgptr
!=
NULL
)
{
if
(
cfgptr
!=
NULL
)
{
write_parsedcfg
(
cfgptr
);
if
(
cfgptr
->
end
!=
NULL
)
{
if
(
cfgptr
->
end
!=
NULL
)
{
printf
(
"[CONFIG] calling config module end function...
\n
"
);
printf
(
"[CONFIG] calling config module end function...
\n
"
);
cfgptr
->
end
(
cfgptr
);
cfgptr
->
end
(
cfgptr
);
...
...
executables/nr-softmodem.c
View file @
8404da75
...
@@ -592,7 +592,7 @@ static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
...
@@ -592,7 +592,7 @@ static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
nb_id
=
rrc
->
node_id
;
nb_id
=
rrc
->
node_id
;
}
else
if
(
node_type
==
ngran_gNB_DU
)
{
}
else
if
(
node_type
==
ngran_gNB_DU
)
{
const
gNB_MAC_INST
*
mac
=
RC
.
nrmac
[
0
];
const
gNB_MAC_INST
*
mac
=
RC
.
nrmac
[
0
];
AssertFatal
(
mac
!=
NULL
,
"MAC not initialized
\n
"
);
AssertFatal
(
mac
,
"MAC not initialized
\n
"
);
cu_du_id
=
mac
->
f1_config
.
gnb_id
;
cu_du_id
=
mac
->
f1_config
.
gnb_id
;
nb_id
=
mac
->
f1_config
.
setup_req
->
gNB_DU_id
;
nb_id
=
mac
->
f1_config
.
setup_req
->
gNB_DU_id
;
}
else
if
(
node_type
==
ngran_gNB_CU
||
node_type
==
ngran_gNB_CUCP
)
{
}
else
if
(
node_type
==
ngran_gNB_CU
||
node_type
==
ngran_gNB_CUCP
)
{
...
...
nfapi/oai_integration/aerial/fapi_vnf_p7.c
View file @
8404da75
...
@@ -423,7 +423,7 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
...
@@ -423,7 +423,7 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
{
{
if
(
NFAPI_MODE
==
NFAPI_MODE_AERIAL
)
{
if
(
NFAPI_MODE
==
NFAPI_MODE_AERIAL
)
{
nfapi_nr_uci_indication_t
*
uci_ind
=
CALLOC
(
1
,
sizeof
(
*
uci_ind
));
nfapi_nr_uci_indication_t
*
uci_ind
=
CALLOC
(
1
,
sizeof
(
*
uci_ind
));
AssertFatal
(
uci_ind
!=
NULL
,
"Memory not allocated for uci_ind in phy_nr_uci_indication."
);
AssertFatal
(
uci_ind
,
"Memory not allocated for uci_ind in phy_nr_uci_indication."
);
*
uci_ind
=
*
ind
;
*
uci_ind
=
*
ind
;
uci_ind
->
uci_list
=
CALLOC
(
NFAPI_NR_UCI_IND_MAX_PDU
,
sizeof
(
nfapi_nr_uci_t
));
uci_ind
->
uci_list
=
CALLOC
(
NFAPI_NR_UCI_IND_MAX_PDU
,
sizeof
(
nfapi_nr_uci_t
));
...
...
nfapi/oai_integration/nfapi_vnf.c
View file @
8404da75
...
@@ -759,7 +759,7 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
...
@@ -759,7 +759,7 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
if
(
NFAPI_MODE
==
NFAPI_MODE_VNF
)
if
(
NFAPI_MODE
==
NFAPI_MODE_VNF
)
{
{
nfapi_nr_uci_indication_t
*
uci_ind
=
CALLOC
(
1
,
sizeof
(
*
uci_ind
));
nfapi_nr_uci_indication_t
*
uci_ind
=
CALLOC
(
1
,
sizeof
(
*
uci_ind
));
AssertFatal
(
uci_ind
!=
NULL
,
"Memory not allocated for uci_ind in phy_nr_uci_indication."
);
AssertFatal
(
uci_ind
,
"Memory not allocated for uci_ind in phy_nr_uci_indication."
);
*
uci_ind
=
*
ind
;
*
uci_ind
=
*
ind
;
uci_ind
->
uci_list
=
CALLOC
(
NFAPI_NR_UCI_IND_MAX_PDU
,
sizeof
(
nfapi_nr_uci_t
));
uci_ind
->
uci_list
=
CALLOC
(
NFAPI_NR_UCI_IND_MAX_PDU
,
sizeof
(
nfapi_nr_uci_t
));
...
...
openair1/PHY/CODING/nr_polar_init.c
View file @
8404da75
...
@@ -110,10 +110,9 @@ t_nrPolar_params *nr_polar_params(int8_t messageType, uint16_t messageLength, ui
...
@@ -110,10 +110,9 @@ t_nrPolar_params *nr_polar_params(int8_t messageType, uint16_t messageLength, ui
// printf("currentPtr %p (polarParams %p)\n",currentPtr,polarParams);
// printf("currentPtr %p (polarParams %p)\n",currentPtr,polarParams);
//Else, initialize and add node to the end of the linked list.
//Else, initialize and add node to the end of the linked list.
t_nrPolar_params
*
newPolarInitNode
=
calloc
(
sizeof
(
t_nrPolar_params
),
1
);
t_nrPolar_params
*
newPolarInitNode
=
calloc
(
sizeof
(
t_nrPolar_params
),
1
);
newPolarInitNode
->
busy
=
true
;
AssertFatal
(
newPolarInitNode
,
"[nr_polar_init] New t_nrPolar_params * could not be created"
);
newPolarInitNode
->
busy
=
true
;
pthread_mutex_unlock
(
&
PolarListMutex
);
pthread_mutex_unlock
(
&
PolarListMutex
);
AssertFatal
(
newPolarInitNode
!=
NULL
,
"[nr_polar_init] New t_nrPolar_params * could not be created"
);
// LOG_D(PHY,"Setting new polarParams index %d, messageType %d, messageLength %d, aggregation_prime %d\n",(messageType * messageLength * aggregation_prime),messageType,messageLength,aggregation_prime);
// LOG_D(PHY,"Setting new polarParams index %d, messageType %d, messageLength %d, aggregation_prime %d\n",(messageType * messageLength * aggregation_prime),messageType,messageLength,aggregation_prime);
newPolarInitNode
->
idx
=
PolarKey
;
newPolarInitNode
->
idx
=
PolarKey
;
...
...
openair1/PHY/LTE_TRANSPORT/power_control.c
View file @
8404da75
...
@@ -41,8 +41,8 @@ double get_pa_dB(uint8_t pa)
...
@@ -41,8 +41,8 @@ double get_pa_dB(uint8_t pa)
}
}
double
computeRhoA_eNB
(
uint8_t
pa
,
double
computeRhoA_eNB
(
uint8_t
pa
,
LTE_eNB_DLSCH_t
*
dlsch_eNB
,
int
dl_power_off
,
uint8_t
n_antenna_port
)
LTE_eNB_DLSCH_t
*
dlsch_eNB
,
int
dl_power_off
,
uint8_t
n_antenna_port
)
{
{
double
rho_a_dB
;
double
rho_a_dB
;
double
sqrt_rho_a_lin
;
double
sqrt_rho_a_lin
;
...
@@ -59,10 +59,10 @@ double computeRhoA_eNB(uint8_t pa,
...
@@ -59,10 +59,10 @@ double computeRhoA_eNB(uint8_t pa,
if
(
dlsch_eNB
)
{
if
(
dlsch_eNB
)
{
dlsch_eNB
->
sqrt_rho_a
=
(
short
)
(
sqrt_rho_a_lin
*
pow
(
2
,
13
));
dlsch_eNB
->
sqrt_rho_a
=
(
short
)
(
sqrt_rho_a_lin
*
pow
(
2
,
13
));
dlsch_eNB
->
pa
=
pa
;
dlsch_eNB
->
pa
=
pa
;
}
#if DEBUG_PC
#if DEBUG_PC
printf
(
"eNB: p_a=%d, value=%f, sqrt_rho_a=%d
\n
"
,
p_a
,
pa_values
[
pdsch_config_dedicated
->
p_a
],
dlsch_eNB
->
sqrt_rho_a
);
printf
(
"eNB: p_a=%d, value=%f, sqrt_rho_a=%d
\n
"
,
p_a
,
pa_values
[
pdsch_config_dedicated
->
p_a
],
dlsch_eNB
->
sqrt_rho_a
);
#endif
#endif
}
return
(
rho_a_dB
);
return
(
rho_a_dB
);
}
}
...
@@ -89,12 +89,12 @@ double computeRhoB_eNB(uint8_t pa,
...
@@ -89,12 +89,12 @@ double computeRhoB_eNB(uint8_t pa,
sqrt_rho_b_lin
=
pow
(
10
,(
0
.
05
*
rho_b_dB
));
sqrt_rho_b_lin
=
pow
(
10
,(
0
.
05
*
rho_b_dB
));
if
(
dlsch_eNB
)
{
if
(
dlsch_eNB
)
{
dlsch_eNB
->
sqrt_rho_b
=
(
short
)
(
sqrt_rho_b_lin
*
pow
(
2
,
13
));
dlsch_eNB
->
sqrt_rho_b
=
(
short
)
(
sqrt_rho_b_lin
*
pow
(
2
,
13
));
dlsch_eNB
->
pb
=
pb
;
dlsch_eNB
->
pb
=
pb
;
}
#ifdef DEBUG_PC
#ifdef DEBUG_PC
printf
(
"eNB: n_ant=%d, p_b=%d -> rho_b/rho_a=%f -> sqrt_rho_b=%d
\n
"
,
n_antenna_port
,
pb
,
ratioPB
[
1
][
pb
],
dlsch_eNB
->
sqrt_rho_b
);
printf
(
"eNB: n_ant=%d, p_b=%d -> rho_b/rho_a=%f -> sqrt_rho_b=%d
\n
"
,
n_antenna_port
,
pb
,
ratioPB
[
1
][
pb
],
dlsch_eNB
->
sqrt_rho_b
);
#endif
#endif
}
return
(
rho_b_dB
);
return
(
rho_b_dB
);
}
}
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch.c
View file @
8404da75
...
@@ -42,7 +42,7 @@ static NR_gNB_ULSCH_t *find_nr_ulsch(PHY_VARS_gNB *gNB, uint16_t rnti, int pid)
...
@@ -42,7 +42,7 @@ static NR_gNB_ULSCH_t *find_nr_ulsch(PHY_VARS_gNB *gNB, uint16_t rnti, int pid)
for
(
int
i
=
0
;
i
<
gNB
->
max_nb_pusch
;
i
++
)
{
for
(
int
i
=
0
;
i
<
gNB
->
max_nb_pusch
;
i
++
)
{
ulsch
=
&
gNB
->
ulsch
[
i
];
ulsch
=
&
gNB
->
ulsch
[
i
];
AssertFatal
(
ulsch
!=
NULL
,
"gNB->ulsch[%d] is null
\n
"
,
i
);
AssertFatal
(
ulsch
,
"gNB->ulsch[%d] is null
\n
"
,
i
);
if
(
!
ulsch
->
active
)
{
if
(
!
ulsch
->
active
)
{
if
(
first_free_index
==
-
1
)
if
(
first_free_index
==
-
1
)
first_free_index
=
i
;
first_free_index
=
i
;
...
...
openair1/SIMULATION/LTE_PHY/mbmssim.c
View file @
8404da75
...
@@ -688,9 +688,8 @@ int main(int argc, char **argv) {
...
@@ -688,9 +688,8 @@ int main(int argc, char **argv) {
else
{
else
{
while
(
fgets
(
buf
,
63
,
proc_fd
))
while
(
fgets
(
buf
,
63
,
proc_fd
))
printf
(
"%s"
,
buf
);
printf
(
"%s"
,
buf
);
fclose
(
proc_fd
);
}
}
fclose
(
proc_fd
);
cpu_freq_GHz
=
((
double
)
atof
(
buf
))
/
1e6
;
cpu_freq_GHz
=
((
double
)
atof
(
buf
))
/
1e6
;
#else
#else
cpu_freq_GHz
=
get_cpu_freq_GHz
();
cpu_freq_GHz
=
get_cpu_freq_GHz
();
...
...
openair1/SIMULATION/RF/dac.c
View file @
8404da75
...
@@ -107,6 +107,7 @@ double dac_fixed_gain(double *s_re[2],
...
@@ -107,6 +107,7 @@ double dac_fixed_gain(double *s_re[2],
*
amp1p
=
sqrt
(
*
amp1p
);
*
amp1p
=
sqrt
(
*
amp1p
);
}
}
AssertFatal
(
amp1p
!=
NULL
&&
*
amp1p
!=
0
.
0
,
"Precondition to avoid UB
\n
"
);
#ifdef DEBUG_DAC
#ifdef DEBUG_DAC
LOG_I
(
OCM
,
"DAC: amp %f, amp1 %f dB (%d,%d), tx_power target %f (actual %f %f),length %d,pos %d
\n
"
,
LOG_I
(
OCM
,
"DAC: amp %f, amp1 %f dB (%d,%d), tx_power target %f (actual %f %f),length %d,pos %d
\n
"
,
...
@@ -122,7 +123,6 @@ double dac_fixed_gain(double *s_re[2],
...
@@ -122,7 +123,6 @@ double dac_fixed_gain(double *s_re[2],
#endif
#endif
AssertFatal
(
amp1p
!=
NULL
&&
*
amp1p
!=
0
.
0
,
"Precondition to avoid UB
\n
"
);
for
(
i
=
0
;
i
<
length
;
i
++
)
{
for
(
i
=
0
;
i
<
length
;
i
++
)
{
for
(
aa
=
0
;
aa
<
nb_tx_antennas
;
aa
++
)
{
for
(
aa
=
0
;
aa
<
nb_tx_antennas
;
aa
++
)
{
s_re
[
aa
][
i
]
=
amp
*
((
double
)(((
short
*
)
input
[
aa
]))[((
i
+
input_offset
)
<<
1
)])
/
(
*
amp1p
);
s_re
[
aa
][
i
]
=
amp
*
((
double
)(((
short
*
)
input
[
aa
]))[((
i
+
input_offset
)
<<
1
)])
/
(
*
amp1p
);
...
...
openair1/SIMULATION/TOOLS/channel_sim.c
View file @
8404da75
...
@@ -344,7 +344,7 @@ void do_UL_sig(sim_t *sim, uint16_t subframe, uint8_t abstraction_flag, LTE_DL_F
...
@@ -344,7 +344,7 @@ void do_UL_sig(sim_t *sim, uint16_t subframe, uint8_t abstraction_flag, LTE_DL_F
for
(
UE_id
=
0
;
UE_id
<
NB_UE_INST
;
UE_id
++
)
{
for
(
UE_id
=
0
;
UE_id
<
NB_UE_INST
;
UE_id
++
)
{
txdata
=
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
common_vars
.
txdata
;
txdata
=
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
common_vars
.
txdata
;
AssertFatal
(
txdata
!=
NULL
,
"txdata is null
\n
"
);
AssertFatal
(
txdata
,
"txdata is null
\n
"
);
sf_offset
=
subframe
*
frame_parms
->
samples_per_tti
;
sf_offset
=
subframe
*
frame_parms
->
samples_per_tti
;
if
(
subframe
>
0
)
sf_offset_tdd
=
sf_offset
-
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
N_TA_offset
;
if
(
subframe
>
0
)
sf_offset_tdd
=
sf_offset
-
PHY_vars_UE_g
[
UE_id
][
CC_id
]
->
N_TA_offset
;
...
...
openair1/SIMULATION/TOOLS/random_channel.c
View file @
8404da75
...
@@ -2033,8 +2033,8 @@ int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prn
...
@@ -2033,8 +2033,8 @@ int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prn
}
}
tdata
->
numlines
++
;
tdata
->
numlines
++
;
}
}
return
tdata
->
numlines
;
}
}
return
tdata
->
numlines
;
}
/* show */
else
if
(
strstr
(
buf
,
"set"
)
==
buf
)
{
}
/* show */
else
if
(
strstr
(
buf
,
"set"
)
==
buf
)
{
char
cmdbuf
[
TELNET_MAX_MSGLENGTH
];
char
cmdbuf
[
TELNET_MAX_MSGLENGTH
];
int
sst
=
sscanf
(
tdata
->
tblname
,
"%*[^=]=%i"
,
&
chanidx
);
int
sst
=
sscanf
(
tdata
->
tblname
,
"%*[^=]=%i"
,
&
chanidx
);
...
@@ -2229,11 +2229,12 @@ int get_modchannel_index(char *buf, int debug, void *vdata, telnet_printfunc_t p
...
@@ -2229,11 +2229,12 @@ int get_modchannel_index(char *buf, int debug, void *vdata, telnet_printfunc_t p
if
(
debug
)
if
(
debug
)
LOG_I
(
UTIL
,
"%s received %s
\n
"
,
__FUNCTION__
,
buf
);
LOG_I
(
UTIL
,
"%s received %s
\n
"
,
__FUNCTION__
,
buf
);
webdatadef_t
*
tdata
=
(
webdatadef_t
*
)
vdata
;
webdatadef_t
*
tdata
=
(
webdatadef_t
*
)
vdata
;
tdata
->
numlines
=
0
;
if
(
strncmp
(
buf
,
"set"
,
3
)
==
0
)
{
if
(
strncmp
(
buf
,
"set"
,
3
)
==
0
)
{
return
get_channel_params
(
buf
,
debug
,
vdata
,
prnt
);
return
get_channel_params
(
buf
,
debug
,
vdata
,
prnt
);
}
}
int
numlines
=
0
;
if
(
tdata
!=
NULL
)
{
if
(
tdata
!=
NULL
)
{
tdata
->
numlines
=
0
;
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
for
(
int
i
=
0
;
i
<
max_chan
;
i
++
)
{
if
(
defined_channels
[
i
]
!=
NULL
)
{
if
(
defined_channels
[
i
]
!=
NULL
)
{
tdata
->
numlines
++
;
tdata
->
numlines
++
;
...
@@ -2245,8 +2246,9 @@ int get_modchannel_index(char *buf, int debug, void *vdata, telnet_printfunc_t p
...
@@ -2245,8 +2246,9 @@ int get_modchannel_index(char *buf, int debug, void *vdata, telnet_printfunc_t p
else
{
else
{
snprintf
(
tdata
->
tblname
,
sizeof
(
tdata
->
tblname
)
-
1
,
"No running model in the system"
);
snprintf
(
tdata
->
tblname
,
sizeof
(
tdata
->
tblname
)
-
1
,
"No running model in the system"
);
}
}
numlines
=
tdata
->
numlines
;
}
}
return
tdata
->
numlines
;
return
numlines
;
}
/* get_currentchannel_type */
}
/* get_currentchannel_type */
/*------------------------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------------------------*/
...
...
openair2/E1AP/e1ap.c
View file @
8404da75
...
@@ -2030,21 +2030,21 @@ void *E1AP_CUUP_task(void *arg)
...
@@ -2030,21 +2030,21 @@ void *E1AP_CUUP_task(void *arg)
case
E1AP_BEARER_CONTEXT_SETUP_RESP
:
{
case
E1AP_BEARER_CONTEXT_SETUP_RESP
:
{
const
e1ap_bearer_setup_resp_t
*
resp
=
&
E1AP_BEARER_CONTEXT_SETUP_RESP
(
msg
);
const
e1ap_bearer_setup_resp_t
*
resp
=
&
E1AP_BEARER_CONTEXT_SETUP_RESP
(
msg
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
AssertFatal
(
inst
!=
NULL
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
AssertFatal
(
inst
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE
(
inst
->
cuup
.
assoc_id
,
resp
);
e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE
(
inst
->
cuup
.
assoc_id
,
resp
);
}
break
;
}
break
;
case
E1AP_BEARER_CONTEXT_MODIFICATION_RESP
:
{
case
E1AP_BEARER_CONTEXT_MODIFICATION_RESP
:
{
const
e1ap_bearer_modif_resp_t
*
resp
=
&
E1AP_BEARER_CONTEXT_MODIFICATION_RESP
(
msg
);
const
e1ap_bearer_modif_resp_t
*
resp
=
&
E1AP_BEARER_CONTEXT_MODIFICATION_RESP
(
msg
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
AssertFatal
(
inst
!=
NULL
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
AssertFatal
(
inst
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_RESPONSE
(
inst
->
cuup
.
assoc_id
,
resp
);
e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_RESPONSE
(
inst
->
cuup
.
assoc_id
,
resp
);
}
break
;
}
break
;
case
E1AP_BEARER_CONTEXT_RELEASE_CPLT
:
{
case
E1AP_BEARER_CONTEXT_RELEASE_CPLT
:
{
const
e1ap_bearer_release_cplt_t
*
cplt
=
&
E1AP_BEARER_CONTEXT_RELEASE_CPLT
(
msg
);
const
e1ap_bearer_release_cplt_t
*
cplt
=
&
E1AP_BEARER_CONTEXT_RELEASE_CPLT
(
msg
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
myInstance
);
AssertFatal
(
inst
!=
NULL
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
AssertFatal
(
inst
,
"no E1 instance found for instance %ld
\n
"
,
myInstance
);
e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE
(
inst
->
cuup
.
assoc_id
,
cplt
);
e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE
(
inst
->
cuup
.
assoc_id
,
cplt
);
}
break
;
}
break
;
...
...
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
View file @
8404da75
...
@@ -179,10 +179,10 @@ static void capture_sst_sd(test_cond_value_t* test_cond_value, uint8_t *sst, uin
...
@@ -179,10 +179,10 @@ static void capture_sst_sd(test_cond_value_t* test_cond_value, uint8_t *sst, uin
static
bool
nssai_matches
(
nssai_t
a_nssai
,
uint8_t
b_sst
,
const
uint32_t
*
b_sd
)
static
bool
nssai_matches
(
nssai_t
a_nssai
,
uint8_t
b_sst
,
const
uint32_t
*
b_sd
)
{
{
AssertFatal
(
b_sd
==
NULL
||
*
b_sd
<=
0xffffff
,
"illegal SD %d
\n
"
,
*
b_sd
);
if
(
b_sd
==
NULL
)
{
if
(
b_sd
==
NULL
)
{
return
a_nssai
.
sst
==
b_sst
&&
a_nssai
.
sd
==
0xffffff
;
return
a_nssai
.
sst
==
b_sst
&&
a_nssai
.
sd
==
0xffffff
;
}
else
{
}
else
{
AssertFatal
(
*
b_sd
<=
0xffffff
,
"illegal SD %d
\n
"
,
*
b_sd
);
return
a_nssai
.
sst
==
b_sst
&&
a_nssai
.
sd
==
*
b_sd
;
return
a_nssai
.
sst
==
b_sst
&&
a_nssai
.
sd
==
*
b_sd
;
}
}
}
}
...
...
openair2/F1AP/f1ap_ids.c
View file @
8404da75
...
@@ -53,7 +53,7 @@ bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
...
@@ -53,7 +53,7 @@ bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
return
false
;
return
false
;
}
}
f1_ue_data_t
*
idata
=
malloc
(
sizeof
(
*
idata
));
f1_ue_data_t
*
idata
=
malloc
(
sizeof
(
*
idata
));
AssertFatal
(
idata
!=
NULL
,
"cannot allocate memory
\n
"
);
AssertFatal
(
idata
,
"cannot allocate memory
\n
"
);
*
idata
=
*
data
;
*
idata
=
*
data
;
hashtable_rc_t
ret
=
hashtable_insert
(
cu2du_ue_mapping
,
key
,
idata
);
hashtable_rc_t
ret
=
hashtable_insert
(
cu2du_ue_mapping
,
key
,
idata
);
pthread_mutex_unlock
(
&
cu2du_mutex
);
pthread_mutex_unlock
(
&
cu2du_mutex
);
...
@@ -116,7 +116,7 @@ bool du_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
...
@@ -116,7 +116,7 @@ bool du_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
return
false
;
return
false
;
}
}
f1_ue_data_t
*
idata
=
malloc
(
sizeof
(
*
idata
));
f1_ue_data_t
*
idata
=
malloc
(
sizeof
(
*
idata
));
AssertFatal
(
idata
!=
NULL
,
"cannot allocate memory
\n
"
);
AssertFatal
(
idata
,
"cannot allocate memory
\n
"
);
*
idata
=
*
data
;
*
idata
=
*
data
;
hashtable_rc_t
ret
=
hashtable_insert
(
du2cu_ue_mapping
,
key
,
idata
);
hashtable_rc_t
ret
=
hashtable_insert
(
du2cu_ue_mapping
,
key
,
idata
);
pthread_mutex_unlock
(
&
du2cu_mutex
);
pthread_mutex_unlock
(
&
du2cu_mutex
);
...
...
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
View file @
8404da75
...
@@ -2643,13 +2643,19 @@ uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset) {
...
@@ -2643,13 +2643,19 @@ uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset) {
// - "UE procedure for applying transform precoding on PUSCH"
// - "UE procedure for applying transform precoding on PUSCH"
long
get_transformPrecoding
(
const
NR_UE_UL_BWP_t
*
current_UL_BWP
,
nr_dci_format_t
dci_format
,
uint8_t
configuredGrant
)
long
get_transformPrecoding
(
const
NR_UE_UL_BWP_t
*
current_UL_BWP
,
nr_dci_format_t
dci_format
,
uint8_t
configuredGrant
)
{
{
if
(
configuredGrant
&&
current_UL_BWP
->
configuredGrantConfig
&&
current_UL_BWP
->
configuredGrantConfig
->
transformPrecoder
)
if
(
configuredGrant
&&
current_UL_BWP
&&
current_UL_BWP
->
configuredGrantConfig
&&
current_UL_BWP
->
configuredGrantConfig
->
transformPrecoder
)
return
*
current_UL_BWP
->
configuredGrantConfig
->
transformPrecoder
;
return
*
current_UL_BWP
->
configuredGrantConfig
->
transformPrecoder
;
if
(
dci_format
==
NR_UL_DCI_FORMAT_0_1
&&
current_UL_BWP
&&
current_UL_BWP
->
pusch_Config
&&
current_UL_BWP
->
pusch_Config
->
transformPrecoder
)
if
(
dci_format
==
NR_UL_DCI_FORMAT_0_1
&&
current_UL_BWP
&&
current_UL_BWP
->
pusch_Config
&&
current_UL_BWP
->
pusch_Config
->
transformPrecoder
)
return
*
current_UL_BWP
->
pusch_Config
->
transformPrecoder
;
return
*
current_UL_BWP
->
pusch_Config
->
transformPrecoder
;
if
(
current_UL_BWP
->
rach_ConfigCommon
&&
current_UL_BWP
->
rach_ConfigCommon
->
msg3_transformPrecoder
)
if
(
current_UL_BWP
&&
current_UL_BWP
->
rach_ConfigCommon
&&
current_UL_BWP
->
rach_ConfigCommon
->
msg3_transformPrecoder
)
return
NR_PUSCH_Config__transformPrecoder_enabled
;
return
NR_PUSCH_Config__transformPrecoder_enabled
;
return
NR_PUSCH_Config__transformPrecoder_disabled
;
return
NR_PUSCH_Config__transformPrecoder_disabled
;
...
@@ -2657,8 +2663,8 @@ long get_transformPrecoding(const NR_UE_UL_BWP_t *current_UL_BWP, nr_dci_format_
...
@@ -2657,8 +2663,8 @@ long get_transformPrecoding(const NR_UE_UL_BWP_t *current_UL_BWP, nr_dci_format_
uint8_t
get_pusch_nb_antenna_ports
(
NR_PUSCH_Config_t
*
pusch_Config
,
uint8_t
get_pusch_nb_antenna_ports
(
NR_PUSCH_Config_t
*
pusch_Config
,
NR_SRS_Config_t
*
srs_config
,
NR_SRS_Config_t
*
srs_config
,
dci_field_t
srs_resource_indicator
)
{
dci_field_t
srs_resource_indicator
)
{
uint8_t
n_antenna_port
=
1
;
uint8_t
n_antenna_port
=
1
;
if
(
get_softmodem_params
()
->
phy_test
==
1
)
{
if
(
get_softmodem_params
()
->
phy_test
==
1
)
{
// temporary hack to allow UL-MIMO in phy-test mode without SRS
// temporary hack to allow UL-MIMO in phy-test mode without SRS
...
@@ -2674,7 +2680,7 @@ uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
...
@@ -2674,7 +2680,7 @@ uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
// shall be configured with the same value for all these SRS resources.
// shall be configured with the same value for all these SRS resources.
if
(
srs_resource_set
->
usage
==
NR_SRS_ResourceSet__usage_codebook
)
{
if
(
srs_resource_set
->
usage
==
NR_SRS_ResourceSet__usage_codebook
)
{
NR_SRS_Resource_t
*
srs_resource
=
srs_config
->
srs_ResourceToAddModList
->
list
.
array
[
sri
];
NR_SRS_Resource_t
*
srs_resource
=
srs_config
->
srs_ResourceToAddModList
->
list
.
array
[
sri
];
AssertFatal
(
srs_resource
!=
NULL
,
"SRS resource indicated by DCI does not exist
\n
"
);
AssertFatal
(
srs_resource
,
"SRS resource indicated by DCI does not exist
\n
"
);
n_antenna_port
=
1
<<
srs_resource
->
nrofSRS_Ports
;
n_antenna_port
=
1
<<
srs_resource
->
nrofSRS_Ports
;
break
;
break
;
}
}
...
@@ -2806,8 +2812,8 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
...
@@ -2806,8 +2812,8 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
dci_field_t
srs_resource_indicator
,
dci_field_t
srs_resource_indicator
,
nr_srs_feedback_t
*
srs_feedback
,
nr_srs_feedback_t
*
srs_feedback
,
const
uint8_t
*
nrOfLayers
,
const
uint8_t
*
nrOfLayers
,
uint32_t
*
val
)
{
uint32_t
*
val
)
{
// It is only applicable to codebook based transmission. This field occupies 0 bits for non-codebook based
// It is only applicable to codebook based transmission. This field occupies 0 bits for non-codebook based
// transmission. It also occupies 0 bits for codebook based transmission using a single antenna port.
// transmission. It also occupies 0 bits for codebook based transmission using a single antenna port.
uint8_t
nbits
=
0
;
uint8_t
nbits
=
0
;
...
@@ -2816,8 +2822,9 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
...
@@ -2816,8 +2822,9 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
}
}
uint8_t
pusch_antenna_ports
=
get_pusch_nb_antenna_ports
(
pusch_Config
,
srs_config
,
srs_resource_indicator
);
uint8_t
pusch_antenna_ports
=
get_pusch_nb_antenna_ports
(
pusch_Config
,
srs_config
,
srs_resource_indicator
);
if
((
pusch_Config
&&
pusch_Config
->
txConfig
!=
NULL
&&
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_nonCodebook
)
||
if
(
!
pusch_Config
pusch_antenna_ports
==
1
)
{
||
(
pusch_Config
->
txConfig
!=
NULL
&&
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_nonCodebook
)
||
pusch_antenna_ports
==
1
)
{
return
nbits
;
return
nbits
;
}
}
...
@@ -3041,7 +3048,6 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
...
@@ -3041,7 +3048,6 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
}
}
}
}
return
nbits
;
return
nbits
;
}
}
...
...
openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
View file @
8404da75
...
@@ -74,6 +74,7 @@ void init_RA(NR_UE_MAC_INST_t *mac,
...
@@ -74,6 +74,7 @@ void init_RA(NR_UE_MAC_INST_t *mac,
fapi_nr_config_request_t
*
cfg
=
&
mac
->
phy_config
.
config_req
;
fapi_nr_config_request_t
*
cfg
=
&
mac
->
phy_config
.
config_req
;
prach_resources
->
RA_PREAMBLE_BACKOFF
=
0
;
prach_resources
->
RA_PREAMBLE_BACKOFF
=
0
;
AssertFatal
(
nr_rach_ConfigCommon
,
"Cannot handle scenario without nr_rach_ConfigCommon
\n
"
);
NR_SubcarrierSpacing_t
prach_scs
=
*
nr_rach_ConfigCommon
->
msg1_SubcarrierSpacing
;
NR_SubcarrierSpacing_t
prach_scs
=
*
nr_rach_ConfigCommon
->
msg1_SubcarrierSpacing
;
int
n_prbs
=
get_N_RA_RB
(
prach_scs
,
mac
->
current_UL_BWP
->
scs
);
int
n_prbs
=
get_N_RA_RB
(
prach_scs
,
mac
->
current_UL_BWP
->
scs
);
int
start_prb
=
rach_ConfigGeneric
->
msg1_FrequencyStart
+
mac
->
current_UL_BWP
->
BWPStart
;
int
start_prb
=
rach_ConfigGeneric
->
msg1_FrequencyStart
+
mac
->
current_UL_BWP
->
BWPStart
;
...
@@ -100,12 +101,10 @@ void init_RA(NR_UE_MAC_INST_t *mac,
...
@@ -100,12 +101,10 @@ void init_RA(NR_UE_MAC_INST_t *mac,
}
else
{
}
else
{
LOG_E
(
NR_MAC
,
"Config not handled
\n
"
);
LOG_E
(
NR_MAC
,
"Config not handled
\n
"
);
}
}
}
else
if
(
nr_rach_ConfigCommon
)
{
}
else
{
LOG_I
(
NR_MAC
,
"Initialization of 4-step contention-based random access procedure
\n
"
);
LOG_I
(
NR_MAC
,
"Initialization of 4-step contention-based random access procedure
\n
"
);
prach_resources
->
RA_TYPE
=
RA_4STEP
;
prach_resources
->
RA_TYPE
=
RA_4STEP
;
ra
->
cfra
=
0
;
ra
->
cfra
=
0
;
}
else
{
LOG_E
(
NR_MAC
,
"Config not handled
\n
"
);
}
}
switch
(
rach_ConfigGeneric
->
powerRampingStep
){
// in dB
switch
(
rach_ConfigGeneric
->
powerRampingStep
){
// in dB
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
8404da75
...
@@ -652,7 +652,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
...
@@ -652,7 +652,7 @@ static void nr_generate_Msg3_retransmission(module_id_t module_idP,
// generation of DCI 0_0 to schedule msg3 retransmission
// generation of DCI 0_0 to schedule msg3 retransmission
NR_SearchSpace_t
*
ss
=
ra
->
ra_ss
;
NR_SearchSpace_t
*
ss
=
ra
->
ra_ss
;
NR_ControlResourceSet_t
*
coreset
=
ra
->
coreset
;
NR_ControlResourceSet_t
*
coreset
=
ra
->
coreset
;
AssertFatal
(
coreset
!=
NULL
,
"Coreset cannot be null for RA-Msg3 retransmission
\n
"
);
AssertFatal
(
coreset
,
"Coreset cannot be null for RA-Msg3 retransmission
\n
"
);
const
int
coresetid
=
coreset
->
controlResourceSetId
;
const
int
coresetid
=
coreset
->
controlResourceSetId
;
nfapi_nr_dl_tti_pdcch_pdu_rel15_t
*
pdcch_pdu_rel15
=
nr_mac
->
pdcch_pdu_idx
[
CC_id
][
coresetid
];
nfapi_nr_dl_tti_pdcch_pdu_rel15_t
*
pdcch_pdu_rel15
=
nr_mac
->
pdcch_pdu_idx
[
CC_id
][
coresetid
];
...
@@ -1251,7 +1251,7 @@ static void nr_generate_Msg2(module_id_t module_idP,
...
@@ -1251,7 +1251,7 @@ static void nr_generate_Msg2(module_id_t module_idP,
}
}
NR_ControlResourceSet_t
*
coreset
=
ra
->
coreset
;
NR_ControlResourceSet_t
*
coreset
=
ra
->
coreset
;
AssertFatal
(
coreset
!=
NULL
,
"Coreset cannot be null for RA-Msg2
\n
"
);
AssertFatal
(
coreset
,
"Coreset cannot be null for RA-Msg2
\n
"
);
const
int
coresetid
=
coreset
->
controlResourceSetId
;
const
int
coresetid
=
coreset
->
controlResourceSetId
;
// Calculate number of symbols
// Calculate number of symbols
int
time_domain_assignment
=
get_dl_tda
(
nr_mac
,
scc
,
slotP
);
int
time_domain_assignment
=
get_dl_tda
(
nr_mac
,
scc
,
slotP
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
View file @
8404da75
...
@@ -1071,9 +1071,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
...
@@ -1071,9 +1071,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
if
(
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
current_BWP
->
mcsTableIdx
)
!=
R
)
{
if
(
nr_get_code_rate_dl
(
sched_pdsch
->
mcs
,
current_BWP
->
mcsTableIdx
)
!=
R
)
{
pdsch_pdu
->
mcsTable
[
0
]
=
0
;
pdsch_pdu
->
mcsTable
[
0
]
=
0
;
}
}
AssertFatal
(
harq
!=
NULL
,
"harq is null
\n
"
);
AssertFatal
(
harq
->
round
<
gNB_mac
->
dl_bler
.
harq_round_max
,
"%d"
,
harq
->
round
);
AssertFatal
(
harq
->
round
<
gNB_mac
->
dl_bler
.
harq_round_max
,
"%d"
,
harq
->
round
);
pdsch_pdu
->
rvIndex
[
0
]
=
nr_rv_round_map
[
harq
->
round
%
4
];
pdsch_pdu
->
rvIndex
[
0
]
=
nr_rv_round_map
[
harq
->
round
%
4
];
pdsch_pdu
->
TBSize
[
0
]
=
TBS
;
pdsch_pdu
->
TBSize
[
0
]
=
TBS
;
pdsch_pdu
->
dataScramblingId
=
*
scc
->
physCellId
;
pdsch_pdu
->
dataScramblingId
=
*
scc
->
physCellId
;
pdsch_pdu
->
nrOfLayers
=
nrOfLayers
;
pdsch_pdu
->
nrOfLayers
=
nrOfLayers
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
8404da75
...
@@ -954,10 +954,10 @@ static uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config,
...
@@ -954,10 +954,10 @@ static uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config,
{
{
uint8_t
max_tpmi
=
0
;
uint8_t
max_tpmi
=
0
;
if
((
pusch_Config
&&
pusch_Config
->
txConfig
!=
NULL
&&
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_nonCodebook
)
||
if
(
!
pusch_Config
num_ue_srs_ports
==
1
)
{
||
(
pusch_Config
->
txConfig
!=
NULL
&&
*
pusch_Config
->
txConfig
==
NR_PUSCH_Config__txConfig_nonCodebook
)
||
num_ue_srs_ports
==
1
)
return
max_tpmi
;
return
max_tpmi
;
}
long
max_rank
=
*
pusch_Config
->
maxRank
;
long
max_rank
=
*
pusch_Config
->
maxRank
;
long
*
ul_FullPowerTransmission
=
pusch_Config
->
ext1
?
pusch_Config
->
ext1
->
ul_FullPowerTransmission_r16
:
NULL
;
long
*
ul_FullPowerTransmission
=
pusch_Config
->
ext1
?
pusch_Config
->
ext1
->
ul_FullPowerTransmission_r16
:
NULL
;
...
@@ -1963,7 +1963,7 @@ static bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_
...
@@ -1963,7 +1963,7 @@ static bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_
const
NR_SIB1_t
*
sib1
=
nr_mac
->
common_channels
[
0
].
sib1
?
nr_mac
->
common_channels
[
0
].
sib1
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
:
NULL
;
const
NR_SIB1_t
*
sib1
=
nr_mac
->
common_channels
[
0
].
sib1
?
nr_mac
->
common_channels
[
0
].
sib1
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
:
NULL
;
NR_ServingCellConfigCommonSIB_t
*
scc_sib1
=
sib1
?
sib1
->
servingCellConfigCommon
:
NULL
;
NR_ServingCellConfigCommonSIB_t
*
scc_sib1
=
sib1
?
sib1
->
servingCellConfigCommon
:
NULL
;
AssertFatal
(
scc
!=
NULL
||
scc_sib1
!=
NULL
,
"We need one serving cell config common
\n
"
);
AssertFatal
(
scc
||
scc_sib1
,
"We need one serving cell config common
\n
"
);
// no UEs
// no UEs
if
(
nr_mac
->
UE_info
.
list
[
0
]
==
NULL
)
if
(
nr_mac
->
UE_info
.
list
[
0
]
==
NULL
)
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
View file @
8404da75
...
@@ -260,7 +260,7 @@ static int handle_ue_context_drbs_release(int rnti,
...
@@ -260,7 +260,7 @@ static int handle_ue_context_drbs_release(int rnti,
newGtpuDeleteOneTunnel
(
f1inst
,
rnti
,
drb
->
rb_id
);
newGtpuDeleteOneTunnel
(
f1inst
,
rnti
,
drb
->
rb_id
);
asn_sequence_del
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
idx
,
1
);
asn_sequence_del
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
idx
,
1
);
long
*
plcid
=
malloc
(
sizeof
(
*
plcid
));
long
*
plcid
=
malloc
(
sizeof
(
*
plcid
));
AssertFatal
(
plcid
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
plcid
,
"out of memory
\n
"
);
*
plcid
=
lcid
;
*
plcid
=
lcid
;
int
ret
=
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToReleaseList
->
list
,
plcid
);
int
ret
=
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToReleaseList
->
list
,
plcid
);
DevAssert
(
ret
==
0
);
DevAssert
(
ret
==
0
);
...
@@ -392,7 +392,7 @@ void ue_context_setup_request(const f1ap_ue_context_setup_t *req)
...
@@ -392,7 +392,7 @@ void ue_context_setup_request(const f1ap_ue_context_setup_t *req)
NR_SCHED_LOCK
(
&
mac
->
sched_lock
);
NR_SCHED_LOCK
(
&
mac
->
sched_lock
);
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
RC
.
nrmac
[
0
]
->
UE_info
,
req
->
gNB_DU_ue_id
);
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
RC
.
nrmac
[
0
]
->
UE_info
,
req
->
gNB_DU_ue_id
);
AssertFatal
(
UE
!=
NULL
,
"did not find UE with RNTI %04x, but UE Context Setup Failed not implemented
\n
"
,
req
->
gNB_DU_ue_id
);
AssertFatal
(
UE
,
"did not find UE with RNTI %04x, but UE Context Setup Failed not implemented
\n
"
,
req
->
gNB_DU_ue_id
);
NR_CellGroupConfig_t
*
new_CellGroup
=
clone_CellGroupConfig
(
UE
->
CellGroup
);
NR_CellGroupConfig_t
*
new_CellGroup
=
clone_CellGroupConfig
(
UE
->
CellGroup
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
View file @
8404da75
...
@@ -45,17 +45,17 @@ static void f1_setup_request_direct(const f1ap_setup_req_t *req)
...
@@ -45,17 +45,17 @@ static void f1_setup_request_direct(const f1ap_setup_req_t *req)
if
(
req
->
cell
[
n
].
sys_info
)
{
if
(
req
->
cell
[
n
].
sys_info
)
{
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
f1ap_gnb_du_system_info_t
*
copy_sys_info
=
calloc
(
1
,
sizeof
(
*
copy_sys_info
));
f1ap_gnb_du_system_info_t
*
copy_sys_info
=
calloc
(
1
,
sizeof
(
*
copy_sys_info
));
AssertFatal
(
copy_sys_info
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
,
"out of memory
\n
"
);
f1ap_msg
->
cell
[
n
].
sys_info
=
copy_sys_info
;
f1ap_msg
->
cell
[
n
].
sys_info
=
copy_sys_info
;
copy_sys_info
->
mib
=
calloc
(
orig_sys_info
->
mib_length
,
sizeof
(
uint8_t
));
copy_sys_info
->
mib
=
calloc
(
orig_sys_info
->
mib_length
,
sizeof
(
uint8_t
));
AssertFatal
(
copy_sys_info
->
mib
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
->
mib
,
"out of memory
\n
"
);
memcpy
(
copy_sys_info
->
mib
,
orig_sys_info
->
mib
,
orig_sys_info
->
mib_length
);
memcpy
(
copy_sys_info
->
mib
,
orig_sys_info
->
mib
,
orig_sys_info
->
mib_length
);
copy_sys_info
->
mib_length
=
orig_sys_info
->
mib_length
;
copy_sys_info
->
mib_length
=
orig_sys_info
->
mib_length
;
if
(
orig_sys_info
->
sib1_length
>
0
)
{
if
(
orig_sys_info
->
sib1_length
>
0
)
{
copy_sys_info
->
sib1
=
calloc
(
orig_sys_info
->
sib1_length
,
sizeof
(
uint8_t
));
copy_sys_info
->
sib1
=
calloc
(
orig_sys_info
->
sib1_length
,
sizeof
(
uint8_t
));
AssertFatal
(
copy_sys_info
->
sib1
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
->
sib1
,
"out of memory
\n
"
);
memcpy
(
copy_sys_info
->
sib1
,
orig_sys_info
->
sib1
,
orig_sys_info
->
sib1_length
);
memcpy
(
copy_sys_info
->
sib1
,
orig_sys_info
->
sib1
,
orig_sys_info
->
sib1_length
);
copy_sys_info
->
sib1_length
=
orig_sys_info
->
sib1_length
;
copy_sys_info
->
sib1_length
=
orig_sys_info
->
sib1_length
;
}
}
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
View file @
8404da75
...
@@ -77,17 +77,17 @@ static void f1_setup_request_f1ap(const f1ap_setup_req_t *req)
...
@@ -77,17 +77,17 @@ static void f1_setup_request_f1ap(const f1ap_setup_req_t *req)
if
(
req
->
cell
[
n
].
sys_info
)
{
if
(
req
->
cell
[
n
].
sys_info
)
{
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
f1ap_gnb_du_system_info_t
*
orig_sys_info
=
req
->
cell
[
n
].
sys_info
;
f1ap_gnb_du_system_info_t
*
copy_sys_info
=
calloc
(
1
,
sizeof
(
*
copy_sys_info
));
f1ap_gnb_du_system_info_t
*
copy_sys_info
=
calloc
(
1
,
sizeof
(
*
copy_sys_info
));
AssertFatal
(
copy_sys_info
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
,
"out of memory
\n
"
);
f1ap_setup
->
cell
[
n
].
sys_info
=
copy_sys_info
;
f1ap_setup
->
cell
[
n
].
sys_info
=
copy_sys_info
;
copy_sys_info
->
mib
=
calloc
(
orig_sys_info
->
mib_length
,
sizeof
(
uint8_t
));
copy_sys_info
->
mib
=
calloc
(
orig_sys_info
->
mib_length
,
sizeof
(
uint8_t
));
AssertFatal
(
copy_sys_info
->
mib
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
->
mib
,
"out of memory
\n
"
);
memcpy
(
copy_sys_info
->
mib
,
orig_sys_info
->
mib
,
orig_sys_info
->
mib_length
);
memcpy
(
copy_sys_info
->
mib
,
orig_sys_info
->
mib
,
orig_sys_info
->
mib_length
);
copy_sys_info
->
mib_length
=
orig_sys_info
->
mib_length
;
copy_sys_info
->
mib_length
=
orig_sys_info
->
mib_length
;
if
(
orig_sys_info
->
sib1_length
>
0
)
{
if
(
orig_sys_info
->
sib1_length
>
0
)
{
copy_sys_info
->
sib1
=
calloc
(
orig_sys_info
->
sib1_length
,
sizeof
(
uint8_t
));
copy_sys_info
->
sib1
=
calloc
(
orig_sys_info
->
sib1_length
,
sizeof
(
uint8_t
));
AssertFatal
(
copy_sys_info
->
sib1
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
copy_sys_info
->
sib1
,
"out of memory
\n
"
);
memcpy
(
copy_sys_info
->
sib1
,
orig_sys_info
->
sib1
,
orig_sys_info
->
sib1_length
);
memcpy
(
copy_sys_info
->
sib1
,
orig_sys_info
->
sib1
,
orig_sys_info
->
sib1_length
);
copy_sys_info
->
sib1_length
=
orig_sys_info
->
sib1_length
;
copy_sys_info
->
sib1_length
=
orig_sys_info
->
sib1_length
;
}
}
...
...
openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
View file @
8404da75
...
@@ -116,7 +116,7 @@ static int drb_gtpu_create(instance_t instance,
...
@@ -116,7 +116,7 @@ static int drb_gtpu_create(instance_t instance,
static
instance_t
get_n3_gtp_instance
(
void
)
static
instance_t
get_n3_gtp_instance
(
void
)
{
{
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
0
);
const
e1ap_upcp_inst_t
*
inst
=
getCxtE1
(
0
);
AssertFatal
(
inst
!=
NULL
,
"need to have E1 instance
\n
"
);
AssertFatal
(
inst
,
"need to have E1 instance
\n
"
);
return
inst
->
gtpInstN3
;
return
inst
->
gtpInstN3
;
}
}
...
...
openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
View file @
8404da75
...
@@ -36,7 +36,7 @@ void *nr_pdcp_integrity_nia2_init(uint8_t integrity_key[16])
...
@@ -36,7 +36,7 @@ void *nr_pdcp_integrity_nia2_init(uint8_t integrity_key[16])
// No. The overhead is x8 times more. Don't change before measuring
// No. The overhead is x8 times more. Don't change before measuring
// return integrity_key;
// return integrity_key;
cbc_cmac_ctx_t
*
ctx
=
calloc
(
1
,
sizeof
(
cbc_cmac_ctx_t
));
cbc_cmac_ctx_t
*
ctx
=
calloc
(
1
,
sizeof
(
cbc_cmac_ctx_t
));
AssertFatal
(
ctx
!=
NULL
,
"Memory exhausted"
);
AssertFatal
(
ctx
,
"Memory exhausted"
);
*
ctx
=
init_aes_128_cbc_cmac
(
integrity_key
);
*
ctx
=
init_aes_128_cbc_cmac
(
integrity_key
);
return
ctx
;
return
ctx
;
...
...
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
View file @
8404da75
...
@@ -962,7 +962,7 @@ void nr_rlc_activate_srb0(int ue_id,
...
@@ -962,7 +962,7 @@ void nr_rlc_activate_srb0(int ue_id,
void
(
*
send_initial_ul_rrc_message
)(
int
ue_id
,
const
uint8_t
*
sdu
,
sdu_size_t
sdu_len
,
void
*
data
))
void
(
*
send_initial_ul_rrc_message
)(
int
ue_id
,
const
uint8_t
*
sdu
,
sdu_size_t
sdu_len
,
void
*
data
))
{
{
struct
srb0_data
*
srb0_data
=
calloc
(
1
,
sizeof
(
struct
srb0_data
));
struct
srb0_data
*
srb0_data
=
calloc
(
1
,
sizeof
(
struct
srb0_data
));
AssertFatal
(
srb0_data
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
srb0_data
,
"out of memory
\n
"
);
srb0_data
->
ue_id
=
ue_id
;
srb0_data
->
ue_id
=
ue_id
;
srb0_data
->
data
=
data
;
srb0_data
->
data
=
data
;
...
...
openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
View file @
8404da75
...
@@ -1148,10 +1148,11 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info)
...
@@ -1148,10 +1148,11 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info)
static
uint32_t
nr_ue_dl_processing
(
nr_downlink_indication_t
*
dl_info
)
static
uint32_t
nr_ue_dl_processing
(
nr_downlink_indication_t
*
dl_info
)
{
{
uint32_t
ret_mask
=
0x0
;
uint32_t
ret_mask
=
0x0
;
DevAssert
(
dl_info
!=
NULL
);
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
dl_info
->
module_id
);
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
dl_info
->
module_id
);
// DL indication after reception of DCI or DL PDU
// DL indication after reception of DCI or DL PDU
if
(
dl_info
&&
dl_info
->
dci_ind
&&
dl_info
->
dci_ind
->
number_of_dcis
)
{
if
(
dl_info
->
dci_ind
&&
dl_info
->
dci_ind
->
number_of_dcis
)
{
LOG_T
(
MAC
,
"[L2][IF MODULE][DL INDICATION][DCI_IND]
\n
"
);
LOG_T
(
MAC
,
"[L2][IF MODULE][DL INDICATION][DCI_IND]
\n
"
);
for
(
int
i
=
0
;
i
<
dl_info
->
dci_ind
->
number_of_dcis
;
i
++
)
{
for
(
int
i
=
0
;
i
<
dl_info
->
dci_ind
->
number_of_dcis
;
i
++
)
{
LOG_T
(
MAC
,
">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d
\n
"
,
i
,
dl_info
->
dci_ind
->
number_of_dcis
);
LOG_T
(
MAC
,
">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d
\n
"
,
i
,
dl_info
->
dci_ind
->
number_of_dcis
);
...
...
openair2/RRC/NR/nr_rrc_config.c
View file @
8404da75
...
@@ -2580,7 +2580,7 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
...
@@ -2580,7 +2580,7 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
struct
NR_ServingCellConfig__downlinkBWP_ToAddModList
*
DL_BWP_list
=
struct
NR_ServingCellConfig__downlinkBWP_ToAddModList
*
DL_BWP_list
=
SpCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
;
SpCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
;
struct
NR_UplinkConfig__uplinkBWP_ToAddModList
*
UL_BWP_list
=
uplinkConfig
->
uplinkBWP_ToAddModList
;
struct
NR_UplinkConfig__uplinkBWP_ToAddModList
*
UL_BWP_list
=
uplinkConfig
?
uplinkConfig
->
uplinkBWP_ToAddModList
:
NULL
;
if
(
DL_BWP_list
)
{
if
(
DL_BWP_list
)
{
for
(
int
i
=
0
;
i
<
DL_BWP_list
->
list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
DL_BWP_list
->
list
.
count
;
i
++
)
{
NR_BWP_Downlink_t
*
bwp
=
DL_BWP_list
->
list
.
array
[
i
];
NR_BWP_Downlink_t
*
bwp
=
DL_BWP_list
->
list
.
array
[
i
];
...
@@ -2675,7 +2675,8 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
...
@@ -2675,7 +2675,8 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
const
int
dl_antenna_ports
=
pdschap
->
N1
*
pdschap
->
N2
*
pdschap
->
XP
;
const
int
dl_antenna_ports
=
pdschap
->
N1
*
pdschap
->
N2
*
pdschap
->
XP
;
const
int
do_csirs
=
configuration
->
do_CSIRS
;
const
int
do_csirs
=
configuration
->
do_CSIRS
;
AssertFatal
(
servingcellconfigcommon
!=
NULL
,
"servingcellconfigcommon is null
\n
"
);
AssertFatal
(
servingcellconfigcommon
,
"servingcellconfigcommon is null
\n
"
);
AssertFatal
(
servingcellconfigdedicated
,
"servingcellconfigdedicated is null
\n
"
);
if
(
uecap
==
NULL
)
if
(
uecap
==
NULL
)
LOG_E
(
RRC
,
"No UE Capabilities available when programming default CellGroup in NSA
\n
"
);
LOG_E
(
RRC
,
"No UE Capabilities available when programming default CellGroup in NSA
\n
"
);
...
@@ -2803,7 +2804,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
...
@@ -2803,7 +2804,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
// Downlink BWPs
// Downlink BWPs
int
n_dl_bwp
=
1
;
int
n_dl_bwp
=
1
;
if
(
servingcellconfigdedicated
&&
servingcellconfigdedicated
->
downlinkBWP_ToAddModList
)
{
if
(
servingcellconfigdedicated
->
downlinkBWP_ToAddModList
)
{
n_dl_bwp
=
servingcellconfigdedicated
->
downlinkBWP_ToAddModList
->
list
.
count
;
n_dl_bwp
=
servingcellconfigdedicated
->
downlinkBWP_ToAddModList
->
list
.
count
;
}
}
if
(
n_dl_bwp
>
0
)
{
if
(
n_dl_bwp
>
0
)
{
...
@@ -2833,8 +2834,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
...
@@ -2833,8 +2834,7 @@ NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigC
// Uplink BWPs
// Uplink BWPs
int
n_ul_bwp
=
1
;
int
n_ul_bwp
=
1
;
if
(
servingcellconfigdedicated
&&
servingcellconfigdedicated
->
uplinkConfig
if
(
servingcellconfigdedicated
->
uplinkConfig
&&
servingcellconfigdedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
)
{
&&
servingcellconfigdedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
)
{
n_ul_bwp
=
servingcellconfigdedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
count
;
n_ul_bwp
=
servingcellconfigdedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
count
;
}
}
if
(
n_ul_bwp
>
0
)
{
if
(
n_ul_bwp
>
0
)
{
...
...
openair2/RRC/NR/rrc_gNB_du.c
View file @
8404da75
...
@@ -146,14 +146,14 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
...
@@ -146,14 +146,14 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
// we accept the DU
// we accept the DU
nr_rrc_du_container_t
*
du
=
calloc
(
1
,
sizeof
(
*
du
));
nr_rrc_du_container_t
*
du
=
calloc
(
1
,
sizeof
(
*
du
));
AssertFatal
(
du
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
du
,
"out of memory
\n
"
);
du
->
assoc_id
=
assoc_id
;
du
->
assoc_id
=
assoc_id
;
/* ITTI will free the setup request message via free(). So the memory
/* ITTI will free the setup request message via free(). So the memory
* "inside" of the message will remain, but the "outside" container no, so
* "inside" of the message will remain, but the "outside" container no, so
* allocate memory and copy it in */
* allocate memory and copy it in */
du
->
setup_req
=
calloc
(
1
,
sizeof
(
*
du
->
setup_req
));
du
->
setup_req
=
calloc
(
1
,
sizeof
(
*
du
->
setup_req
));
AssertFatal
(
du
->
setup_req
!=
NULL
,
"out of memory
\n
"
);
AssertFatal
(
du
->
setup_req
,
"out of memory
\n
"
);
*
du
->
setup_req
=
*
req
;
*
du
->
setup_req
=
*
req
;
if
(
mib
!=
NULL
&&
sib1
!=
NULL
)
{
if
(
mib
!=
NULL
&&
sib1
!=
NULL
)
{
du
->
mib
=
mib
->
message
.
choice
.
mib
;
du
->
mib
=
mib
->
message
.
choice
.
mib
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment