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
Michael Black
OpenXG-RAN
Commits
1b90c4a0
Commit
1b90c4a0
authored
6 years ago
by
Konstantinos Alexandris
Committed by
Robert Schmidt
6 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Create RRC setters for Periodic, A1-A5 event and offsets related to RRC Measurement Report
parent
1de4b740
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1018 additions
and
183 deletions
+1018
-183
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-0
openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c
.../ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c
+147
-0
openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h
.../ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h
+31
-0
openair2/ENB_APP/MESSAGES/V2/flexran.proto
openair2/ENB_APP/MESSAGES/V2/flexran.proto
+3
-2
openair2/ENB_APP/flexran_agent_common.c
openair2/ENB_APP/flexran_agent_common.c
+49
-4
openair2/ENB_APP/flexran_agent_ran_api.c
openair2/ENB_APP/flexran_agent_ran_api.c
+393
-5
openair2/ENB_APP/flexran_agent_ran_api.h
openair2/ENB_APP/flexran_agent_ran_api.h
+39
-0
openair2/RRC/LTE/rrc_eNB.c
openair2/RRC/LTE/rrc_eNB.c
+354
-170
openair2/RRC/LTE/rrc_proto.h
openair2/RRC/LTE/rrc_proto.h
+1
-2
No files found.
cmake_targets/CMakeLists.txt
View file @
1b90c4a0
...
@@ -887,6 +887,7 @@ add_library(FLEXRAN_AGENT
...
@@ -887,6 +887,7 @@ add_library(FLEXRAN_AGENT
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/PHY/flexran_agent_phy.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/PHY/flexran_agent_phy.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c
${
OPENAIR2_DIR
}
/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c
${
OPENAIR2_DIR
}
/ENB_APP/flexran_agent.c
${
OPENAIR2_DIR
}
/ENB_APP/flexran_agent.c
${
OPENAIR2_DIR
}
/ENB_APP/flexran_agent_task_manager.c
${
OPENAIR2_DIR
}
/ENB_APP/flexran_agent_task_manager.c
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.c
0 → 100644
View file @
1b90c4a0
/*
* 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 "flexran_agent_rrc_internal.h"
#include "flexran_agent_ran_api.h"
int
update_rrc_reconfig
(
mid_t
mod_id
,
rnti_t
rnti
,
Protocol__FlexRrcTriggering
*
trigg
)
{
// Measurement info reconfiguration
if
(
trigg
->
meas_info
)
{
/* Set serving cell frequency offset */
if
(
trigg
->
meas_info
->
has_offset_freq_serving
)
{
if
(
flexran_set_rrc_ofp
(
mod_id
,
rnti
,
trigg
->
meas_info
->
offset_freq_serving
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Serving cell frequency offset
\n
"
);
return
-
1
;
}
}
/* Set neighbouring cell frequency offset */
if
(
trigg
->
meas_info
->
has_offset_freq_neighbouring
)
{
if
(
flexran_set_rrc_ofn
(
mod_id
,
rnti
,
trigg
->
meas_info
->
offset_freq_neighbouring
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Neighbouring cell frequency offset
\n
"
);
return
-
1
;
}
}
if
(
trigg
->
meas_info
->
n_cell_individual_offset
>
0
)
{
/* Set the serving cell offset */
if
(
flexran_set_rrc_ocp
(
mod_id
,
rnti
,
trigg
->
meas_info
->
cell_individual_offset
[
0
])
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Serving cell offset
\n
"
);
return
-
1
;
}
/* Set the neighbouring cell offset */
for
(
int
i
=
0
;
i
<
(
trigg
->
meas_info
->
n_cell_individual_offset
-
1
);
i
++
)
{
if
(
flexran_set_rrc_ocn
(
mod_id
,
rnti
,
i
,
trigg
->
meas_info
->
cell_individual_offset
[
i
+
1
])
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Neighbouring cell offset
\n
"
);
return
-
1
;
}
}
}
if
(
trigg
->
meas_info
->
has_offset_freq_neighbouring
)
{
if
(
flexran_set_rrc_ofn
(
mod_id
,
rnti
,
trigg
->
meas_info
->
offset_freq_neighbouring
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Neighbouring cell frequency offset
\n
"
);
return
-
1
;
}
}
/* Set rsrp filter coefficient */
if
(
trigg
->
meas_info
->
has_filter_coefficient_rsrp
)
{
if
(
flexran_set_filter_coeff_rsrp
(
mod_id
,
rnti
,
trigg
->
meas_info
->
filter_coefficient_rsrp
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set RSRP filter coefficient
\n
"
);
return
-
1
;
}
}
/* Set rsrq filter coefficient */
if
(
trigg
->
meas_info
->
has_filter_coefficient_rsrq
)
{
if
(
flexran_set_filter_coeff_rsrq
(
mod_id
,
rnti
,
trigg
->
meas_info
->
filter_coefficient_rsrq
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set RSRQ filter coefficient
\n
"
);
return
-
1
;
}
}
if
(
trigg
->
meas_info
->
event
)
{
/* Set Periodic event parameters */
if
(
trigg
->
meas_info
->
event
->
periodical
)
{
/* Set Periodic event maximum number of reported cells */
if
(
trigg
->
meas_info
->
event
->
periodical
->
has_max_report_cells
)
{
if
(
flexran_set_rrc_per_event_maxReportCells
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
periodical
->
max_report_cells
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set Periodic event max
\n
"
);
return
-
1
;
}
}
}
/* Set A3 event parameters */
if
(
trigg
->
meas_info
->
event
->
a3
)
{
/* Set A3 event a3 offset */
if
(
trigg
->
meas_info
->
event
->
a3
->
has_a3_offset
)
{
if
(
flexran_set_rrc_a3_event_a3_offset
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
a3
->
a3_offset
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set A3 event offset
\n
"
);
return
-
1
;
}
}
/* Set A3 event report on leave */
if
(
trigg
->
meas_info
->
event
->
a3
->
has_report_on_leave
)
{
if
(
flexran_set_rrc_a3_event_reportOnLeave
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
a3
->
report_on_leave
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set A3 event report on leave
\n
"
);
return
-
1
;
}
}
/* Set A3 event hysteresis */
if
(
trigg
->
meas_info
->
event
->
a3
->
has_hysteresis
)
{
if
(
flexran_set_rrc_a3_event_hysteresis
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
a3
->
hysteresis
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set A3 event hysteresis
\n
"
);
return
-
1
;
}
}
/* Set A3 event time to trigger */
if
(
trigg
->
meas_info
->
event
->
a3
->
has_time_to_trigger
)
{
if
(
flexran_set_rrc_a3_event_timeToTrigger
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
a3
->
time_to_trigger
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set A3 event time to trigger
\n
"
);
return
-
1
;
}
}
/* Set A3 event maximum number of reported cells */
if
(
trigg
->
meas_info
->
event
->
a3
->
has_max_report_cells
)
{
if
(
flexran_set_rrc_a3_event_maxReportCells
(
mod_id
,
rnti
,
trigg
->
meas_info
->
event
->
a3
->
max_report_cells
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Cannot set A3 event max report cells
\n
"
);
return
-
1
;
}
}
}
}
}
return
0
;
}
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc_internal.h
0 → 100644
View file @
1b90c4a0
/*
* 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
*/
#ifndef FLEXRAN_AGENT_RRC_INTERNAL_H_
#define FLEXRAN_AGENT_RRC_INTERNAL_H_
#include "flexran_agent_rrc_internal.h"
#include "flexran_agent_ran_api.h"
int
update_rrc_reconfig
(
mid_t
mod_id
,
rnti_t
rnti
,
Protocol__FlexRrcTriggering
*
trigg
);
#endif
/*FLEXRAN_AGENT_RRC_INTERNAL_H_*/
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/MESSAGES/V2/flexran.proto
View file @
1b90c4a0
...
@@ -7,7 +7,7 @@ import "time_common.proto";
...
@@ -7,7 +7,7 @@ import "time_common.proto";
import
"config_messages.proto"
;
import
"config_messages.proto"
;
import
"controller_commands.proto"
;
import
"controller_commands.proto"
;
import
"control_delegation.proto"
;
import
"control_delegation.proto"
;
import
"config_common.proto"
;
message
flexran_message
{
message
flexran_message
{
optional
flexran_direction
msg_dir
=
100
;
optional
flexran_direction
msg_dir
=
100
;
...
@@ -189,6 +189,7 @@ message flex_rrc_triggering {
...
@@ -189,6 +189,7 @@ message flex_rrc_triggering {
optional
flex_header
header
=
1
;
optional
flex_header
header
=
1
;
optional
string
rrc_trigger
=
2
;
optional
string
rrc_trigger
=
2
;
optional
flex_measurement_info
meas_info
=
3
;
}
}
//
//
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/flexran_agent_common.c
View file @
1b90c4a0
...
@@ -41,6 +41,7 @@
...
@@ -41,6 +41,7 @@
//#include "PHY/extern.h"
//#include "PHY/extern.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/log.h"
#include "flexran_agent_mac_internal.h"
#include "flexran_agent_mac_internal.h"
#include "flexran_agent_rrc_internal.h"
//#include "SCHED/defs.h"
//#include "SCHED/defs.h"
#include "RRC/LTE/rrc_extern.h"
#include "RRC/LTE/rrc_extern.h"
...
@@ -805,10 +806,12 @@ error:
...
@@ -805,10 +806,12 @@ error:
int
flexran_agent_rrc_measurement
(
mid_t
mod_id
,
const
void
*
params
,
Protocol__FlexranMessage
**
msg
)
{
int
flexran_agent_rrc_measurement
(
mid_t
mod_id
,
const
void
*
params
,
Protocol__FlexranMessage
**
msg
)
{
protocol_ctxt_t
ctxt
;
//
protocol_ctxt_t ctxt;
Protocol__FlexranMessage
*
input
=
(
Protocol__FlexranMessage
*
)
params
;
Protocol__FlexranMessage
*
input
=
(
Protocol__FlexranMessage
*
)
params
;
Protocol__FlexRrcTriggering
*
triggering
=
input
->
rrc_triggering
;
Protocol__FlexRrcTriggering
*
triggering
=
input
->
rrc_triggering
;
agent_reconf_rrc
*
reconf_param
=
malloc
(
sizeof
(
agent_reconf_rrc
));
//agent_reconf_rrc *rrc_reconf = malloc(sizeof(agent_reconf_rrc));
#if 0
reconf_param->trigger_policy = triggering->rrc_trigger;
reconf_param->trigger_policy = triggering->rrc_trigger;
reconf_param->report_interval = 0;
reconf_param->report_interval = 0;
reconf_param->report_amount = 0;
reconf_param->report_amount = 0;
...
@@ -817,9 +820,51 @@ int flexran_agent_rrc_measurement(mid_t mod_id, const void *params, Protocol__Fl
...
@@ -817,9 +820,51 @@ int flexran_agent_rrc_measurement(mid_t mod_id, const void *params, Protocol__Fl
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, ue_context_p->ue_context.rnti, flexran_get_current_frame(mod_id), flexran_get_current_subframe (mod_id), mod_id);
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, ue_context_p->ue_context.rnti, flexran_get_current_frame(mod_id), flexran_get_current_subframe (mod_id), mod_id);
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(&ctxt, ue_context_p, 0, reconf_param);
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(&ctxt, ue_context_p, 0, reconf_param);
}
}
#endif
// TODO: Step 1 - Verification process
// Step 2 - Set the proper values using FlexRAN API (protected with mutex ?)
int
num_ue
=
0
;
if
(
flexran_agent_get_rrc_xface
(
mod_id
))
num_ue
=
flexran_get_rrc_num_ues
(
mod_id
);
else
if
(
flexran_agent_get_mac_xface
(
mod_id
))
num_ue
=
flexran_get_mac_num_ues
(
mod_id
);
if
(
flexran_agent_get_rrc_xface
(
mod_id
)
&&
flexran_agent_get_mac_xface
(
mod_id
)
&&
flexran_get_rrc_num_ues
(
mod_id
)
!=
flexran_get_mac_num_ues
(
mod_id
))
{
const
int
nrrc
=
flexran_get_rrc_num_ues
(
mod_id
);
const
int
nmac
=
flexran_get_mac_num_ues
(
mod_id
);
num_ue
=
nrrc
<
nmac
?
nrrc
:
nmac
;
LOG_E
(
FLEXRAN_AGENT
,
"%s(): different numbers of UEs in RRC (%d) and MAC (%d), reporting for %d UEs
\n
"
,
__func__
,
nrrc
,
nmac
,
num_ue
);
}
if
(
num_ue
==
0
)
return
0
;
int
error
=
0
;
rnti_t
rntis
[
num_ue
];
flexran_get_rrc_rnti_list
(
mod_id
,
rntis
,
num_ue
);
for
(
int
i
=
0
;
i
<
num_ue
;
i
++
)
{
const
rnti_t
rnti
=
rntis
[
i
];
if
(
flexran_agent_get_rrc_xface
(
mod_id
))
error
=
update_rrc_reconfig
(
mod_id
,
rnti
,
triggering
);
if
(
error
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Error in updating user %d
\n
"
,
i
);
}
else
{
// Step 3 - Call the proper wrapper in FlexRAN API
if
(
flexran_call_rrc_reconfiguration
(
mod_id
,
rnti
)
<
0
)
{
LOG_E
(
FLEXRAN_AGENT
,
"Error in reconfiguring user %d
\n
"
,
i
);
}
}
}
*
msg
=
NULL
;
*
msg
=
NULL
;
free
(
reconf_param
);
//
free(reconf_param);
reconf_param
=
NULL
;
//
reconf_param = NULL;
return
0
;
return
0
;
}
}
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/flexran_agent_ran_api.c
View file @
1b90c4a0
...
@@ -1434,6 +1434,19 @@ uint32_t flexran_get_pdcp_rx_oo(mid_t mod_id, uint16_t uid, lcid_t lcid)
...
@@ -1434,6 +1434,19 @@ uint32_t flexran_get_pdcp_rx_oo(mid_t mod_id, uint16_t uid, lcid_t lcid)
}
}
/******************** RRC *****************************/
/******************** RRC *****************************/
/* RRC Wrappers */
int
flexran_call_rrc_reconfiguration
(
mid_t
mod_id
,
rnti_t
rnti
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
protocol_ctxt_t
ctxt
;
memset
(
&
ctxt
,
0
,
sizeof
(
ctxt
));
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
mod_id
,
ENB_FLAG_YES
,
ue_context_p
->
ue_context
.
rnti
,
flexran_get_current_frame
(
mod_id
),
flexran_get_current_subframe
(
mod_id
),
mod_id
);
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration
(
&
ctxt
,
ue_context_p
,
0
);
return
0
;
}
/* RRC Getters */
LTE_MeasId_t
flexran_get_rrc_pcell_measid
(
mid_t
mod_id
,
rnti_t
rnti
)
{
LTE_MeasId_t
flexran_get_rrc_pcell_measid
(
mid_t
mod_id
,
rnti_t
rnti
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
...
@@ -1565,6 +1578,8 @@ float flexran_get_rrc_neigh_rsrq(mid_t mod_id, rnti_t rnti, long cell_id) {
...
@@ -1565,6 +1578,8 @@ float flexran_get_rrc_neigh_rsrq(mid_t mod_id, rnti_t rnti, long cell_id) {
return
RSRQ_meas_mapping
[
*
(
ue_context_p
->
ue_context
.
measResults
->
measResultNeighCells
->
choice
.
measResultListEUTRA
.
list
.
array
[
cell_id
]
->
measResult
.
rsrqResult
)];
return
RSRQ_meas_mapping
[
*
(
ue_context_p
->
ue_context
.
measResults
->
measResultNeighCells
->
choice
.
measResultListEUTRA
.
list
.
array
[
cell_id
]
->
measResult
.
rsrqResult
)];
}
}
/* Measurement offsets */
long
flexran_get_rrc_ofp
(
mid_t
mod_id
,
rnti_t
rnti
)
{
long
flexran_get_rrc_ofp
(
mid_t
mod_id
,
rnti_t
rnti
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
...
@@ -1586,7 +1601,40 @@ long flexran_get_rrc_ocp(mid_t mod_id, rnti_t rnti) {
...
@@ -1586,7 +1601,40 @@ long flexran_get_rrc_ocp(mid_t mod_id, rnti_t rnti) {
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
return
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
0
];
switch
(
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
0
])
{
case
LTE_Q_OffsetRange_dB_24
:
return
-
24
;
case
LTE_Q_OffsetRange_dB_22
:
return
-
22
;
case
LTE_Q_OffsetRange_dB_20
:
return
-
20
;
case
LTE_Q_OffsetRange_dB_18
:
return
-
18
;
case
LTE_Q_OffsetRange_dB_16
:
return
-
16
;
case
LTE_Q_OffsetRange_dB_14
:
return
-
14
;
case
LTE_Q_OffsetRange_dB_12
:
return
-
12
;
case
LTE_Q_OffsetRange_dB_10
:
return
-
10
;
case
LTE_Q_OffsetRange_dB_8
:
return
-
8
;
case
LTE_Q_OffsetRange_dB_6
:
return
-
6
;
case
LTE_Q_OffsetRange_dB_5
:
return
-
5
;
case
LTE_Q_OffsetRange_dB_4
:
return
-
4
;
case
LTE_Q_OffsetRange_dB_3
:
return
-
3
;
case
LTE_Q_OffsetRange_dB_2
:
return
-
2
;
case
LTE_Q_OffsetRange_dB_1
:
return
-
1
;
case
LTE_Q_OffsetRange_dB0
:
return
0
;
case
LTE_Q_OffsetRange_dB1
:
return
1
;
case
LTE_Q_OffsetRange_dB2
:
return
2
;
case
LTE_Q_OffsetRange_dB3
:
return
3
;
case
LTE_Q_OffsetRange_dB4
:
return
4
;
case
LTE_Q_OffsetRange_dB5
:
return
5
;
case
LTE_Q_OffsetRange_dB6
:
return
6
;
case
LTE_Q_OffsetRange_dB8
:
return
8
;
case
LTE_Q_OffsetRange_dB10
:
return
10
;
case
LTE_Q_OffsetRange_dB12
:
return
12
;
case
LTE_Q_OffsetRange_dB14
:
return
14
;
case
LTE_Q_OffsetRange_dB16
:
return
16
;
case
LTE_Q_OffsetRange_dB18
:
return
18
;
case
LTE_Q_OffsetRange_dB20
:
return
20
;
case
LTE_Q_OffsetRange_dB22
:
return
22
;
case
LTE_Q_OffsetRange_dB24
:
return
24
;
default:
return
-
99
;
}
}
}
long
flexran_get_rrc_ocn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cell_id
)
{
long
flexran_get_rrc_ocn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cell_id
)
{
...
@@ -1594,7 +1642,40 @@ long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) {
...
@@ -1594,7 +1642,40 @@ long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) {
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
return
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
cell_id
+
1
];
switch
(
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
cell_id
+
1
])
{
case
LTE_Q_OffsetRange_dB_24
:
return
-
24
;
case
LTE_Q_OffsetRange_dB_22
:
return
-
22
;
case
LTE_Q_OffsetRange_dB_20
:
return
-
20
;
case
LTE_Q_OffsetRange_dB_18
:
return
-
18
;
case
LTE_Q_OffsetRange_dB_16
:
return
-
16
;
case
LTE_Q_OffsetRange_dB_14
:
return
-
14
;
case
LTE_Q_OffsetRange_dB_12
:
return
-
12
;
case
LTE_Q_OffsetRange_dB_10
:
return
-
10
;
case
LTE_Q_OffsetRange_dB_8
:
return
-
8
;
case
LTE_Q_OffsetRange_dB_6
:
return
-
6
;
case
LTE_Q_OffsetRange_dB_5
:
return
-
5
;
case
LTE_Q_OffsetRange_dB_4
:
return
-
4
;
case
LTE_Q_OffsetRange_dB_3
:
return
-
3
;
case
LTE_Q_OffsetRange_dB_2
:
return
-
2
;
case
LTE_Q_OffsetRange_dB_1
:
return
-
1
;
case
LTE_Q_OffsetRange_dB0
:
return
0
;
case
LTE_Q_OffsetRange_dB1
:
return
1
;
case
LTE_Q_OffsetRange_dB2
:
return
2
;
case
LTE_Q_OffsetRange_dB3
:
return
3
;
case
LTE_Q_OffsetRange_dB4
:
return
4
;
case
LTE_Q_OffsetRange_dB5
:
return
5
;
case
LTE_Q_OffsetRange_dB6
:
return
6
;
case
LTE_Q_OffsetRange_dB8
:
return
8
;
case
LTE_Q_OffsetRange_dB10
:
return
10
;
case
LTE_Q_OffsetRange_dB12
:
return
12
;
case
LTE_Q_OffsetRange_dB14
:
return
14
;
case
LTE_Q_OffsetRange_dB16
:
return
16
;
case
LTE_Q_OffsetRange_dB18
:
return
18
;
case
LTE_Q_OffsetRange_dB20
:
return
20
;
case
LTE_Q_OffsetRange_dB22
:
return
22
;
case
LTE_Q_OffsetRange_dB24
:
return
24
;
default:
return
-
99
;
}
}
}
long
flexran_get_filter_coeff_rsrp
(
mid_t
mod_id
,
rnti_t
rnti
)
{
long
flexran_get_filter_coeff_rsrp
(
mid_t
mod_id
,
rnti_t
rnti
)
{
...
@@ -1602,7 +1683,25 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti) {
...
@@ -1602,7 +1683,25 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti) {
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
return
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRP
;
switch
(
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRP
)
{
case
LTE_FilterCoefficient_fc0
:
return
0
;
case
LTE_FilterCoefficient_fc1
:
return
1
;
case
LTE_FilterCoefficient_fc2
:
return
2
;
case
LTE_FilterCoefficient_fc3
:
return
3
;
case
LTE_FilterCoefficient_fc4
:
return
4
;
case
LTE_FilterCoefficient_fc5
:
return
5
;
case
LTE_FilterCoefficient_fc6
:
return
6
;
case
LTE_FilterCoefficient_fc7
:
return
7
;
case
LTE_FilterCoefficient_fc8
:
return
8
;
case
LTE_FilterCoefficient_fc9
:
return
9
;
case
LTE_FilterCoefficient_fc11
:
return
11
;
case
LTE_FilterCoefficient_fc13
:
return
13
;
case
LTE_FilterCoefficient_fc15
:
return
15
;
case
LTE_FilterCoefficient_fc17
:
return
17
;
case
LTE_FilterCoefficient_fc19
:
return
19
;
case
LTE_FilterCoefficient_spare1
:
return
-
1
;
/* spare means no coefficient */
default:
return
-
1
;
}
}
}
long
flexran_get_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
)
{
long
flexran_get_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
)
{
...
@@ -1610,7 +1709,25 @@ long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti) {
...
@@ -1610,7 +1709,25 @@ long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti) {
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
return
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRQ
;
switch
(
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRQ
)
{
case
LTE_FilterCoefficient_fc0
:
return
0
;
case
LTE_FilterCoefficient_fc1
:
return
1
;
case
LTE_FilterCoefficient_fc2
:
return
2
;
case
LTE_FilterCoefficient_fc3
:
return
3
;
case
LTE_FilterCoefficient_fc4
:
return
4
;
case
LTE_FilterCoefficient_fc5
:
return
5
;
case
LTE_FilterCoefficient_fc6
:
return
6
;
case
LTE_FilterCoefficient_fc7
:
return
7
;
case
LTE_FilterCoefficient_fc8
:
return
8
;
case
LTE_FilterCoefficient_fc9
:
return
9
;
case
LTE_FilterCoefficient_fc11
:
return
11
;
case
LTE_FilterCoefficient_fc13
:
return
13
;
case
LTE_FilterCoefficient_fc15
:
return
15
;
case
LTE_FilterCoefficient_fc17
:
return
17
;
case
LTE_FilterCoefficient_fc19
:
return
19
;
case
LTE_FilterCoefficient_spare1
:
return
-
1
;
/* spare means no coefficient */
default:
return
-
1
;
}
}
}
/* Periodic event */
/* Periodic event */
...
@@ -1644,7 +1761,25 @@ long flexran_get_rrc_a3_event_timeToTrigger(mid_t mod_id, rnti_t rnti) {
...
@@ -1644,7 +1761,25 @@ long flexran_get_rrc_a3_event_timeToTrigger(mid_t mod_id, rnti_t rnti) {
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
return
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
timeToTrigger
;
switch
(
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
timeToTrigger
)
{
case
LTE_TimeToTrigger_ms0
:
return
0
;
case
LTE_TimeToTrigger_ms40
:
return
40
;
case
LTE_TimeToTrigger_ms64
:
return
64
;
case
LTE_TimeToTrigger_ms80
:
return
80
;
case
LTE_TimeToTrigger_ms100
:
return
100
;
case
LTE_TimeToTrigger_ms128
:
return
128
;
case
LTE_TimeToTrigger_ms160
:
return
160
;
case
LTE_TimeToTrigger_ms256
:
return
256
;
case
LTE_TimeToTrigger_ms320
:
return
320
;
case
LTE_TimeToTrigger_ms480
:
return
480
;
case
LTE_TimeToTrigger_ms512
:
return
512
;
case
LTE_TimeToTrigger_ms640
:
return
640
;
case
LTE_TimeToTrigger_ms1024
:
return
1024
;
case
LTE_TimeToTrigger_ms1280
:
return
1280
;
case
LTE_TimeToTrigger_ms2560
:
return
2560
;
case
LTE_TimeToTrigger_ms5120
:
return
5120
;
default:
return
-
1
;
}
}
}
long
flexran_get_rrc_a3_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
)
{
long
flexran_get_rrc_a3_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
)
{
...
@@ -1677,6 +1812,259 @@ int flexran_get_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti) {
...
@@ -1677,6 +1812,259 @@ int flexran_get_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti) {
return
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
reportOnLeave
;
return
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
reportOnLeave
;
}
}
/* RRC Setters */
/* Measurement offsets */
int
flexran_set_rrc_ofp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
offsetFreq
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
offsetFreq
=
offsetFreq
;
return
0
;
}
int
flexran_set_rrc_ofn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
offsetFreq
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
offsetFreq
=
offsetFreq
;
return
0
;
}
int
flexran_set_rrc_ocp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cellIndividualOffset
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
LTE_Q_OffsetRange_t
*
cio
=
&
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
0
];
switch
(
cellIndividualOffset
)
{
case
-
24
:
*
cio
=
LTE_Q_OffsetRange_dB_24
;
break
;
case
-
22
:
*
cio
=
LTE_Q_OffsetRange_dB_22
;
break
;
case
-
20
:
*
cio
=
LTE_Q_OffsetRange_dB_20
;
break
;
case
-
18
:
*
cio
=
LTE_Q_OffsetRange_dB_18
;
break
;
case
-
16
:
*
cio
=
LTE_Q_OffsetRange_dB_16
;
break
;
case
-
14
:
*
cio
=
LTE_Q_OffsetRange_dB_14
;
break
;
case
-
12
:
*
cio
=
LTE_Q_OffsetRange_dB_12
;
break
;
case
-
10
:
*
cio
=
LTE_Q_OffsetRange_dB_10
;
break
;
case
-
8
:
*
cio
=
LTE_Q_OffsetRange_dB_8
;
break
;
case
-
6
:
*
cio
=
LTE_Q_OffsetRange_dB_6
;
break
;
case
-
5
:
*
cio
=
LTE_Q_OffsetRange_dB_5
;
break
;
case
-
4
:
*
cio
=
LTE_Q_OffsetRange_dB_4
;
break
;
case
-
3
:
*
cio
=
LTE_Q_OffsetRange_dB_3
;
break
;
case
-
2
:
*
cio
=
LTE_Q_OffsetRange_dB_2
;
break
;
case
-
1
:
*
cio
=
LTE_Q_OffsetRange_dB_1
;
break
;
case
0
:
*
cio
=
LTE_Q_OffsetRange_dB0
;
break
;
case
1
:
*
cio
=
LTE_Q_OffsetRange_dB1
;
break
;
case
2
:
*
cio
=
LTE_Q_OffsetRange_dB2
;
break
;
case
3
:
*
cio
=
LTE_Q_OffsetRange_dB3
;
break
;
case
4
:
*
cio
=
LTE_Q_OffsetRange_dB4
;
break
;
case
5
:
*
cio
=
LTE_Q_OffsetRange_dB5
;
break
;
case
6
:
*
cio
=
LTE_Q_OffsetRange_dB6
;
break
;
case
8
:
*
cio
=
LTE_Q_OffsetRange_dB8
;
break
;
case
10
:
*
cio
=
LTE_Q_OffsetRange_dB10
;
break
;
case
12
:
*
cio
=
LTE_Q_OffsetRange_dB12
;
break
;
case
14
:
*
cio
=
LTE_Q_OffsetRange_dB14
;
break
;
case
16
:
*
cio
=
LTE_Q_OffsetRange_dB16
;
break
;
case
18
:
*
cio
=
LTE_Q_OffsetRange_dB18
;
break
;
case
20
:
*
cio
=
LTE_Q_OffsetRange_dB20
;
break
;
case
22
:
*
cio
=
LTE_Q_OffsetRange_dB22
;
break
;
case
24
:
*
cio
=
LTE_Q_OffsetRange_dB24
;
break
;
default:
return
-
1
;
}
return
0
;
}
int
flexran_set_rrc_ocn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cell_id
,
long
cellIndividualOffset
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
LTE_Q_OffsetRange_t
*
cio
=
&
ue_context_p
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
cell_id
+
1
];
switch
(
cellIndividualOffset
)
{
case
-
24
:
*
cio
=
LTE_Q_OffsetRange_dB_24
;
break
;
case
-
22
:
*
cio
=
LTE_Q_OffsetRange_dB_22
;
break
;
case
-
20
:
*
cio
=
LTE_Q_OffsetRange_dB_20
;
break
;
case
-
18
:
*
cio
=
LTE_Q_OffsetRange_dB_18
;
break
;
case
-
16
:
*
cio
=
LTE_Q_OffsetRange_dB_16
;
break
;
case
-
14
:
*
cio
=
LTE_Q_OffsetRange_dB_14
;
break
;
case
-
12
:
*
cio
=
LTE_Q_OffsetRange_dB_12
;
break
;
case
-
10
:
*
cio
=
LTE_Q_OffsetRange_dB_10
;
break
;
case
-
8
:
*
cio
=
LTE_Q_OffsetRange_dB_8
;
break
;
case
-
6
:
*
cio
=
LTE_Q_OffsetRange_dB_6
;
break
;
case
-
5
:
*
cio
=
LTE_Q_OffsetRange_dB_5
;
break
;
case
-
4
:
*
cio
=
LTE_Q_OffsetRange_dB_4
;
break
;
case
-
3
:
*
cio
=
LTE_Q_OffsetRange_dB_3
;
break
;
case
-
2
:
*
cio
=
LTE_Q_OffsetRange_dB_2
;
break
;
case
-
1
:
*
cio
=
LTE_Q_OffsetRange_dB_1
;
break
;
case
0
:
*
cio
=
LTE_Q_OffsetRange_dB0
;
break
;
case
1
:
*
cio
=
LTE_Q_OffsetRange_dB1
;
break
;
case
2
:
*
cio
=
LTE_Q_OffsetRange_dB2
;
break
;
case
3
:
*
cio
=
LTE_Q_OffsetRange_dB3
;
break
;
case
4
:
*
cio
=
LTE_Q_OffsetRange_dB4
;
break
;
case
5
:
*
cio
=
LTE_Q_OffsetRange_dB5
;
break
;
case
6
:
*
cio
=
LTE_Q_OffsetRange_dB6
;
break
;
case
8
:
*
cio
=
LTE_Q_OffsetRange_dB8
;
break
;
case
10
:
*
cio
=
LTE_Q_OffsetRange_dB10
;
break
;
case
12
:
*
cio
=
LTE_Q_OffsetRange_dB12
;
break
;
case
14
:
*
cio
=
LTE_Q_OffsetRange_dB14
;
break
;
case
16
:
*
cio
=
LTE_Q_OffsetRange_dB16
;
break
;
case
18
:
*
cio
=
LTE_Q_OffsetRange_dB18
;
break
;
case
20
:
*
cio
=
LTE_Q_OffsetRange_dB20
;
break
;
case
22
:
*
cio
=
LTE_Q_OffsetRange_dB22
;
break
;
case
24
:
*
cio
=
LTE_Q_OffsetRange_dB24
;
break
;
default:
return
-
1
;
}
return
0
;
}
int
flexran_set_filter_coeff_rsrp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
filterCoefficientRSRP
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
LTE_FilterCoefficient_t
*
fc
=
&
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRP
;
switch
(
filterCoefficientRSRP
)
{
case
0
:
*
fc
=
LTE_FilterCoefficient_fc0
;
break
;
case
1
:
*
fc
=
LTE_FilterCoefficient_fc1
;
break
;
case
2
:
*
fc
=
LTE_FilterCoefficient_fc2
;
break
;
case
3
:
*
fc
=
LTE_FilterCoefficient_fc3
;
break
;
case
4
:
*
fc
=
LTE_FilterCoefficient_fc4
;
break
;
case
5
:
*
fc
=
LTE_FilterCoefficient_fc5
;
break
;
case
6
:
*
fc
=
LTE_FilterCoefficient_fc6
;
break
;
case
7
:
*
fc
=
LTE_FilterCoefficient_fc7
;
break
;
case
8
:
*
fc
=
LTE_FilterCoefficient_fc8
;
break
;
case
9
:
*
fc
=
LTE_FilterCoefficient_fc9
;
break
;
case
11
:
*
fc
=
LTE_FilterCoefficient_fc11
;
break
;
case
13
:
*
fc
=
LTE_FilterCoefficient_fc13
;
break
;
case
15
:
*
fc
=
LTE_FilterCoefficient_fc15
;
break
;
case
17
:
*
fc
=
LTE_FilterCoefficient_fc17
;
break
;
case
19
:
*
fc
=
LTE_FilterCoefficient_fc19
;
break
;
case
-
1
:
*
fc
=
LTE_FilterCoefficient_spare1
;
break
;
default:
return
-
1
;
}
return
0
;
}
int
flexran_set_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
,
long
filterCoefficientRSRQ
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
LTE_FilterCoefficient_t
*
fc
=
&
ue_context_p
->
ue_context
.
measurement_info
->
filterCoefficientRSRQ
;
switch
(
filterCoefficientRSRQ
)
{
case
0
:
*
fc
=
LTE_FilterCoefficient_fc0
;
break
;
case
1
:
*
fc
=
LTE_FilterCoefficient_fc1
;
break
;
case
2
:
*
fc
=
LTE_FilterCoefficient_fc2
;
break
;
case
3
:
*
fc
=
LTE_FilterCoefficient_fc3
;
break
;
case
4
:
*
fc
=
LTE_FilterCoefficient_fc4
;
break
;
case
5
:
*
fc
=
LTE_FilterCoefficient_fc5
;
break
;
case
6
:
*
fc
=
LTE_FilterCoefficient_fc6
;
break
;
case
7
:
*
fc
=
LTE_FilterCoefficient_fc7
;
break
;
case
8
:
*
fc
=
LTE_FilterCoefficient_fc8
;
break
;
case
9
:
*
fc
=
LTE_FilterCoefficient_fc9
;
break
;
case
11
:
*
fc
=
LTE_FilterCoefficient_fc11
;
break
;
case
13
:
*
fc
=
LTE_FilterCoefficient_fc13
;
break
;
case
15
:
*
fc
=
LTE_FilterCoefficient_fc15
;
break
;
case
17
:
*
fc
=
LTE_FilterCoefficient_fc17
;
break
;
case
19
:
*
fc
=
LTE_FilterCoefficient_fc19
;
break
;
case
-
1
:
*
fc
=
LTE_FilterCoefficient_spare1
;
break
;
default:
return
-
1
;
}
return
0
;
}
/* Periodic event */
int
flexran_set_rrc_per_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
,
long
maxReportCells
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
per_event
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
events
->
per_event
->
maxReportCells
=
maxReportCells
;
return
0
;
}
/* A3 event */
int
flexran_set_rrc_a3_event_hysteresis
(
mid_t
mod_id
,
rnti_t
rnti
,
long
hysteresis
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
hysteresis
=
hysteresis
;
return
0
;
}
int
flexran_set_rrc_a3_event_timeToTrigger
(
mid_t
mod_id
,
rnti_t
rnti
,
long
timeToTrigger
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
LTE_TimeToTrigger_t
*
ttt
=
&
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
timeToTrigger
;
switch
(
timeToTrigger
)
{
case
0
:
*
ttt
=
LTE_TimeToTrigger_ms0
;
break
;
case
40
:
*
ttt
=
LTE_TimeToTrigger_ms40
;
break
;
case
64
:
*
ttt
=
LTE_TimeToTrigger_ms64
;
break
;
case
80
:
*
ttt
=
LTE_TimeToTrigger_ms80
;
break
;
case
100
:
*
ttt
=
LTE_TimeToTrigger_ms100
;
break
;
case
128
:
*
ttt
=
LTE_TimeToTrigger_ms128
;
break
;
case
160
:
*
ttt
=
LTE_TimeToTrigger_ms160
;
break
;
case
256
:
*
ttt
=
LTE_TimeToTrigger_ms256
;
break
;
case
320
:
*
ttt
=
LTE_TimeToTrigger_ms320
;
break
;
case
480
:
*
ttt
=
LTE_TimeToTrigger_ms480
;
break
;
case
512
:
*
ttt
=
LTE_TimeToTrigger_ms512
;
break
;
case
640
:
*
ttt
=
LTE_TimeToTrigger_ms640
;
break
;
case
1024
:
*
ttt
=
LTE_TimeToTrigger_ms1024
;
break
;
case
1280
:
*
ttt
=
LTE_TimeToTrigger_ms1280
;
break
;
case
2560
:
*
ttt
=
LTE_TimeToTrigger_ms2560
;
break
;
case
5120
:
*
ttt
=
LTE_TimeToTrigger_ms5120
;
break
;
default:
return
-
1
;
}
return
0
;
}
int
flexran_set_rrc_a3_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
,
long
maxReportCells
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
maxReportCells
=
maxReportCells
;
return
0
;
}
int
flexran_set_rrc_a3_event_a3_offset
(
mid_t
mod_id
,
rnti_t
rnti
,
long
a3_offset
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
a3_offset
=
a3_offset
;
return
0
;
}
int
flexran_set_rrc_a3_event_reportOnLeave
(
mid_t
mod_id
,
rnti_t
rnti
,
int
reportOnLeave
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
-
1
;
struct
rrc_eNB_ue_context_s
*
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
mod_id
],
rnti
);
if
(
!
ue_context_p
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
)
return
-
1
;
if
(
!
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
)
return
-
1
;
ue_context_p
->
ue_context
.
measurement_info
->
events
->
a3_event
->
reportOnLeave
=
reportOnLeave
;
return
0
;
}
uint8_t
flexran_get_rrc_num_plmn_ids
(
mid_t
mod_id
)
{
uint8_t
flexran_get_rrc_num_plmn_ids
(
mid_t
mod_id
)
{
if
(
!
rrc_is_present
(
mod_id
))
return
0
;
if
(
!
rrc_is_present
(
mod_id
))
return
0
;
return
RC
.
rrc
[
mod_id
]
->
configuration
.
num_plmn
;
return
RC
.
rrc
[
mod_id
]
->
configuration
.
num_plmn
;
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/flexran_agent_ran_api.h
View file @
1b90c4a0
...
@@ -498,6 +498,9 @@ uint32_t flexran_get_pdcp_rx_aiat_w(mid_t mod_id, uint16_t uid, lcid_t lcid);
...
@@ -498,6 +498,9 @@ uint32_t flexran_get_pdcp_rx_aiat_w(mid_t mod_id, uint16_t uid, lcid_t lcid);
uint32_t
flexran_get_pdcp_rx_oo
(
mid_t
mod_id
,
uint16_t
uid
,
lcid_t
lcid
);
uint32_t
flexran_get_pdcp_rx_oo
(
mid_t
mod_id
,
uint16_t
uid
,
lcid_t
lcid
);
/*********************RRC**********************/
/*********************RRC**********************/
/* Call RRC Reconfiguration wrapper function */
int
flexran_call_rrc_reconfiguration
(
mid_t
mod_id
,
rnti_t
rnti
);
/*Get primary cell measuremeant id flexRAN*/
/*Get primary cell measuremeant id flexRAN*/
LTE_MeasId_t
flexran_get_rrc_pcell_measid
(
mid_t
mod_id
,
rnti_t
rnti
);
LTE_MeasId_t
flexran_get_rrc_pcell_measid
(
mid_t
mod_id
,
rnti_t
rnti
);
...
@@ -576,6 +579,42 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti);
...
@@ -576,6 +579,42 @@ long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti);
/* Get filter coefficient for rsrq */
/* Get filter coefficient for rsrq */
long
flexran_get_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
);
long
flexran_get_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
);
/* Set ofp offset */
int
flexran_set_rrc_ofp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
offsetFreq
);
/* Set ofn offset */
int
flexran_set_rrc_ofn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
offsetFreq
);
/* Set ocp offset */
int
flexran_set_rrc_ocp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cellIndividualOffset
);
/* Set ocn offset */
int
flexran_set_rrc_ocn
(
mid_t
mod_id
,
rnti_t
rnti
,
long
cell_id
,
long
cellIndividualOffset
);
/* Set Periodic Event max reported cells */
int
flexran_set_rrc_per_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
,
long
maxReportCells
);
/* Set A3 Event hysteresis */
int
flexran_set_rrc_a3_event_hysteresis
(
mid_t
mod_id
,
rnti_t
rnti
,
long
hysteresis
);
/* Set A3 Event time to trigger */
int
flexran_set_rrc_a3_event_timeToTrigger
(
mid_t
mod_id
,
rnti_t
rnti
,
long
timeToTrigger
);
/* Set A3 Event max reported cells */
int
flexran_set_rrc_a3_event_maxReportCells
(
mid_t
mod_id
,
rnti_t
rnti
,
long
maxReportCells
);
/* Set A3 Event a3 offset */
int
flexran_set_rrc_a3_event_a3_offset
(
mid_t
mod_id
,
rnti_t
rnti
,
long
a3_offset
);
/* Set A3 Event report on leave */
int
flexran_set_rrc_a3_event_reportOnLeave
(
mid_t
mod_id
,
rnti_t
rnti
,
int
reportOnLeave
);
/* Set filter coefficient for rsrp */
int
flexran_set_filter_coeff_rsrp
(
mid_t
mod_id
,
rnti_t
rnti
,
long
filterCoefficientRSRP
);
/* Set filter coefficient for rsrq */
int
flexran_set_filter_coeff_rsrq
(
mid_t
mod_id
,
rnti_t
rnti
,
long
filterCoefficientRSRQ
);
/* Get number of PLMNs that is broadcasted in SIB1 */
/* Get number of PLMNs that is broadcasted in SIB1 */
uint8_t
flexran_get_rrc_num_plmn_ids
(
mid_t
mod_id
);
uint8_t
flexran_get_rrc_num_plmn_ids
(
mid_t
mod_id
);
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/LTE/rrc_eNB.c
View file @
1b90c4a0
...
@@ -3617,15 +3617,14 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
...
@@ -3617,15 +3617,14 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
void
void
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
const
uint8_t
ho_state
,
const
uint8_t
ho_state
)
agent_reconf_rrc
*
trig_param
)
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
{
{
uint8_t
buffer
[
RRC_BUF_SIZE
];
uint8_t
buffer
[
RRC_BUF_SIZE
];
uint16_t
size
;
uint16_t
size
;
int
i
;
int
i
;
// configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE
/* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */
eNB_RRC_INST
*
rrc_inst
=
RC
.
rrc
[
ctxt_pP
->
module_id
];
eNB_RRC_INST
*
rrc_inst
=
RC
.
rrc
[
ctxt_pP
->
module_id
];
struct
LTE_PhysicalConfigDedicated
**
physicalConfigDedicated
=
&
ue_context_pP
->
ue_context
.
physicalConfigDedicated
;
struct
LTE_PhysicalConfigDedicated
**
physicalConfigDedicated
=
&
ue_context_pP
->
ue_context
.
physicalConfigDedicated
;
struct
LTE_SRB_ToAddMod
*
SRB2_config
=
NULL
;
struct
LTE_SRB_ToAddMod
*
SRB2_config
=
NULL
;
...
@@ -3649,17 +3648,19 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3649,17 +3648,19 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LTE_MeasObjectToAddModList_t
*
MeasObj_list
=
NULL
;
LTE_MeasObjectToAddModList_t
*
MeasObj_list
=
NULL
;
LTE_MeasObjectToAddMod_t
*
MeasObj
=
NULL
;
LTE_MeasObjectToAddMod_t
*
MeasObj
=
NULL
;
LTE_ReportConfigToAddModList_t
*
ReportConfig_list
=
NULL
;
LTE_ReportConfigToAddModList_t
*
ReportConfig_list
=
NULL
;
LTE_ReportConfigToAddMod_t
*
ReportConfig_per
;
//
, *ReportConfig_A1,
LTE_ReportConfigToAddMod_t
*
ReportConfig_per
,
*
ReportConfig_A1
,
//
*ReportConfig_A2, *ReportConfig_A3, *ReportConfig_A4, *ReportConfig_A5;
*
ReportConfig_A2
,
*
ReportConfig_A3
,
*
ReportConfig_A4
,
*
ReportConfig_A5
;
LTE_MeasIdToAddModList_t
*
MeasId_list
=
NULL
;
LTE_MeasIdToAddModList_t
*
MeasId_list
=
NULL
;
LTE_MeasIdToAddMod_t
*
MeasId0
;
//, *MeasId1, *MeasId2, *MeasId3, *MeasId4, *MeasId5;
LTE_MeasIdToAddMod_t
*
MeasId0
,
*
MeasId1
,
*
MeasId2
,
*
MeasId3
,
*
MeasId4
,
*
MeasId5
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
long
*
sr_ProhibitTimer_r9
=
NULL
;
long
*
sr_ProhibitTimer_r9
=
NULL
;
// uint8_t sCellIndexToAdd = rrc_find_free_SCell_index(enb_mod_idP, ue_mod_idP, 1);
//uint8_t sCellIndexToAdd = 0;
#endif
#endif
long
*
logicalchannelgroup
,
*
logicalchannelgroup_drb
;
long
*
maxHARQ_Tx
,
*
periodicBSR_Timer
;
long
*
logicalchannelgroup
=
NULL
;
long
*
logicalchannelgroup_drb
=
NULL
;
long
*
maxHARQ_Tx
=
NULL
;
long
*
periodicBSR_Timer
=
NULL
;
LTE_RSRP_Range_t
*
rsrp
=
NULL
;
LTE_RSRP_Range_t
*
rsrp
=
NULL
;
struct
LTE_MeasConfig__speedStatePars
*
Sparams
=
NULL
;
struct
LTE_MeasConfig__speedStatePars
*
Sparams
=
NULL
;
LTE_QuantityConfig_t
*
quantityConfig
=
NULL
;
LTE_QuantityConfig_t
*
quantityConfig
=
NULL
;
...
@@ -3667,13 +3668,16 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3667,13 +3668,16 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LTE_CellsToAddModList_t
*
CellsToAddModList
=
NULL
;
LTE_CellsToAddModList_t
*
CellsToAddModList
=
NULL
;
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
*
dedicatedInfoNASList
=
NULL
;
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
*
dedicatedInfoNASList
=
NULL
;
LTE_DedicatedInfoNAS_t
*
dedicatedInfoNas
=
NULL
;
LTE_DedicatedInfoNAS_t
*
dedicatedInfoNas
=
NULL
;
/* for no gcc warnings */
(
void
)
dedicatedInfoNas
;
/* For no gcc warnings */
(
void
)
dedicatedInfoNas
;
LTE_C_RNTI_t
*
cba_RNTI
=
NULL
;
LTE_C_RNTI_t
*
cba_RNTI
=
NULL
;
int
measurements_enabled
;
int
measurements_enabled
;
uint8_t
xid
=
rrc_eNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
//Transaction_id,
uint8_t
xid
=
rrc_eNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
//Transaction_id,
#ifdef CBA
uint8_t
cc_id
=
ue_context_pP
->
ue_context
.
primaryCC_id
;
//struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola;
LTE_UE_EUTRA_Capability_t
*
UEcap
=
ue_context_pP
->
ue_context
.
UE_Capability
;
#ifdef CBA // Contention Based Access
uint8_t
*
cba_RNTI_buf
;
uint8_t
*
cba_RNTI_buf
;
cba_RNTI
=
CALLOC
(
1
,
sizeof
(
LTE_C_RNTI_t
));
cba_RNTI
=
CALLOC
(
1
,
sizeof
(
LTE_C_RNTI_t
));
cba_RNTI_buf
=
CALLOC
(
1
,
2
*
sizeof
(
uint8_t
));
cba_RNTI_buf
=
CALLOC
(
1
,
2
*
sizeof
(
uint8_t
));
...
@@ -3681,27 +3685,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3681,27 +3685,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
cba_RNTI
->
size
=
2
;
cba_RNTI
->
size
=
2
;
cba_RNTI
->
bits_unused
=
0
;
cba_RNTI
->
bits_unused
=
0
;
/
/ associate UEs to the CBa groups as a function of their UE id
/
* Associate UEs to the CBA groups as a function of their UE id */
if
(
rrc_inst
->
num_active_cba_groups
)
{
if
(
rrc_inst
->
num_active_cba_groups
)
{
cba_RNTI
->
buf
[
0
]
=
rrc_inst
->
cba_rnti
[
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
]
&
0xff
;
cba_RNTI
->
buf
[
0
]
=
rrc_inst
->
cba_rnti
[
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
]
&
0xff
;
cba_RNTI
->
buf
[
1
]
=
0xff
;
cba_RNTI
->
buf
[
1
]
=
0xff
;
LOG_D
(
RRC
,
LOG_D
(
RRC
,
"[eNB %d] Frame %d: cba_RNTI = %x in group %d is attribued to UE %d
\n
"
,
"[eNB %d] Frame %d: cba_RNTI = %x in group %d is attribued to UE %d
\n
"
,
enb_mod_idP
,
enb_mod_idP
,
frameP
,
frameP
,
rrc_inst
->
cba_rnti
[
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
],
rrc_inst
->
cba_rnti
[
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
],
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
,
ue_mod_idP
);
ue_mod_idP
%
rrc_inst
->
num_active_cba_groups
,
ue_mod_idP
);
}
else
{
}
else
{
cba_RNTI
->
buf
[
0
]
=
0x0
;
cba_RNTI
->
buf
[
0
]
=
0x0
;
cba_RNTI
->
buf
[
1
]
=
0x0
;
cba_RNTI
->
buf
[
1
]
=
0x0
;
LOG_D
(
RRC
,
"[eNB %d] Frame %d: no cba_RNTI is configured for UE %d
\n
"
,
enb_mod_idP
,
frameP
,
ue_mod_idP
);
LOG_D
(
RRC
,
"[eNB %d] Frame %d: no cba_RNTI is configured for UE %d
\n
"
,
enb_mod_idP
,
frameP
,
ue_mod_idP
);
}
}
#endif
#endif
T
(
T_ENB_RRC_CONNECTION_RECONFIGURATION
,
T_INT
(
ctxt_pP
->
module_id
),
T_INT
(
ctxt_pP
->
frame
),
T_INT
(
ctxt_pP
->
subframe
),
T_INT
(
ctxt_pP
->
rnti
));
T
(
T_ENB_RRC_CONNECTION_RECONFIGURATION
,
// Configure SRB2
T_INT
(
ctxt_pP
->
module_id
),
/// SRB2
T_INT
(
ctxt_pP
->
frame
),
SRB_configList2
=&
ue_context_pP
->
ue_context
.
SRB_configList2
[
xid
];
T_INT
(
ctxt_pP
->
subframe
),
T_INT
(
ctxt_pP
->
rnti
));
/* Configure SRB2 */
SRB_configList2
=
&
(
ue_context_pP
->
ue_context
.
SRB_configList2
[
xid
]);
if
(
*
SRB_configList2
)
{
if
(
*
SRB_configList2
)
{
free
(
*
SRB_configList2
);
free
(
*
SRB_configList2
);
...
@@ -3726,22 +3736,19 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3726,22 +3736,19 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
SRB2_lchan_config
->
present
=
LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue
;
SRB2_lchan_config
->
present
=
LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue
;
SRB2_ul_SpecificParameters
=
CALLOC
(
1
,
sizeof
(
*
SRB2_ul_SpecificParameters
));
SRB2_ul_SpecificParameters
=
CALLOC
(
1
,
sizeof
(
*
SRB2_ul_SpecificParameters
));
SRB2_ul_SpecificParameters
->
priority
=
3
;
// let some priority for SRB1 and dedicated DRBs
SRB2_ul_SpecificParameters
->
priority
=
3
;
// let some priority for SRB1 and dedicated DRBs
SRB2_ul_SpecificParameters
->
prioritisedBitRate
=
SRB2_ul_SpecificParameters
->
prioritisedBitRate
=
LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
;
LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
;
SRB2_ul_SpecificParameters
->
bucketSizeDuration
=
LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50
;
SRB2_ul_SpecificParameters
->
bucketSizeDuration
=
LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50
;
/* LCG for CCCH and DCCH is 0 as defined in 36331 */
// LCG for CCCH and DCCH is 0 as defined in 36331
logicalchannelgroup
=
CALLOC
(
1
,
sizeof
(
long
));
logicalchannelgroup
=
CALLOC
(
1
,
sizeof
(
long
));
*
logicalchannelgroup
=
0
;
*
logicalchannelgroup
=
0
;
SRB2_ul_SpecificParameters
->
logicalChannelGroup
=
logicalchannelgroup
;
SRB2_ul_SpecificParameters
->
logicalChannelGroup
=
logicalchannelgroup
;
SRB2_lchan_config
->
choice
.
explicitValue
.
ul_SpecificParameters
=
SRB2_ul_SpecificParameters
;
SRB2_lchan_config
->
choice
.
explicitValue
.
ul_SpecificParameters
=
SRB2_ul_SpecificParameters
;
// this list has the configuration for SRB1 and SRB2
ASN_SEQUENCE_ADD
(
&
SRB_configList
->
list
,
SRB2_config
);
// this list has only the configuration for SRB2
ASN_SEQUENCE_ADD
(
&
(
*
SRB_configList2
)
->
list
,
SRB2_config
);
// Configure DRB
ASN_SEQUENCE_ADD
(
&
SRB_configList
->
list
,
SRB2_config
);
// this list has the configuration for SRB1 and SRB2
//*DRB_configList = CALLOC(1, sizeof(*DRB_configList));
ASN_SEQUENCE_ADD
(
&
(
*
SRB_configList2
)
->
list
,
SRB2_config
);
// this list has only the configuration for SRB2
/* Configure DRB */
// list for all the configured DRB
// list for all the configured DRB
if
(
*
DRB_configList
)
{
if
(
*
DRB_configList
)
{
free
(
*
DRB_configList
);
free
(
*
DRB_configList
);
...
@@ -3749,8 +3756,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3749,8 +3756,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
*
DRB_configList
=
CALLOC
(
1
,
sizeof
(
**
DRB_configList
));
*
DRB_configList
=
CALLOC
(
1
,
sizeof
(
**
DRB_configList
));
memset
(
*
DRB_configList
,
0
,
sizeof
(
**
DRB_configList
));
memset
(
*
DRB_configList
,
0
,
sizeof
(
**
DRB_configList
));
// list for the configured DRB for a this xid
DRB_configList2
=&
ue_context_pP
->
ue_context
.
DRB_configList2
[
xid
];
DRB_configList2
=&
ue_context_pP
->
ue_context
.
DRB_configList2
[
xid
];
// list for the configured DRB for a this xid
if
(
*
DRB_configList2
)
{
if
(
*
DRB_configList2
)
{
free
(
*
DRB_configList2
);
free
(
*
DRB_configList2
);
...
@@ -3758,17 +3765,17 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3758,17 +3765,17 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
*
DRB_configList2
=
CALLOC
(
1
,
sizeof
(
**
DRB_configList2
));
*
DRB_configList2
=
CALLOC
(
1
,
sizeof
(
**
DRB_configList2
));
memset
(
*
DRB_configList2
,
0
,
sizeof
(
**
DRB_configList2
));
memset
(
*
DRB_configList2
,
0
,
sizeof
(
**
DRB_configList2
));
/// DRB
DRB_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_config
));
DRB_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_config
));
DRB_config
->
eps_BearerIdentity
=
CALLOC
(
1
,
sizeof
(
long
));
DRB_config
->
eps_BearerIdentity
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
DRB_config
->
eps_BearerIdentity
)
=
5L
;
// LW set to first value, allowed value 5..15, value : x+4
*
(
DRB_config
->
eps_BearerIdentity
)
=
5L
;
// LW set to first value, allowed value 5..15, value : x+4
// DRB_config->drb_Identity = (LTE_DRB_Identity_t) 1; //allowed values 1..32
// NN: this is the 1st DRB for this ue, so set it to 1
// NN: this is the 1st DRB for this ue, so set it to 1
DRB_config
->
drb_Identity
=
(
LTE_DRB_Identity_t
)
1
;
// (ue_mod_idP+1); //allowed values 1..32, value: x
DRB_config
->
drb_Identity
=
(
LTE_DRB_Identity_t
)
1
;
// (ue_mod_idP+1); //allowed values 1..32, value: x
DRB_config
->
logicalChannelIdentity
=
CALLOC
(
1
,
sizeof
(
long
));
DRB_config
->
logicalChannelIdentity
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
DRB_config
->
logicalChannelIdentity
)
=
(
long
)
3
;
// value : x+2
*
(
DRB_config
->
logicalChannelIdentity
)
=
(
long
)
3
;
// value : x+2
DRB_rlc_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_rlc_config
));
DRB_rlc_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_rlc_config
));
DRB_config
->
rlc_Config
=
DRB_rlc_config
;
DRB_config
->
rlc_Config
=
DRB_rlc_config
;
#ifdef RRC_DEFAULT_RAB_IS_AM
#ifdef RRC_DEFAULT_RAB_IS_AM
DRB_rlc_config
->
present
=
LTE_RLC_Config_PR_am
;
DRB_rlc_config
->
present
=
LTE_RLC_Config_PR_am
;
DRB_rlc_config
->
choice
.
am
.
ul_AM_RLC
.
t_PollRetransmit
=
LTE_T_PollRetransmit_ms50
;
DRB_rlc_config
->
choice
.
am
.
ul_AM_RLC
.
t_PollRetransmit
=
LTE_T_PollRetransmit_ms50
;
...
@@ -3781,21 +3788,25 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3781,21 +3788,25 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
DRB_rlc_config
->
present
=
LTE_RLC_Config_PR_um_Bi_Directional
;
DRB_rlc_config
->
present
=
LTE_RLC_Config_PR_um_Bi_Directional
;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
ul_UM_RLC
.
sn_FieldLength
=
LTE_SN_FieldLength_size10
;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
ul_UM_RLC
.
sn_FieldLength
=
LTE_SN_FieldLength_size10
;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
sn_FieldLength
=
LTE_SN_FieldLength_size10
;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
sn_FieldLength
=
LTE_SN_FieldLength_size10
;
#ifdef CBA
#ifdef CBA
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
t_Reordering
=
LTE_T_Reordering_ms5
;
//T_Reordering_ms25;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
t_Reordering
=
LTE_T_Reordering_ms5
;
//T_Reordering_ms25;
#else
#else
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
t_Reordering
=
LTE_T_Reordering_ms35
;
DRB_rlc_config
->
choice
.
um_Bi_Directional
.
dl_UM_RLC
.
t_Reordering
=
LTE_T_Reordering_ms35
;
#endif
#endif
#endif
#endif
DRB_pdcp_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_pdcp_config
));
DRB_pdcp_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_pdcp_config
));
DRB_config
->
pdcp_Config
=
DRB_pdcp_config
;
DRB_config
->
pdcp_Config
=
DRB_pdcp_config
;
DRB_pdcp_config
->
discardTimer
=
CALLOC
(
1
,
sizeof
(
long
));
DRB_pdcp_config
->
discardTimer
=
CALLOC
(
1
,
sizeof
(
long
));
*
DRB_pdcp_config
->
discardTimer
=
LTE_PDCP_Config__discardTimer_infinity
;
*
DRB_pdcp_config
->
discardTimer
=
LTE_PDCP_Config__discardTimer_infinity
;
DRB_pdcp_config
->
rlc_AM
=
NULL
;
DRB_pdcp_config
->
rlc_AM
=
NULL
;
DRB_pdcp_config
->
rlc_UM
=
NULL
;
DRB_pdcp_config
->
rlc_UM
=
NULL
;
/*
a
void gcc warnings */
/*
A
void gcc warnings */
(
void
)
PDCP_rlc_AM
;
(
void
)
PDCP_rlc_AM
;
(
void
)
PDCP_rlc_UM
;
(
void
)
PDCP_rlc_UM
;
#ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT
#ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT
PDCP_rlc_AM
=
CALLOC
(
1
,
sizeof
(
*
PDCP_rlc_AM
));
PDCP_rlc_AM
=
CALLOC
(
1
,
sizeof
(
*
PDCP_rlc_AM
));
DRB_pdcp_config
->
rlc_AM
=
PDCP_rlc_AM
;
DRB_pdcp_config
->
rlc_AM
=
PDCP_rlc_AM
;
...
@@ -3805,52 +3816,97 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3805,52 +3816,97 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
DRB_pdcp_config
->
rlc_UM
=
PDCP_rlc_UM
;
DRB_pdcp_config
->
rlc_UM
=
PDCP_rlc_UM
;
PDCP_rlc_UM
->
pdcp_SN_Size
=
LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits
;
PDCP_rlc_UM
->
pdcp_SN_Size
=
LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits
;
#endif
#endif
DRB_pdcp_config
->
headerCompression
.
present
=
LTE_PDCP_Config__headerCompression_PR_notUsed
;
DRB_pdcp_config
->
headerCompression
.
present
=
LTE_PDCP_Config__headerCompression_PR_notUsed
;
DRB_lchan_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_lchan_config
));
DRB_lchan_config
=
CALLOC
(
1
,
sizeof
(
*
DRB_lchan_config
));
DRB_config
->
logicalChannelConfig
=
DRB_lchan_config
;
DRB_config
->
logicalChannelConfig
=
DRB_lchan_config
;
DRB_ul_SpecificParameters
=
CALLOC
(
1
,
sizeof
(
*
DRB_ul_SpecificParameters
));
DRB_ul_SpecificParameters
=
CALLOC
(
1
,
sizeof
(
*
DRB_ul_SpecificParameters
));
DRB_lchan_config
->
ul_SpecificParameters
=
DRB_ul_SpecificParameters
;
DRB_lchan_config
->
ul_SpecificParameters
=
DRB_ul_SpecificParameters
;
DRB_ul_SpecificParameters
->
priority
=
12
;
// lower priority than srb1, srb2 and other dedicated bearer
DRB_ul_SpecificParameters
->
priority
=
12
;
// lower priority than srb1, srb2 and other dedicated bearer
DRB_ul_SpecificParameters
->
prioritisedBitRate
=
LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8
;
DRB_ul_SpecificParameters
->
prioritisedBitRate
=
LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8
;
// LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
//LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
DRB_ul_SpecificParameters
->
bucketSizeDuration
=
LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50
;
DRB_ul_SpecificParameters
->
bucketSizeDuration
=
LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50
;
// LCG for DTCH can take the value from 1 to 3 as defined in 36331: normally controlled by upper layers (like RRM)
// LCG for DTCH can take the value from 1 to 3 as defined in 36331: normally controlled by upper layers (like RRM)
logicalchannelgroup_drb
=
CALLOC
(
1
,
sizeof
(
long
));
logicalchannelgroup_drb
=
CALLOC
(
1
,
sizeof
(
long
));
*
logicalchannelgroup_drb
=
1
;
*
logicalchannelgroup_drb
=
1
;
DRB_ul_SpecificParameters
->
logicalChannelGroup
=
logicalchannelgroup_drb
;
DRB_ul_SpecificParameters
->
logicalChannelGroup
=
logicalchannelgroup_drb
;
ASN_SEQUENCE_ADD
(
&
(
*
DRB_configList
)
->
list
,
DRB_config
);
ASN_SEQUENCE_ADD
(
&
(
*
DRB_configList
)
->
list
,
DRB_config
);
ASN_SEQUENCE_ADD
(
&
(
*
DRB_configList2
)
->
list
,
DRB_config
);
ASN_SEQUENCE_ADD
(
&
(
*
DRB_configList2
)
->
list
,
DRB_config
);
//ue_context_pP->ue_context.DRB_configList2[0] = &(*DRB_configList);
/* MAC Main Config */
// The different parts of MAC main config are set below
mac_MainConfig
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
));
mac_MainConfig
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
));
// ue_context_pP->ue_context.mac_MainConfig = LTE_MAC
_MainConfig;
ue_context_pP
->
ue_context
.
mac_MainConfig
=
mac
_MainConfig
;
mac_MainConfig
->
ul_SCH_Config
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
->
ul_SCH_Config
));
mac_MainConfig
->
ul_SCH_Config
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
->
ul_SCH_Config
));
maxHARQ_Tx
=
CALLOC
(
1
,
sizeof
(
long
));
maxHARQ_Tx
=
CALLOC
(
1
,
sizeof
(
long
));
*
maxHARQ_Tx
=
LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5
;
*
maxHARQ_Tx
=
LTE_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5
;
mac_MainConfig
->
ul_SCH_Config
->
maxHARQ_Tx
=
maxHARQ_Tx
;
mac_MainConfig
->
ul_SCH_Config
->
maxHARQ_Tx
=
maxHARQ_Tx
;
/* BSR reconfiguration */
periodicBSR_Timer
=
CALLOC
(
1
,
sizeof
(
long
));
periodicBSR_Timer
=
CALLOC
(
1
,
sizeof
(
long
));
*
periodicBSR_Timer
=
LTE_PeriodicBSR_Timer_r12_sf64
;
*
periodicBSR_Timer
=
LTE_PeriodicBSR_Timer_r12_sf64
;
//LTE_PeriodicBSR_Timer_r12_infinity; // LTE_PeriodicBSR_Timer_r12_sf64; // LTE_PeriodicBSR_Timer_r12_sf20
mac_MainConfig
->
ul_SCH_Config
->
periodicBSR_Timer
=
periodicBSR_Timer
;
mac_MainConfig
->
ul_SCH_Config
->
periodicBSR_Timer
=
periodicBSR_Timer
;
mac_MainConfig
->
ul_SCH_Config
->
retxBSR_Timer
=
LTE_RetxBSR_Timer_r12_sf320
;
mac_MainConfig
->
ul_SCH_Config
->
retxBSR_Timer
=
LTE_RetxBSR_Timer_r12_sf320
;
// LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf5120
mac_MainConfig
->
ul_SCH_Config
->
ttiBundling
=
0
;
// FALSE
mac_MainConfig
->
ul_SCH_Config
->
ttiBundling
=
0
;
// FALSE
mac_MainConfig
->
timeAlignmentTimerDedicated
=
LTE_TimeAlignmentTimer_infinity
;
mac_MainConfig
->
timeAlignmentTimerDedicated
=
LTE_TimeAlignmentTimer_infinity
;
mac_MainConfig
->
drx_Config
=
NULL
;
/* PHR reconfiguration */
mac_MainConfig
->
phr_Config
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
->
phr_Config
));
mac_MainConfig
->
phr_Config
=
CALLOC
(
1
,
sizeof
(
*
mac_MainConfig
->
phr_Config
));
mac_MainConfig
->
phr_Config
->
present
=
LTE_MAC_MainConfig__phr_Config_PR_setup
;
mac_MainConfig
->
phr_Config
->
present
=
LTE_MAC_MainConfig__phr_Config_PR_setup
;
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
periodicPHR_Timer
=
LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20
;
// sf20 = 20 subframes
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
periodicPHR_Timer
=
LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf500
;
// sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_infinity
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
prohibitPHR_Timer
=
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20
;
// sf20 = 20 subframes
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
prohibitPHR_Timer
=
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf200
;
// sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf1000
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
dl_PathlossChange
=
LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1
;
// Value dB1 =1 dB, dB3 = 3 dB
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
dl_PathlossChange
=
LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3
;
// Value dB1 =1 dB, dB3 = 3 dB
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
if
(
!
NODE_IS_CU
(
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
node_type
))
{
/* CDRX Configuration */
// Need to check if UE is a BR UE
rnti_t
rnti
=
ue_context_pP
->
ue_id_rnti
;
module_id_t
module_id
=
ctxt_pP
->
module_id
;
int
UE_id
=
find_UE_id
(
module_id
,
rnti
);
eNB_MAC_INST
*
mac
=
RC
.
mac
[
module_id
];
UE_list_t
*
UE_list
=
&
(
mac
->
UE_list
);
if
(
UE_id
!=
-
1
)
{
if
((
rrc_inst
->
carrier
[
cc_id
].
sib1
->
tdd_Config
==
NULL
)
&&
(
UE_list
->
UE_template
[
ue_context_pP
->
ue_context
.
primaryCC_id
][
UE_id
].
rach_resource_type
==
0
))
{
// CDRX can be only configured in case of FDD and non BR UE (09/04/19)
LOG_D
(
RRC
,
"Processing the DRX configuration in RRC Connection Reconfiguration
\n
"
);
/* Process the IE drx_Config */
if
(
cc_id
<
MAX_NUM_CCs
)
{
mac_MainConfig
->
drx_Config
=
do_DrxConfig
(
module_id
,
cc_id
,
&
rrc_inst
->
configuration
,
UEcap
);
// drx_Config IE
}
else
{
LOG_E
(
RRC
,
"Invalid CC_id for DRX configuration
\n
"
);
}
/* Set timers and thresholds values in local MAC context of UE */
eNB_Config_Local_DRX
(
module_id
,
ue_context_pP
->
ue_id_rnti
,
mac_MainConfig
->
drx_Config
);
LOG_D
(
RRC
,
"DRX configured in mac main config for RRC Connection Reconfiguration
\n
"
);
}
else
{
// CDRX not implemented for TDD and LTE-M (09/04/19)
mac_MainConfig
->
drx_Config
=
NULL
;
}
}
else
{
// UE_id invalid
LOG_E
(
RRC
,
"Invalid UE_id found!
\n
"
);
mac_MainConfig
->
drx_Config
=
NULL
;
}
}
else
{
// No CDRX with the CU/DU split in this version
LOG_E
(
RRC
,
"CU/DU split activated
\n
"
);
mac_MainConfig
->
drx_Config
=
NULL
;
}
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
sr_ProhibitTimer_r9
=
CALLOC
(
1
,
sizeof
(
long
));
sr_ProhibitTimer_r9
=
CALLOC
(
1
,
sizeof
(
long
));
*
sr_ProhibitTimer_r9
=
0
;
// SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR
*
sr_ProhibitTimer_r9
=
0
;
// SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2
= 2*SR
mac_MainConfig
->
ext1
=
CALLOC
(
1
,
sizeof
(
struct
LTE_MAC_MainConfig__ext1
));
mac_MainConfig
->
ext1
=
CALLOC
(
1
,
sizeof
(
struct
LTE_MAC_MainConfig__ext1
));
mac_MainConfig
->
ext1
->
sr_ProhibitTimer_r9
=
sr_ProhibitTimer_r9
;
mac_MainConfig
->
ext1
->
sr_ProhibitTimer_r9
=
sr_ProhibitTimer_r9
;
//sps_RA_ConfigList_rlola = NULL;
#endif
#endif
//change the transmission mode for the primary component carrier
//
change the transmission mode for the primary component carrier
//TODO: add codebook subset restriction here
//
TODO: add codebook subset restriction here
//TODO: change TM for secondary CC in SCelltoaddmodlist
//
TODO: change TM for secondary CC in SCelltoaddmodlist
if
(
*
physicalConfigDedicated
)
{
if
(
*
physicalConfigDedicated
)
{
if
((
*
physicalConfigDedicated
)
->
antennaInfo
)
{
if
((
*
physicalConfigDedicated
)
->
antennaInfo
)
{
(
*
physicalConfigDedicated
)
->
antennaInfo
->
choice
.
explicitValue
.
transmissionMode
=
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
;
(
*
physicalConfigDedicated
)
->
antennaInfo
->
choice
.
explicitValue
.
transmissionMode
=
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
;
...
@@ -3897,19 +3953,20 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3897,19 +3953,20 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LOG_E
(
RRC
,
"antenna_info not present in physical_config_dedicated. Not reconfiguring!
\n
"
);
LOG_E
(
RRC
,
"antenna_info not present in physical_config_dedicated. Not reconfiguring!
\n
"
);
}
}
/* CSI
Configuration through RRC
*/
/* CSI
RRC Reconfiguration
*/
if
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
!=
NULL
)
{
if
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
!=
NULL
)
{
if
((
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm4
)
||
if
((
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm4
)
||
(
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm5
)
||
(
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm5
)
||
(
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm6
))
{
(
rrc_inst
->
configuration
.
radioresourceconfig
[
0
].
ue_TransmissionMode
==
LTE_AntennaInfoDedicated__transmissionMode_tm6
))
{
//feedback mode needs to be set as well
//TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable
// feedback mode needs to be set as well
LOG_I
(
RRC
,
"Setting cqi aperiodic reporting mode to rm31 (hardcoded)
\n
"
);
// TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable
LOG_I
(
RRC
,
"Setting cqi reporting mode to rm31 (hardcoded)
\n
"
);
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
*
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
->
cqi_ReportModeAperiodic
)
=
LTE_CQI_ReportModeAperiodic_rm31
;
*
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
->
cqi_ReportModeAperiodic
)
=
LTE_CQI_ReportModeAperiodic_rm31
;
// HLC CQI, single PMI
#else
#else
*
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
->
cqi_ReportModeAperiodic
)
=
LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm31
;
// HLC CQI, no
PMI
*
((
*
physicalConfigDedicated
)
->
cqi_ReportConfig
->
cqi_ReportModeAperiodic
)
=
LTE_CQI_ReportConfig__cqi_ReportModeAperiodic_rm31
;
// HLC CQI, single
PMI
#endif
#endif
}
}
}
else
{
}
else
{
...
@@ -3927,9 +3984,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3927,9 +3984,33 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
MeasId0
->
measObjectId
=
1
;
MeasId0
->
measObjectId
=
1
;
MeasId0
->
reportConfigId
=
1
;
MeasId0
->
reportConfigId
=
1
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId0
);
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId0
);
/*
MeasId1
=
CALLOC
(
1
,
sizeof
(
*
MeasId1
));
* Add one EUTRA Measurement Object
MeasId1
->
measId
=
2
;
*/
MeasId1
->
measObjectId
=
1
;
MeasId1
->
reportConfigId
=
2
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId1
);
MeasId2
=
CALLOC
(
1
,
sizeof
(
*
MeasId2
));
MeasId2
->
measId
=
3
;
MeasId2
->
measObjectId
=
1
;
MeasId2
->
reportConfigId
=
3
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId2
);
MeasId3
=
CALLOC
(
1
,
sizeof
(
*
MeasId3
));
MeasId3
->
measId
=
4
;
MeasId3
->
measObjectId
=
1
;
MeasId3
->
reportConfigId
=
4
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId3
);
MeasId4
=
CALLOC
(
1
,
sizeof
(
*
MeasId4
));
MeasId4
->
measId
=
5
;
MeasId4
->
measObjectId
=
1
;
MeasId4
->
reportConfigId
=
5
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId4
);
MeasId5
=
CALLOC
(
1
,
sizeof
(
*
MeasId5
));
MeasId5
->
measId
=
6
;
MeasId5
->
measObjectId
=
1
;
MeasId5
->
reportConfigId
=
6
;
ASN_SEQUENCE_ADD
(
&
MeasId_list
->
list
,
MeasId5
);
// LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measIdToAddModList = MeasId_list;
// Add one EUTRA Measurement Object
MeasObj_list
=
CALLOC
(
1
,
sizeof
(
*
MeasObj_list
));
MeasObj_list
=
CALLOC
(
1
,
sizeof
(
*
MeasObj_list
));
memset
((
void
*
)
MeasObj_list
,
0
,
sizeof
(
*
MeasObj_list
));
memset
((
void
*
)
MeasObj_list
,
0
,
sizeof
(
*
MeasObj_list
));
// Configure MeasObject
// Configure MeasObject
...
@@ -3937,64 +4018,161 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -3937,64 +4018,161 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
memset
((
void
*
)
MeasObj
,
0
,
sizeof
(
*
MeasObj
));
memset
((
void
*
)
MeasObj
,
0
,
sizeof
(
*
MeasObj
));
MeasObj
->
measObjectId
=
1
;
MeasObj
->
measObjectId
=
1
;
MeasObj
->
measObject
.
present
=
LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA
;
MeasObj
->
measObject
.
present
=
LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
carrierFreq
=
3350
;
//band 7, 2.68GHz
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
carrierFreq
=
//MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = 36090; //band 33, 1.909GHz
to_earfcn_DL
(
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
configuration
.
eutra_band
[
0
],
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
configuration
.
downlink_frequency
[
0
],
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
configuration
.
N_RB_DL
[
0
]);
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
allowedMeasBandwidth
=
LTE_AllowedMeasBandwidth_mbw25
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
allowedMeasBandwidth
=
LTE_AllowedMeasBandwidth_mbw25
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
presenceAntennaPort1
=
1
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
presenceAntennaPort1
=
1
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
buf
=
CALLOC
(
1
,
sizeof
(
uint8_t
));
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
buf
=
CALLOC
(
1
,
sizeof
(
uint8_t
));
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
buf
[
0
]
=
0
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
buf
[
0
]
=
0
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
size
=
1
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
size
=
1
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
bits_unused
=
6
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
neighCellConfig
.
bits_unused
=
6
;
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
offsetFreq
=
NULL
;
// Default is 15 or 0dB
*
(
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
offsetFreq
)
=
ue_context_pP
->
ue_context
.
measurement_info
->
offsetFreq
;
// Default is 15 or 0dB
if
(
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
num_neigh_cells
>
0
)
{
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
cellsToAddModList
=
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
cellsToAddModList
=
(
LTE_CellsToAddModList_t
*
)
CALLOC
(
1
,
sizeof
(
*
CellsToAddModList
));
(
LTE_CellsToAddModList_t
*
)
CALLOC
(
1
,
sizeof
(
*
CellsToAddModList
));
CellsToAddModList
=
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
cellsToAddModList
;
CellsToAddModList
=
MeasObj
->
measObject
.
choice
.
measObjectEUTRA
.
cellsToAddModList
;
}
// Add adjacent cell lists (6 per eNB)
/* TODO: Extend to multiple carriers */
for
(
i
=
0
;
i
<
6
;
i
++
)
{
// Add adjacent cell lists (max 6 per eNB)
for
(
i
=
0
;
i
<
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
num_neigh_cells
;
i
++
)
{
CellToAdd
=
(
LTE_CellsToAddMod_t
*
)
CALLOC
(
1
,
sizeof
(
*
CellToAdd
));
CellToAdd
=
(
LTE_CellsToAddMod_t
*
)
CALLOC
(
1
,
sizeof
(
*
CellToAdd
));
CellToAdd
->
cellIndex
=
i
+
1
;
CellToAdd
->
cellIndex
=
i
+
1
;
CellToAdd
->
physCellId
=
get_adjacent_cell_id
(
ctxt_pP
->
module_id
,
i
);
CellToAdd
->
physCellId
=
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
neigh_cells_id
[
i
][
0
];
//
get_adjacent_cell_id(ctxt_pP->module_id, i);
CellToAdd
->
cellIndividualOffset
=
LTE_Q_OffsetRange_dB0
;
CellToAdd
->
cellIndividualOffset
=
ue_context_pP
->
ue_context
.
measurement_info
->
cellIndividualOffset
[
i
+
1
]
;
ASN_SEQUENCE_ADD
(
&
CellsToAddModList
->
list
,
CellToAdd
);
ASN_SEQUENCE_ADD
(
&
CellsToAddModList
->
list
,
CellToAdd
);
}
}
ASN_SEQUENCE_ADD
(
&
MeasObj_list
->
list
,
MeasObj
);
ASN_SEQUENCE_ADD
(
&
MeasObj_list
->
list
,
MeasObj
);
// LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list;
// LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list;
// Report Configurations for periodical, A1-A5 events
// Report Configurations for periodical, A1-A5 events
/* RRC Strategy Measurement */
if
(
strcmp
(
"one_shot"
,
trig_param
->
trigger_policy
)
==
0
)
{
trig_param
->
report_interval
=
0
;
trig_param
->
report_amount
=
0
;
}
else
if
(
strcmp
(
"event_driven"
,
trig_param
->
trigger_policy
)
==
0
)
{
trig_param
->
report_interval
=
6
;
trig_param
->
report_amount
=
2
;
}
else
if
(
strcmp
(
"periodical"
,
trig_param
->
trigger_policy
)
==
0
)
{
trig_param
->
report_interval
=
1
;
trig_param
->
report_amount
=
7
;
}
else
{
LOG_E
(
FLEXRAN_AGENT
,
"There is something wrong on RRC agent!"
);
}
ReportConfig_list
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_list
));
ReportConfig_list
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_list
));
ReportConfig_per
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_per
));
ReportConfig_per
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_per
));
// Periodical Measurement Report
ReportConfig_A1
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A1
));
ReportConfig_A2
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A2
));
ReportConfig_A3
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A3
));
ReportConfig_A4
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A4
));
ReportConfig_A5
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A5
));
ReportConfig_per
->
reportConfigId
=
1
;
ReportConfig_per
->
reportConfigId
=
1
;
ReportConfig_per
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_per
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_periodical
;
LTE_ReportConfigEUTRA__triggerType_PR_periodical
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
periodical
.
purpose
=
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
periodical
.
purpose
=
LTE_ReportConfigEUTRA__triggerType__periodical__purpose_reportStrongestCells
;
LTE_ReportConfigEUTRA__triggerType__periodical__purpose_reportStrongestCells
;
// ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.timeToTrigger = TimeToTrigger_ms40;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
trig_param
->
report_interval
;
//ReportInterval_ms2048; // RRC counter frame- ms1024 is 1ms
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
trig_param
->
report_amount
;
//ReportConfigEUTRA__reportAmount_r2; // put r1 to see once, r2 for 2 times and ...
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_per
);
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_per
);
ReportConfig_A1
->
reportConfigId
=
2
;
ReportConfig_A1
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_event
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
present
=
LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA1
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA1
.
a1_Threshold
.
present
=
LTE_ThresholdEUTRA_PR_threshold_RSRP
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA1
.
a1_Threshold
.
choice
.
threshold_RSRP
=
10
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_A1
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_A1
);
//if (ho_state == 1 /*HO_MEASURMENT */ ) {
LOG_I
(
RRC
,
"[eNB %d] frame %d: requesting A2, A3, A4, and A5 event reporting
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
);
ReportConfig_A2
->
reportConfigId
=
3
;
ReportConfig_A2
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_event
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
present
=
LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA2
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA2
.
a2_Threshold
.
present
=
LTE_ThresholdEUTRA_PR_threshold_RSRP
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA2
.
a2_Threshold
.
choice
.
threshold_RSRP
=
10
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_A2
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_A2
);
ReportConfig_A3
->
reportConfigId
=
4
;
ReportConfig_A3
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_event
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
present
=
LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA3
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA3
.
a3_Offset
=
ue_context_pP
->
ue_context
.
measurement_info
->
events
->
a3_event
->
a3_offset
;
//10;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA3
.
reportOnLeave
=
ue_context_pP
->
ue_context
.
measurement_info
->
events
->
a3_event
->
reportOnLeave
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
ue_context_pP
->
ue_context
.
measurement_info
->
events
->
a3_event
->
maxReportCells
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
hysteresis
=
ue_context_pP
->
ue_context
.
measurement_info
->
events
->
a3_event
->
hysteresis
;
ReportConfig_A3
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
timeToTrigger
=
ue_context_pP
->
ue_context
.
measurement_info
->
events
->
a3_event
->
timeToTrigger
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_A3
);
ReportConfig_A4
->
reportConfigId
=
5
;
ReportConfig_A4
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_event
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
present
=
LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA4
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA4
.
a4_Threshold
.
present
=
LTE_ThresholdEUTRA_PR_threshold_RSRP
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA4
.
a4_Threshold
.
choice
.
threshold_RSRP
=
10
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_A4
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_A4
);
ReportConfig_A5
->
reportConfigId
=
6
;
ReportConfig_A5
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
LTE_ReportConfigEUTRA__triggerType_PR_event
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
present
=
LTE_ReportConfigEUTRA__triggerType__event__eventId_PR_eventA5
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA5
.
a5_Threshold1
.
present
=
LTE_ThresholdEUTRA_PR_threshold_RSRP
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA5
.
a5_Threshold2
.
present
=
LTE_ThresholdEUTRA_PR_threshold_RSRP
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA5
.
a5_Threshold1
.
choice
.
threshold_RSRP
=
10
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
choice
.
event
.
eventId
.
choice
.
eventA5
.
a5_Threshold2
.
choice
.
threshold_RSRP
=
10
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerQuantity
=
LTE_ReportConfigEUTRA__triggerQuantity_rsrp
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportQuantity
=
LTE_ReportConfigEUTRA__reportQuantity_both
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
maxReportCells
=
2
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_A5
->
reportConfig
.
choice
.
reportConfigEUTRA
.
reportAmount
=
LTE_ReportConfigEUTRA__reportAmount_infinity
;
ASN_SEQUENCE_ADD
(
&
ReportConfig_list
->
list
,
ReportConfig_A5
);
// LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->reportConfigToAddModList = ReportConfig_list;
rsrp
=
CALLOC
(
1
,
sizeof
(
LTE_RSRP_Range_t
));
*
rsrp
=
20
;
Sparams
=
CALLOC
(
1
,
sizeof
(
*
Sparams
));
Sparams
->
present
=
LTE_MeasConfig__speedStatePars_PR_setup
;
Sparams
->
choice
.
setup
.
timeToTrigger_SF
.
sf_High
=
LTE_SpeedStateScaleFactors__sf_Medium_oDot75
;
Sparams
->
choice
.
setup
.
timeToTrigger_SF
.
sf_Medium
=
LTE_SpeedStateScaleFactors__sf_High_oDot5
;
Sparams
->
choice
.
setup
.
mobilityStateParameters
.
n_CellChangeHigh
=
10
;
Sparams
->
choice
.
setup
.
mobilityStateParameters
.
n_CellChangeMedium
=
5
;
Sparams
->
choice
.
setup
.
mobilityStateParameters
.
t_Evaluation
=
LTE_MobilityStateParameters__t_Evaluation_s60
;
Sparams
->
choice
.
setup
.
mobilityStateParameters
.
t_HystNormal
=
LTE_MobilityStateParameters__t_HystNormal_s120
;
quantityConfig
=
CALLOC
(
1
,
sizeof
(
*
quantityConfig
));
quantityConfig
=
CALLOC
(
1
,
sizeof
(
*
quantityConfig
));
memset
((
void
*
)
quantityConfig
,
0
,
sizeof
(
*
quantityConfig
));
memset
((
void
*
)
quantityConfig
,
0
,
sizeof
(
*
quantityConfig
));
quantityConfig
->
quantityConfigEUTRA
=
CALLOC
(
1
,
sizeof
(
struct
LTE_QuantityConfigEUTRA
));
quantityConfig
->
quantityConfigEUTRA
=
CALLOC
(
1
,
sizeof
(
struct
LTE_QuantityConfigEUTRA
));
...
@@ -4006,8 +4184,9 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4006,8 +4184,9 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
CALLOC
(
1
,
sizeof
(
*
(
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRP
)));
CALLOC
(
1
,
sizeof
(
*
(
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRP
)));
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
=
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
=
CALLOC
(
1
,
sizeof
(
*
(
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
)));
CALLOC
(
1
,
sizeof
(
*
(
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
)));
*
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRP
=
LTE_FilterCoefficient_fc4
;
*
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRP
=
ue_context_pP
->
ue_context
.
measurement_info
->
filterCoefficientRSRP
;
*
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
=
LTE_FilterCoefficient_fc4
;
*
quantityConfig
->
quantityConfigEUTRA
->
filterCoefficientRSRQ
=
ue_context_pP
->
ue_context
.
measurement_info
->
filterCoefficientRSRQ
;
/* Initialize NAS list */
/* Initialize NAS list */
dedicatedInfoNASList
=
CALLOC
(
1
,
sizeof
(
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
));
dedicatedInfoNASList
=
CALLOC
(
1
,
sizeof
(
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
));
...
@@ -4023,12 +4202,13 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4023,12 +4202,13 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
}
}
/* TODO parameters yet to process ... */
/* TODO parameters yet to process ... */
//
{
{
// ue_context_pP->ue_context.e_rab[i].param.qos;
// ue_context_pP->ue_context.e_rab[i].param.qos;
// ue_context_pP->ue_context.e_rab[i].param.sgw_addr;
// ue_context_pP->ue_context.e_rab[i].param.sgw_addr;
// ue_context_pP->ue_context.e_rab[i].param.gtp_teid;
// ue_context_pP->ue_context.e_rab[i].param.gtp_teid;
// }
}
/* TODO should test if e RAB are Ok before! */
/* TODO should test if e RAB are OK before! */
ue_context_pP
->
ue_context
.
e_rab
[
i
].
status
=
E_RAB_STATUS_DONE
;
ue_context_pP
->
ue_context
.
e_rab
[
i
].
status
=
E_RAB_STATUS_DONE
;
LOG_D
(
RRC
,
"setting the status for the default DRB (index %d) to (%d,%s)
\n
"
,
LOG_D
(
RRC
,
"setting the status for the default DRB (index %d) to (%d,%s)
\n
"
,
i
,
ue_context_pP
->
ue_context
.
e_rab
[
i
].
status
,
"E_RAB_STATUS_DONE"
);
i
,
ue_context_pP
->
ue_context
.
e_rab
[
i
].
status
,
"E_RAB_STATUS_DONE"
);
...
@@ -4044,38 +4224,35 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4044,38 +4224,35 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
RC
.
rrc
[
ENB_INSTANCE_TO_MODULE_ID
(
ctxt_pP
->
instance
)]
->
configuration
.
enable_measurement_reports
;
RC
.
rrc
[
ENB_INSTANCE_TO_MODULE_ID
(
ctxt_pP
->
instance
)]
->
configuration
.
enable_measurement_reports
;
memset
(
buffer
,
0
,
RRC_BUF_SIZE
);
memset
(
buffer
,
0
,
RRC_BUF_SIZE
);
size
=
do_RRCConnectionReconfiguration
(
ctxt_pP
,
size
=
do_RRCConnectionReconfiguration
(
ctxt_pP
,
buffer
,
buffer
,
xid
,
//Transaction_id,
xid
,
// Transaction_id,
(
LTE_SRB_ToAddModList_t
*
)
NULL
,
// SRB_configList
(
LTE_SRB_ToAddModList_t
*
)
*
SRB_configList2
,
// SRB_configList
(
LTE_DRB_ToAddModList_t
*
)
NULL
,
(
LTE_DRB_ToAddModList_t
*
)
*
DRB_configList
,
(
LTE_DRB_ToReleaseList_t
*
)
NULL
,
// DRB2_list,
(
LTE_DRB_ToReleaseList_t
*
)
NULL
,
// DRB2_list,
(
struct
LTE_SPS_Config
*
)
NULL
,
// *sps_Config,
(
struct
LTE_SPS_Config
*
)
NULL
,
// *sps_Config,
(
struct
LTE_PhysicalConfigDedicated
*
)
*
physicalConfigDedicated
,
(
struct
LTE_PhysicalConfigDedicated
*
)
*
physicalConfigDedicated
,
// #ifdef EXMIMO_IOT
measurements_enabled
?
(
LTE_MeasObjectToAddModList_t
*
)
MeasObj_list
:
NULL
,
// NULL, NULL, NULL,NULL,
measurements_enabled
?
(
LTE_ReportConfigToAddModList_t
*
)
ReportConfig_list
:
NULL
,
// #else
measurements_enabled
?
(
LTE_QuantityConfig_t
*
)
quantityConfig
:
NULL
,
measurements_enabled
?
(
LTE_MeasObjectToAddModList_t
*
)
MeasObj_list
:
NULL
,
measurements_enabled
?
(
LTE_MeasIdToAddModList_t
*
)
MeasId_list
:
NULL
,
measurements_enabled
?
(
LTE_ReportConfigToAddModList_t
*
)
ReportConfig_list
:
NULL
,
(
LTE_MAC_MainConfig_t
*
)
mac_MainConfig
,
measurements_enabled
?
(
LTE_QuantityConfig_t
*
)
quantityConfig
:
NULL
,
(
LTE_MeasGapConfig_t
*
)
NULL
,
measurements_enabled
?
(
LTE_MeasIdToAddModList_t
*
)
MeasId_list
:
NULL
,
(
LTE_MobilityControlInfo_t
*
)
NULL
,
// #endif
(
LTE_SecurityConfigHO_t
*
)
NULL
,
(
LTE_MAC_MainConfig_t
*
)
mac_MainConfig
,
(
struct
LTE_MeasConfig__speedStatePars
*
)
Sparams
,
(
LTE_MeasGapConfig_t
*
)
NULL
,
(
LTE_RSRP_Range_t
*
)
rsrp
,
(
LTE_MobilityControlInfo_t
*
)
NULL
,
(
LTE_C_RNTI_t
*
)
cba_RNTI
,
(
LTE_SecurityConfigHO_t
*
)
NULL
,
(
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
*
)
dedicatedInfoNASList
,
(
struct
LTE_MeasConfig__speedStatePars
*
)
Sparams
,
(
LTE_SL_CommConfig_r12_t
*
)
NULL
,
(
LTE_RSRP_Range_t
*
)
rsrp
,
(
LTE_SL_DiscConfig_r12_t
*
)
NULL
(
LTE_C_RNTI_t
*
)
cba_RNTI
,
(
struct
LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList
*
)
dedicatedInfoNASList
,
(
LTE_SL_CommConfig_r12_t
*
)
NULL
,
(
LTE_SL_DiscConfig_r12_t
*
)
NULL
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
,
(
LTE_SCellToAddMod_r10_t
*
)
NULL
,
(
LTE_SCellToAddMod_r10_t
*
)
NULL
#endif
#endif
);
);
LOG_DUMPMSG
(
RRC
,
DEBUG_RRC
,(
char
*
)
buffer
,
size
,
"[MSG] RRC Connection Reconfiguration
\n
"
);
LOG_DUMPMSG
(
RRC
,
DEBUG_RRC
,(
char
*
)
buffer
,
size
,
"[MSG] RRC Connection Reconfiguration
\n
"
);
/* Free all NAS PDUs */
/* Free all NAS PDUs */
for
(
i
=
0
;
i
<
ue_context_pP
->
ue_context
.
nb_of_e_rabs
;
i
++
)
{
for
(
i
=
0
;
i
<
ue_context_pP
->
ue_context
.
nb_of_e_rabs
;
i
++
)
{
...
@@ -4086,14 +4263,22 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4086,14 +4263,22 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
}
}
}
}
LOG_I
(
RRC
,
LOG_I
(
RRC
,
"[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate LTE_RRCConnectionReconfiguration (bytes %d, UE id %x)
\n
"
,
"[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate LTE_RRCConnectionReconfiguration (bytes %d, UE id %x)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
size
,
ue_context_pP
->
ue_context
.
rnti
);
ctxt_pP
->
frame
,
LOG_D
(
RRC
,
size
,
"[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]
\n
"
,
ue_context_pP
->
ue_context
.
rnti
);
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
size
,
ue_context_pP
->
ue_context
.
rnti
,
rrc_eNB_mui
,
ctxt_pP
->
module_id
,
DCCH
);
MSC_LOG_TX_MESSAGE
(
LOG_D
(
RRC
,
"[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]
\n
"
,
MSC_RRC_ENB
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
size
,
ue_context_pP
->
ue_context
.
rnti
,
rrc_eNB_mui
,
ctxt_pP
->
module_id
,
DCCH
);
MSC_LOG_TX_MESSAGE
(
MSC_RRC_ENB
,
MSC_RRC_UE
,
MSC_RRC_UE
,
buffer
,
buffer
,
size
,
size
,
...
@@ -4102,8 +4287,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4102,8 +4287,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
ue_context_pP
->
ue_context
.
rnti
,
ue_context_pP
->
ue_context
.
rnti
,
rrc_eNB_mui
,
rrc_eNB_mui
,
size
);
size
);
rrc_data_req
(
ctxt_pP
,
rrc_data_req
(
ctxt_pP
,
DCCH
,
DCCH
,
rrc_eNB_mui
++
,
rrc_eNB_mui
++
,
SDU_CONFIRM_NO
,
SDU_CONFIRM_NO
,
...
@@ -4133,7 +4318,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
...
@@ -4133,7 +4318,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
mac_MainConfig
=
NULL
;
mac_MainConfig
=
NULL
;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
int
int
rrc_eNB_generate_RRCConnectionReconfiguration_SCell
(
rrc_eNB_generate_RRCConnectionReconfiguration_SCell
(
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/LTE/rrc_proto.h
View file @
1b90c4a0
...
@@ -306,8 +306,7 @@ void
...
@@ -306,8 +306,7 @@ void
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration
(
flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
const
uint8_t
ho_state
,
const
uint8_t
ho_state
agent_reconf_rrc
*
trig_param
);
);
void
void
rrc_eNB_generate_HO_RRCConnectionReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_eNB_generate_HO_RRCConnectionReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
...
...
This diff is collapsed.
Click to expand it.
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