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
8e71ca86
Commit
8e71ca86
authored
May 11, 2023
by
Raphael Defosseux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_UE_RRC_cleanup' into integration_2023_w19
parents
211fcb21
88bcbefe
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
303 additions
and
593 deletions
+303
-593
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+2
-2
openair2/RRC/NR/nr_rrc_common.c
openair2/RRC/NR/nr_rrc_common.c
+2
-3
openair2/RRC/NR/nr_rrc_common.h
openair2/RRC/NR/nr_rrc_common.h
+91
-0
openair2/RRC/NR/nr_rrc_defs.h
openair2/RRC/NR/nr_rrc_defs.h
+3
-87
openair2/RRC/NR/nr_rrc_proto.h
openair2/RRC/NR/nr_rrc_proto.h
+0
-1
openair2/RRC/NR/nr_rrc_types.h
openair2/RRC/NR/nr_rrc_types.h
+0
-64
openair2/RRC/NR_UE/L2_interface_ue.c
openair2/RRC/NR_UE/L2_interface_ue.c
+5
-8
openair2/RRC/NR_UE/rrc_UE.c
openair2/RRC/NR_UE/rrc_UE.c
+108
-239
openair2/RRC/NR_UE/rrc_defs.h
openair2/RRC/NR_UE/rrc_defs.h
+91
-70
openair2/RRC/NR_UE/rrc_list.h
openair2/RRC/NR_UE/rrc_list.h
+0
-114
openair2/RRC/NR_UE/rrc_proto.h
openair2/RRC/NR_UE/rrc_proto.h
+1
-5
No files found.
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
8e71ca86
...
...
@@ -53,6 +53,7 @@
#include <executables/softmodem-common.h>
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
#include "LAYER2/RLC/rlc.h"
//#define SRS_DEBUG
...
...
@@ -1153,7 +1154,6 @@ void nr_ue_ul_scheduler(nr_uplink_indication_t *ul_info)
bool
nr_update_bsr
(
module_id_t
module_idP
,
frame_t
frameP
,
slot_t
slotP
,
uint8_t
gNB_index
)
{
mac_rlc_status_resp_t
rlc_status
;
bool
bsr_regular_triggered
=
false
;
uint8_t
lcid
;
uint8_t
lcgid
;
...
...
@@ -1196,7 +1196,7 @@ bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t
lcgid_buffer_remain
[
lcgid
]
+=
mac
->
scheduling_info
.
LCID_buffer_remain
[
lcid
];
}
rlc_status
=
mac_rlc_status_ind
(
module_idP
,
mac
->
crnti
,
gNB_index
,
frameP
,
slotP
,
ENB_FLAG_NO
,
MBMS_FLAG_NO
,
lcid
,
0
,
0
);
mac_rlc_status_resp_t
rlc_status
=
mac_rlc_status_ind
(
module_idP
,
mac
->
crnti
,
gNB_index
,
frameP
,
slotP
,
ENB_FLAG_NO
,
MBMS_FLAG_NO
,
lcid
,
0
,
0
);
lcid_bytes_in_buffer
[
lcid
]
=
rlc_status
.
bytes_in_buffer
;
...
...
openair2/RRC/NR/nr_rrc_common.c
View file @
8e71ca86
...
...
@@ -58,9 +58,8 @@ void rrc_init_nr_srb_param(NR_LCHAN_DESC *chan)
//-----------------------------------------------------------------------------
void
rrc_config_nr_buffer
(
NR_SRB_INFO
*
Srb_info
,
uint8_t
Lchan_type
,
uint8_t
Role
){
uint8_t
Role
)
{
Srb_info
->
Rx_buffer
.
payload_size
=
0
;
Srb_info
->
Tx_buffer
.
payload_size
=
0
;
}
...
...
openair2/RRC/NR/nr_rrc_common.h
0 → 100644
View file @
8e71ca86
/*
* 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 __NR_RRC_COMMON_H__
#define __NR_RRC_COMMON_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define NR_RRC_HEADER_SIZE_MAX 64
#define NR_RRC_BUFFER_SIZE_MAX 1024
typedef
struct
{
char
Payload
[
NR_RRC_BUFFER_SIZE_MAX
];
char
Header
[
NR_RRC_HEADER_SIZE_MAX
];
uint16_t
payload_size
;
}
NR_RRC_BUFFER
;
typedef
enum
UE_STATE_NR_e
{
NR_RRC_INACTIVE
=
0
,
NR_RRC_IDLE
,
NR_RRC_SI_RECEIVED
,
NR_RRC_CONNECTED
,
NR_RRC_RECONFIGURED
,
NR_RRC_HO_EXECUTION
}
NR_UE_STATE_t
;
typedef
struct
{
unsigned
short
transport_block_size
;
/*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */
unsigned
short
max_transport_blocks
;
/*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */
unsigned
long
Guaranteed_bit_rate
;
/*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/
unsigned
long
Max_bit_rate
;
/*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/
uint8_t
Delay_class
;
/*!< \brief Delay class offered by MAC layer scheduling*/
uint8_t
Target_bler
;
/*!< \brief Target Average Transport Block Error rate*/
uint8_t
Lchan_t
;
/*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/
}
__attribute__
((
__packed__
))
NR_LCHAN_DESC
;
typedef
struct
RB_INFO_NR_s
{
uint16_t
Rb_id
;
//=Lchan_id
NR_LCHAN_DESC
Lchan_desc
[
2
];
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
}
NR_RB_INFO
;
typedef
struct
NR_SRB_INFO_s
{
uint16_t
Srb_id
;
//=Lchan_id
NR_RRC_BUFFER
Rx_buffer
;
NR_RRC_BUFFER
Tx_buffer
;
NR_LCHAN_DESC
Lchan_desc
[
2
];
unsigned
int
Trans_id
;
uint8_t
Active
;
}
NR_SRB_INFO
;
typedef
struct
RB_INFO_TABLE_ENTRY_NR_s
{
NR_RB_INFO
Rb_info
;
uint8_t
Active
;
uint32_t
Next_check_frame
;
uint8_t
status
;
}
NR_RB_INFO_TABLE_ENTRY
;
typedef
struct
SRB_INFO_TABLE_ENTRY_NR_s
{
NR_SRB_INFO
Srb_info
;
uint8_t
Active
;
uint8_t
status
;
uint32_t
Next_check_frame
;
}
NR_SRB_INFO_TABLE_ENTRY
;
void
rrc_init_nr_srb_param
(
NR_LCHAN_DESC
*
chan
);
void
rrc_config_nr_buffer
(
NR_SRB_INFO
*
Srb_info
,
uint8_t
Lchan_type
,
uint8_t
Role
);
#endif
openair2/RRC/NR/nr_rrc_defs.h
View file @
8e71ca86
...
...
@@ -37,7 +37,7 @@
#include "collection/tree.h"
#include "collection/linear_alloc.h"
#include "nr_rrc_
types
.h"
#include "nr_rrc_
common
.h"
#include "common/ngran_types.h"
#include "common/platform_constants.h"
...
...
@@ -62,7 +62,7 @@
#include "NR_CellGroupConfig.h"
#include "NR_ServingCellConfigCommon.h"
#include "NR_EstablishmentCause.h"
#include "NR_SIB1.h"
//-------------------
#include "intertask_interface.h"
...
...
@@ -103,16 +103,6 @@ typedef enum {
NR_RRC_HO_STARTED
}
NR_RRC_status_t
;
typedef
enum
UE_STATE_NR_e
{
NR_RRC_INACTIVE
=
0
,
NR_RRC_IDLE
,
NR_RRC_SI_RECEIVED
,
NR_RRC_CONNECTED
,
NR_RRC_RECONFIGURED
,
NR_RRC_HO_EXECUTION
}
NR_UE_STATE_t
;
#define RRM_FREE(p) if ( (p) != NULL) { free(p) ; p=NULL ; }
#define RRM_MALLOC(t,n) (t *) malloc16( sizeof(t) * n )
#define RRM_CALLOC(t,n) (t *) malloc16( sizeof(t) * n)
...
...
@@ -130,39 +120,6 @@ typedef enum UE_STATE_NR_e {
/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */
#define NR_RRC_TRANSACTION_IDENTIFIER_NUMBER 4
typedef
struct
{
unsigned
short
transport_block_size
;
/*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */
unsigned
short
max_transport_blocks
;
/*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */
unsigned
long
Guaranteed_bit_rate
;
/*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/
unsigned
long
Max_bit_rate
;
/*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/
uint8_t
Delay_class
;
/*!< \brief Delay class offered by MAC layer scheduling*/
uint8_t
Target_bler
;
/*!< \brief Target Average Transport Block Error rate*/
uint8_t
Lchan_t
;
/*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/
}
__attribute__
((
__packed__
))
NR_LCHAN_DESC
;
typedef
struct
UE_RRC_INFO_NR_s
{
NR_UE_STATE_t
State
;
uint8_t
SIB1systemInfoValueTag
;
uint32_t
SIStatus
;
uint32_t
SIcnt
;
uint8_t
MCCHStatus
[
8
];
// MAX_MBSFN_AREA
uint16_t
SIwindowsize
;
//!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40
uint8_t
handoverTarget
;
//HO_STATE_t ho_state;
uint16_t
SIperiod
;
//!< Corresponds to the SIB1 si-Periodicity parameter (multiplied by 10). Possible values are (final): 80,160,320,640,1280,2560,5120
unsigned
short
UE_index
;
uint32_t
T300_active
;
uint32_t
T300_cnt
;
uint32_t
T304_active
;
uint32_t
T304_cnt
;
uint32_t
T310_active
;
uint32_t
T310_cnt
;
uint32_t
N310_cnt
;
uint32_t
N311_cnt
;
rnti_t
rnti
;
}
__attribute__
((
__packed__
))
NR_UE_RRC_INFO
;
typedef
struct
UE_S_TMSI_NR_s
{
bool
presence
;
uint16_t
amf_set_id
;
...
...
@@ -201,49 +158,8 @@ typedef struct HANDOVER_INFO_NR_s {
int
size
;
/* size of above message in bytes */
}
NR_HANDOVER_INFO
;
#define NR_RRC_HEADER_SIZE_MAX 64
#define NR_RRC_BUFFER_SIZE_MAX 1024
typedef
struct
{
char
Payload
[
NR_RRC_BUFFER_SIZE_MAX
];
char
Header
[
NR_RRC_HEADER_SIZE_MAX
];
uint16_t
payload_size
;
}
NR_RRC_BUFFER
;
#define NR_RRC_BUFFER_SIZE sizeof(RRC_BUFFER_NR)
typedef
struct
RB_INFO_NR_s
{
uint16_t
Rb_id
;
//=Lchan_id
NR_LCHAN_DESC
Lchan_desc
[
2
];
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
}
NR_RB_INFO
;
typedef
struct
NR_SRB_INFO_s
{
uint16_t
Srb_id
;
//=Lchan_id
NR_RRC_BUFFER
Rx_buffer
;
NR_RRC_BUFFER
Tx_buffer
;
NR_LCHAN_DESC
Lchan_desc
[
2
];
unsigned
int
Trans_id
;
uint8_t
Active
;
}
NR_SRB_INFO
;
typedef
struct
RB_INFO_TABLE_ENTRY_NR_s
{
NR_RB_INFO
Rb_info
;
uint8_t
Active
;
uint32_t
Next_check_frame
;
uint8_t
status
;
}
NR_RB_INFO_TABLE_ENTRY
;
typedef
struct
SRB_INFO_TABLE_ENTRY_NR_s
{
NR_SRB_INFO
Srb_info
;
uint8_t
Active
;
uint8_t
status
;
uint32_t
Next_check_frame
;
}
NR_SRB_INFO_TABLE_ENTRY
;
typedef
struct
nr_rrc_guami_s
{
uint16_t
mcc
;
uint16_t
mnc
;
...
...
@@ -360,7 +276,7 @@ typedef struct gNB_RRC_UE_s {
NR_CipheringAlgorithm_t
ciphering_algorithm
;
e_NR_IntegrityProtAlgorithm
integrity_algorithm
;
uint8_t
StatusRrc
;
NR_UE_STATE_t
StatusRrc
;
rnti_t
rnti
;
uint64_t
random_ue_identity
;
...
...
openair2/RRC/NR/nr_rrc_proto.h
View file @
8e71ca86
...
...
@@ -45,7 +45,6 @@
#include "NR_CellGroupConfig.h"
#define NR_MAX_SUPPORTED_DL_LAYERS 2
void
rrc_init_nr_srb_param
(
NR_LCHAN_DESC
*
chan
);
uint16_t
mac_rrc_nr_data_req
(
const
module_id_t
Mod_idP
,
const
int
CC_id
,
...
...
openair2/RRC/NR/nr_rrc_types.h
deleted
100644 → 0
View file @
211fcb21
/*
* 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
*/
/*! \file nr_rrc_types.h
* \brief rrc types and subtypes
* \author Navid Nikaein and Raymond Knopp, WIE_TAI CHEN
* \date 2011 - 2014, 2018
* \version 1.0
* \company Eurecom, NTUST
* \email: navid.nikaein@eurecom.fr, raymond.knopp@eurecom.fr, kroempa@gmail.com
*/
#ifndef RRC_TYPES_NR_H_
#define RRC_TYPES_NR_H_
typedef
enum
Rrc_State_NR_e
{
RRC_STATE_IDLE_NR
=
0
,
RRC_STATE_INACTIVE_NR
,
RRC_STATE_CONNECTED_NR
,
RRC_STATE_FIRST_NR
=
RRC_STATE_IDLE_NR
,
RRC_STATE_LAST_NR
=
RRC_STATE_CONNECTED_NR
,
}
Rrc_State_NR_t
;
typedef
enum
Rrc_Sub_State_NR_e
{
RRC_SUB_STATE_INACTIVE_NR
=
0
,
RRC_SUB_STATE_IDLE_SEARCHING_NR
,
RRC_SUB_STATE_IDLE_RECEIVING_SIB_NR
,
RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR
,
RRC_SUB_STATE_IDLE_CONNECTING_NR
,
RRC_SUB_STATE_IDLE_NR
,
RRC_SUB_STATE_CONNECTED_NR
,
RRC_SUB_STATE_INACTIVE_FIRST_NR
=
RRC_SUB_STATE_INACTIVE_NR
,
RRC_SUB_STATE_INACTIVE_LAST_NR
=
RRC_SUB_STATE_INACTIVE_NR
,
RRC_SUB_STATE_IDLE_FIRST_NR
=
RRC_SUB_STATE_IDLE_SEARCHING_NR
,
RRC_SUB_STATE_IDLE_LAST_NR
=
RRC_SUB_STATE_IDLE_NR
,
RRC_SUB_STATE_CONNECTED_FIRST_NR
=
RRC_SUB_STATE_CONNECTED_NR
,
RRC_SUB_STATE_CONNECTED_LAST_NR
=
RRC_SUB_STATE_CONNECTED_NR
,
}
Rrc_Sub_State_NR_t
;
#endif
/* RRC_TYPES_H_ */
openair2/RRC/NR_UE/L2_interface_ue.c
View file @
8e71ca86
...
...
@@ -35,6 +35,7 @@
#include "assertions.h"
#include "rrc_vars.h"
#include "MAC/mac.h"
#include "LAYER2/NR_MAC_COMMON/nr_mac.h"
typedef
uint32_t
channel_t
;
...
...
@@ -126,10 +127,6 @@ int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
case
CCCH
:
// TODO: Enable timer T300
//NR_UE_rrc_inst[Mod_idP].Info[gNB_id].T300_active = 1;
//NR_UE_rrc_inst[Mod_idP].Info[gNB_id].T300_cnt = 0;
LOG_D
(
NR_RRC
,
"nr_mac_rrc_data_req_ue: Payload size = %i
\n
"
,
NR_UE_rrc_inst
[
Mod_idP
].
Srb0
[
gNB_id
].
Tx_buffer
.
payload_size
);
memcpy
(
buffer_pP
,
(
uint8_t
*
)
NR_UE_rrc_inst
[
Mod_idP
].
Srb0
[
gNB_id
].
Tx_buffer
.
Payload
,
NR_UE_rrc_inst
[
Mod_idP
].
Srb0
[
gNB_id
].
Tx_buffer
.
payload_size
);
for
(
int
i
=
0
;
i
<
NR_UE_rrc_inst
[
Mod_idP
].
Srb0
[
gNB_id
].
Tx_buffer
.
payload_size
;
i
++
)
{
...
...
@@ -151,10 +148,10 @@ int8_t nr_mac_rrc_data_req_ue(const module_id_t Mod_idP,
int8_t
nr_rrc_RA_succeeded
(
const
module_id_t
mod_id
,
const
uint8_t
gNB_index
)
{
if
(
NR_UE_rrc_inst
[
mod_id
].
Info
[
gNB_index
]
.
T304_active
==
1
)
{
LOG_W
(
NR_RRC
,
"T304 was stoped with value %i
\n
"
,
NR_UE_rrc_inst
[
mod_id
].
Info
[
gNB_index
]
.
T304_cnt
);
NR_UE_rrc_inst
[
mod_id
].
Info
[
gNB_index
]
.
T304_active
=
0
;
NR_UE_rrc_inst
[
mod_id
].
Info
[
gNB_index
]
.
T304_cnt
=
0
;
if
(
NR_UE_rrc_inst
[
mod_id
].
timers_and_constants
.
T304_active
==
1
)
{
LOG_W
(
NR_RRC
,
"T304 was stoped with value %i
\n
"
,
NR_UE_rrc_inst
[
mod_id
].
timers_and_constants
.
T304_cnt
);
NR_UE_rrc_inst
[
mod_id
].
timers_and_constants
.
T304_active
=
0
;
NR_UE_rrc_inst
[
mod_id
].
timers_and_constants
.
T304_cnt
=
0
;
}
return
0
;
}
openair2/RRC/NR_UE/rrc_UE.c
View file @
8e71ca86
...
...
@@ -45,18 +45,16 @@
#include "NR_MeasConfig.h"
#include "NR_UL-DCCH-Message.h"
#include "rrc_list.h"
#include "rrc_defs.h"
#include "rrc_proto.h"
#include "rrc_vars.h"
#include "rrc_extern.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
#include "COMMON/mac_rrc_primitives.h"
#include "intertask_interface.h"
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "nr-uesoftmodem.h"
#include "executables/softmodem-common.h"
#include "plmn_data.h"
#include "nr_pdcp/nr_pdcp_oai_api.h"
#include "UTIL/OSA/osa_defs.h"
...
...
@@ -70,10 +68,8 @@
#include "RRC/NAS/nas_config.h"
#include "RRC/NAS/rb_config.h"
#include "SIMULATION/TOOLS/sim.h" // for taus
#include <executables/softmodem-common.h>
#include "nr_nas_msg_sim.h"
#include <openair2/RRC/NR/nr_rrc_proto.h>
NR_UE_RRC_INST_t
*
NR_UE_rrc_inst
;
/* NAS Attach request with IMSI */
...
...
@@ -233,13 +229,10 @@ int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const module_id_t module_id,
return
-
1
;
}
if
(
NR_UE_rrc_inst
[
module_id
].
scell_group_config
==
NULL
)
{
if
(
NR_UE_rrc_inst
[
module_id
].
scell_group_config
==
NULL
)
NR_UE_rrc_inst
[
module_id
].
scell_group_config
=
cell_group_config
;
nr_rrc_ue_process_scg_config
(
module_id
,
cell_group_config
);
}
else
{
nr_rrc_ue_process_scg_config
(
module_id
,
cell_group_config
);
else
SEQUENCE_free
(
&
asn_DEF_NR_CellGroupConfig
,
(
void
*
)
cell_group_config
,
0
);
}
return
0
;
}
...
...
@@ -275,15 +268,13 @@ int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCR
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
if
(
NR_UE_rrc_inst
[
module_id
].
cell_group_config
==
NULL
){
if
(
NR_UE_rrc_inst
[
module_id
].
cell_group_config
==
NULL
)
{
// first time receive the configuration, just use the memory allocated from uper_decoder. TODO this is not good implementation, need to maintain RRC_INST own structure every time.
NR_UE_rrc_inst
[
module_id
].
cell_group_config
=
cellGroupConfig
;
nr_rrc_ue_process_scg_config
(
module_id
,
cellGroupConfig
);
}
else
{
}
else
{
// after first time, update it and free the memory after.
SEQUENCE_free
(
&
asn_DEF_NR_CellGroupConfig
,
(
void
*
)
NR_UE_rrc_inst
[
module_id
].
cell_group_config
,
0
);
NR_UE_rrc_inst
[
module_id
].
cell_group_config
=
cellGroupConfig
;
nr_rrc_ue_process_scg_config
(
module_id
,
cellGroupConfig
);
}
if
(
get_softmodem_params
()
->
nsa
)
{
nr_rrc_mac_config_req_scg
(
0
,
0
,
cellGroupConfig
);
...
...
@@ -326,47 +317,6 @@ int8_t nr_rrc_ue_process_meas_config(NR_MeasConfig_t *meas_config){
return
0
;
}
int8_t
nr_rrc_ue_process_scg_config
(
const
module_id_t
module_id
,
NR_CellGroupConfig_t
*
cell_group_config
){
int
i
;
if
(
cell_group_config
==
NULL
){
// initial list
if
(
cell_group_config
->
spCellConfig
!=
NULL
){
if
(
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
!=
NULL
){
if
(
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
!=
NULL
){
for
(
i
=
0
;
i
<
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
count
;
++
i
){
RRC_LIST_MOD_ADD
(
NR_UE_rrc_inst
[
module_id
].
BWP_Downlink_list
,
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
array
[
i
],
bwp_Id
);
}
}
}
}
}
else
{
// maintain list
if
(
cell_group_config
->
spCellConfig
!=
NULL
){
if
(
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
!=
NULL
){
// process element of list to be add by RRC message
if
(
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
!=
NULL
){
for
(
i
=
0
;
i
<
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
count
;
++
i
){
RRC_LIST_MOD_ADD
(
NR_UE_rrc_inst
[
module_id
].
BWP_Downlink_list
,
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
->
list
.
array
[
i
],
bwp_Id
);
}
}
// process element of list to be release by RRC message
if
(
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToReleaseList
!=
NULL
){
for
(
i
=
0
;
i
<
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToReleaseList
->
list
.
count
;
++
i
){
NR_BWP_Downlink_t
*
freeP
=
NULL
;
RRC_LIST_MOD_REL
(
NR_UE_rrc_inst
[
module_id
].
BWP_Downlink_list
,
bwp_Id
,
*
cell_group_config
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToReleaseList
->
list
.
array
[
i
],
freeP
);
if
(
freeP
!=
NULL
){
SEQUENCE_free
(
&
asn_DEF_NR_BWP_Downlink
,
(
void
*
)
freeP
,
0
);
}
}
}
}
}
}
return
0
;
}
void
process_nsa_message
(
NR_UE_RRC_INST_t
*
rrc
,
nsa_message_t
nsa_message_type
,
void
*
message
,
int
msg_len
)
{
module_id_t
module_id
=
0
;
// TODO
...
...
@@ -450,60 +400,6 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* uecap_file, char* rrc_config_
NR_UE_rrc_inst
[
nr_ue
].
requested_SI_List
.
bits_unused
=
0
;
NR_UE_rrc_inst
[
nr_ue
].
ra_trigger
=
RA_NOT_RUNNING
;
// init RRC lists
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RLC_Bearer_Config_list
,
NR_maxLC_ID
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SchedulingRequest_list
,
NR_maxNrofSR_ConfigPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TAG_list
,
NR_maxNrofTAGs
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TDD_UL_DL_SlotConfig_list
,
NR_maxNrofSlots
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
BWP_Downlink_list
,
NR_maxNrofBWPs
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ControlResourceSet_list
[
0
],
3
);
// for init-dl-bwp
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ControlResourceSet_list
[
1
],
3
);
// for dl-bwp id=0
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ControlResourceSet_list
[
2
],
3
);
// for dl-bwp id=1
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ControlResourceSet_list
[
3
],
3
);
// for dl-bwp id=2
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ControlResourceSet_list
[
4
],
3
);
// for dl-bwp id=3
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SearchSpace_list
[
0
],
10
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SearchSpace_list
[
1
],
10
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SearchSpace_list
[
2
],
10
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SearchSpace_list
[
3
],
10
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SearchSpace_list
[
4
],
10
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SlotFormatCombinationsPerCell_list
[
0
],
NR_maxNrofAggregatedCellsPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SlotFormatCombinationsPerCell_list
[
1
],
NR_maxNrofAggregatedCellsPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SlotFormatCombinationsPerCell_list
[
2
],
NR_maxNrofAggregatedCellsPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SlotFormatCombinationsPerCell_list
[
3
],
NR_maxNrofAggregatedCellsPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SlotFormatCombinationsPerCell_list
[
4
],
NR_maxNrofAggregatedCellsPerCellGroup
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TCI_State_list
[
0
],
NR_maxNrofTCI_States
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TCI_State_list
[
1
],
NR_maxNrofTCI_States
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TCI_State_list
[
2
],
NR_maxNrofTCI_States
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TCI_State_list
[
3
],
NR_maxNrofTCI_States
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
TCI_State_list
[
4
],
NR_maxNrofTCI_States
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RateMatchPattern_list
[
0
],
NR_maxNrofRateMatchPatterns
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RateMatchPattern_list
[
1
],
NR_maxNrofRateMatchPatterns
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RateMatchPattern_list
[
2
],
NR_maxNrofRateMatchPatterns
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RateMatchPattern_list
[
3
],
NR_maxNrofRateMatchPatterns
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
RateMatchPattern_list
[
4
],
NR_maxNrofRateMatchPatterns
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ZP_CSI_RS_Resource_list
[
0
],
NR_maxNrofZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ZP_CSI_RS_Resource_list
[
1
],
NR_maxNrofZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ZP_CSI_RS_Resource_list
[
2
],
NR_maxNrofZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ZP_CSI_RS_Resource_list
[
3
],
NR_maxNrofZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
ZP_CSI_RS_Resource_list
[
4
],
NR_maxNrofZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
Aperidic_ZP_CSI_RS_ResourceSet_list
[
0
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
Aperidic_ZP_CSI_RS_ResourceSet_list
[
1
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
Aperidic_ZP_CSI_RS_ResourceSet_list
[
2
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
Aperidic_ZP_CSI_RS_ResourceSet_list
[
3
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
Aperidic_ZP_CSI_RS_ResourceSet_list
[
4
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SP_ZP_CSI_RS_ResourceSet_list
[
0
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SP_ZP_CSI_RS_ResourceSet_list
[
1
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SP_ZP_CSI_RS_ResourceSet_list
[
2
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SP_ZP_CSI_RS_ResourceSet_list
[
3
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
SP_ZP_CSI_RS_ResourceSet_list
[
4
],
NR_maxNrofZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
NZP_CSI_RS_Resource_list
,
NR_maxNrofNZP_CSI_RS_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
NZP_CSI_RS_ResourceSet_list
,
NR_maxNrofNZP_CSI_RS_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
CSI_IM_Resource_list
,
NR_maxNrofCSI_IM_Resources
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
CSI_IM_ResourceSet_list
,
NR_maxNrofCSI_IM_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
CSI_SSB_ResourceSet_list
,
NR_maxNrofCSI_SSB_ResourceSets
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
CSI_ResourceConfig_list
,
NR_maxNrofCSI_ResourceConfigurations
);
RRC_LIST_INIT
(
NR_UE_rrc_inst
[
nr_ue
].
CSI_ReportConfig_list
,
NR_maxNrofCSI_ReportConfigurations
);
}
NR_UE_rrc_inst
->
uecap_file
=
uecap_file
;
...
...
@@ -598,7 +494,8 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(const module_id_t module_id, const u
NR_UE_rrc_inst
[
module_id
].
mib
=
bcch_message
->
message
.
choice
.
mib
;
bcch_message
->
message
.
choice
.
mib
=
NULL
;
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
module_id
].
sib1
[
gNB_index
];
NR_UE_RRC_SI_INFO
*
SI_info
=
&
NR_UE_rrc_inst
[
module_id
].
SInfo
[
gNB_index
];
NR_SIB1_t
*
sib1
=
SI_info
->
sib1
;
// if no sib1 because not acquired yet or expired, get a new one
bool
get_sib1
=
sib1
==
NULL
;
nr_rrc_mac_config_req_mib
(
module_id
,
0
,
NR_UE_rrc_inst
[
module_id
].
mib
,
get_sib1
);
...
...
@@ -820,199 +717,170 @@ void nr_dump_sib3( NR_SIB3_t *sib3 ) {
LOG_I
(
RRC
,
"lateNonCriticalExtension : not defined
\n
"
);
}
int
nr_decode_SI
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
)
{
NR_SystemInformation_t
**
si
=
&
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
si
[
gNB_index
];
int
nr_decode_SI
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
uint8_t
gNB_index
)
{
NR_UE_RRC_SI_INFO
*
SI_info
=
&
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
SInfo
[
gNB_index
];
NR_SystemInformation_t
*
si
=
SI_info
->
si
;
int
new_sib
=
0
;
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib1
[
gNB_index
]
;
NR_SIB1_t
*
sib1
=
SI_info
->
sib1
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI
,
VCD_FUNCTION_IN
);
// Dump contents
if
(
(
*
si
)
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_systemInformation
||
(
*
si
)
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_criticalExtensionsFuture_r16
)
{
LOG_D
(
RRC
,
"[UE]
(*si)
->criticalExtensions.choice.NR_SystemInformation_t->sib_TypeAndInfo.list.count %d
\n
"
,
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
);
if
(
si
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_systemInformation
||
si
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_criticalExtensionsFuture_r16
)
{
LOG_D
(
RRC
,
"[UE]
si
->criticalExtensions.choice.NR_SystemInformation_t->sib_TypeAndInfo.list.count %d
\n
"
,
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
);
}
else
{
LOG_D
(
RRC
,
"[UE] Unknown criticalExtension version (not Rel16)
\n
"
);
return
-
1
;
}
for
(
int
i
=
0
;
i
<
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
;
i
++
)
{
SystemInformation_IEs__sib_TypeAndInfo__Member
*
typeandinfo
;
typeandinfo
=
(
*
si
)
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
array
[
i
];
typeandinfo
=
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
array
[
i
];
switch
(
typeandinfo
->
present
)
{
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
2
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
2
;
if
((
SI_info
->
SIStatus
&
2
)
==
0
)
{
SI_info
->
SIStatus
|=
2
;
//new_sib=1;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib2
[
gNB_index
],
&
typeandinfo
->
choice
.
sib2
,
sizeof
(
NR_SIB2_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB2 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib2
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib2
[
gNB_index
]
);
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB2 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
memcpy
(
SI_info
->
sib2
,
&
typeandinfo
->
choice
.
sib2
,
sizeof
(
NR_SIB2_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB2 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib2
(
SI_info
->
sib2
);
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB2 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
//TODO rrc_mac_config_req_ue
// After SI is received, prepare RRCConnectionRequest
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
MBMS_flag
<
3
)
// see -Q option
if
(
get_softmodem_params
()
->
sa
)
{
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
MBMS_flag
<
3
)
{
// see -Q option
if
(
get_softmodem_params
()
->
sa
)
nr_rrc_ue_generate_RRCSetupRequest
(
ctxt_pP
->
module_id
,
gNB_index
);
}
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
==
NR_RRC_IDLE
)
{
LOG_I
(
RRC
,
"[UE %d] Received SIB1/SIB2/SIB3 Switching to RRC_SI_RECEIVED
\n
"
,
ctxt_pP
->
module_id
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
=
NR_RRC_SI_RECEIVED
;
#if ENABLE_RAL
/* TODO {
MessageDef *message_ral_p = NULL;
rrc_ral_system_information_ind_t ral_si_ind;
message_ral_p = itti_alloc_new_message (TASK_RRC_UE, 0, RRC_RAL_SYSTEM_INFORMATION_IND);
memset(&ral_si_ind, 0, sizeof(rrc_ral_system_information_ind_t));
ral_si_ind.plmn_id.MCCdigit2 = '0';
ral_si_ind.plmn_id.MCCdigit1 = '2';
ral_si_ind.plmn_id.MNCdigit3 = '0';
ral_si_ind.plmn_id.MCCdigit3 = '8';
ral_si_ind.plmn_id.MNCdigit2 = '9';
ral_si_ind.plmn_id.MNCdigit1 = '9';
ral_si_ind.cell_id = 1;
ral_si_ind.dbm = 0;
//ral_si_ind.dbm = fifo_dump_emos_UE.PHY_measurements->rx_rssi_dBm[gNB_index];
// TO DO
ral_si_ind.sinr = 0;
//ral_si_ind.sinr = fifo_dump_emos_UE.PHY_measurements->subband_cqi_dB[gNB_index][phy_vars_ue->lte_frame_parms.nb_antennas_rx][0];
// TO DO
ral_si_ind.link_data_rate = 0;
memcpy (&message_ral_p->ittiMsg, (void *) &ral_si_ind, sizeof(rrc_ral_system_information_ind_t));
#warning "ue_mod_idP ? for instance ?"
itti_send_msg_to_task (TASK_RAL_UE, UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), message_ral_p);
}*/
#endif
}
}
break
;
// case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
4
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
4
;
if
((
SI_info
->
SIStatus
&
4
)
==
0
)
{
SI_info
->
SIStatus
|=
4
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib3
[
gNB_index
],
&
typeandinfo
->
choice
.
sib3
,
sizeof
(
LTE_SystemInformationBlockType3_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB3 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib3
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib3
[
gNB_index
]
);
memcpy
(
SI_info
->
sib3
,
&
typeandinfo
->
choice
.
sib3
,
sizeof
(
LTE_SystemInformationBlockType3_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB3 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
nr_dump_sib3
(
SI_info
->
sib3
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
8
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
8
;
if
((
SI_info
->
SIStatus
&
8
)
==
0
)
{
SI_info
->
SIStatus
|=
8
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib4
[
gNB_index
],
typeandinfo
->
choice
.
sib4
,
sizeof
(
NR_SIB4_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB4 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib4
,
typeandinfo
->
choice
.
sib4
,
sizeof
(
NR_SIB4_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB4 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
16
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
16
;
if
((
SI_info
->
SIStatus
&
16
)
==
0
)
{
SI_info
->
SIStatus
|=
16
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib5
[
gNB_index
],
typeandinfo
->
choice
.
sib5
,
sizeof
(
NR_SIB5_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB5 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
//dump_sib5(NR_UE_rrc_inst[ctxt_pP->module_id].sib5[gNB_index]);
memcpy
(
SI_info
->
sib5
,
typeandinfo
->
choice
.
sib5
,
sizeof
(
NR_SIB5_t
));
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB5 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
32
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
32
;
if
((
SI_info
->
SIStatus
&
32
)
==
0
)
{
SI_info
->
SIStatus
|=
32
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib6
[
gNB_index
],
typeandinfo
->
choice
.
sib6
,
sizeof
(
NR_SIB6_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB6 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib6
,
typeandinfo
->
choice
.
sib6
,
sizeof
(
NR_SIB6_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB6 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
64
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
64
;
if
((
SI_info
->
SIStatus
&
64
)
==
0
)
{
SI_info
->
SIStatus
|=
64
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib7
[
gNB_index
],
typeandinfo
->
choice
.
sib7
,
sizeof
(
NR_SIB7_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB7 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib7
,
typeandinfo
->
choice
.
sib7
,
sizeof
(
NR_SIB7_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB7 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
128
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
128
;
if
((
SI_info
->
SIStatus
&
128
)
==
0
)
{
SI_info
->
SIStatus
|=
128
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib8
[
gNB_index
],
typeandinfo
->
choice
.
sib8
,
sizeof
(
NR_SIB8_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB8 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib8
,
typeandinfo
->
choice
.
sib8
,
sizeof
(
NR_SIB8_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB8 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
256
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
256
;
if
((
SI_info
->
SIStatus
&
256
)
==
0
)
{
SI_info
->
SIStatus
|=
256
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib9
[
gNB_index
],
typeandinfo
->
choice
.
sib9
,
sizeof
(
NR_SIB9_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB9 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib9
,
typeandinfo
->
choice
.
sib9
,
sizeof
(
NR_SIB9_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB9 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
512
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
512
;
if
((
SI_info
->
SIStatus
&
512
)
==
0
)
{
SI_info
->
SIStatus
|=
512
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib10
[
gNB_index
],
typeandinfo
->
choice
.
sib10_v1610
,
sizeof
(
NR_SIB10_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB10 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib10
,
typeandinfo
->
choice
.
sib10_v1610
,
sizeof
(
NR_SIB10_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB10 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
1024
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
1024
;
if
((
SI_info
->
SIStatus
&
1024
)
==
0
)
{
SI_info
->
SIStatus
|=
1024
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib11
[
gNB_index
],
typeandinfo
->
choice
.
sib11_v1610
,
sizeof
(
NR_SIB11_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB11 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib11
,
typeandinfo
->
choice
.
sib11_v1610
,
sizeof
(
NR_SIB11_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB11 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
2048
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
2048
;
if
((
SI_info
->
SIStatus
&
2048
)
==
0
)
{
SI_info
->
SIStatus
|=
2048
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib12
[
gNB_index
],
typeandinfo
->
choice
.
sib12_v1610
,
sizeof
(
NR_SIB12_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB12 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib12
,
typeandinfo
->
choice
.
sib12_v1610
,
sizeof
(
NR_SIB12_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB12 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
4096
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
4096
;
if
((
SI_info
->
SIStatus
&
4096
)
==
0
)
{
SI_info
->
SIStatus
|=
4096
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib13
[
gNB_index
],
typeandinfo
->
choice
.
sib13_v1610
,
sizeof
(
NR_SIB13_r16_t
)
);
memcpy
(
SI_info
->
sib13
,
typeandinfo
->
choice
.
sib13_v1610
,
sizeof
(
NR_SIB13_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB13 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
//dump_sib13(
NR_UE_rrc_inst[ctxt_pP->module_id].sib13[gNB_index]
);
//dump_sib13(
SI_info->sib13
);
// adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB13 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
LOG_I
(
RRC
,
"[FRAME %05"
PRIu32
"][RRC_UE][MOD %02"
PRIu8
"][][--- MAC_CONFIG_REQ (SIB13 params gNB %"
PRIu8
") --->][MAC_UE][MOD %02"
PRIu8
"][]
\n
"
,
ctxt_pP
->
frame
,
ctxt_pP
->
module_id
,
gNB_index
,
ctxt_pP
->
module_id
);
// TODO rrc_mac_config_req_ue
}
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610
:
if
((
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
&
8192
)
==
0
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
|=
8192
;
if
((
SI_info
->
SIStatus
&
8192
)
==
0
)
{
SI_info
->
SIStatus
|=
8192
;
new_sib
=
1
;
memcpy
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
sib12
[
gNB_index
],
typeandinfo
->
choice
.
sib14_v1610
,
sizeof
(
NR_SIB14_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB14 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
memcpy
(
SI_info
->
sib12
,
typeandinfo
->
choice
.
sib14_v1610
,
sizeof
(
NR_SIB14_r16_t
)
);
LOG_I
(
RRC
,
"[UE %"
PRIu8
"] Frame %"
PRIu32
" Found SIB14 from gNB %"
PRIu8
"
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
gNB_index
);
}
break
;
...
...
@@ -1021,13 +889,13 @@ int nr_decode_SI( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index
break
;
}
if
(
new_sib
==
1
)
{
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
++
;
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
)
SI_info
->
SIcnt
++
;
if
(
SI_info
->
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
)
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR
);
LOG_I
(
NR_RRC
,
"SIStatus %x, SIcnt %d/%d
\n
"
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIcnt
,
SI_info
->
SIStatus
,
SI_info
->
SIcnt
,
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
);
}
}
...
...
@@ -1150,11 +1018,12 @@ int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id_t module_id,
const
uint8_t
rsrp
)
{
NR_BCCH_DL_SCH_Message_t
*
bcch_message
=
NULL
;
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
module_id
].
sib1
[
gNB_index
];
NR_UE_RRC_SI_INFO
*
SI_info
=
&
NR_UE_rrc_inst
[
module_id
].
SInfo
[
gNB_index
];
NR_SIB1_t
*
sib1
=
SI_info
->
sib1
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_IN
);
if
(((
NR_UE_rrc_inst
[
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
1
)
&&
sib1
->
si_SchedulingInfo
&&
// SIB1 received
(
NR_UE_rrc_inst
[
module_id
].
Info
[
gNB_index
].
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
))
{
if
(((
SI_info
->
SIStatus
&
1
)
==
1
)
&&
sib1
->
si_SchedulingInfo
&&
// SIB1 received
(
SI_info
->
SIcnt
==
sib1
->
si_SchedulingInfo
->
schedulingInfoList
.
list
.
count
))
{
// to prevent memory bloating
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH
,
VCD_FUNCTION_OUT
);
return
0
;
...
...
@@ -1186,17 +1055,16 @@ int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id_t module_id,
if
(
bcch_message
->
message
.
present
==
NR_BCCH_DL_SCH_MessageType_PR_c1
)
{
switch
(
bcch_message
->
message
.
choice
.
c1
->
present
)
{
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
:
if
((
NR_UE_rrc_inst
[
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
0
)
{
NR_SIB1_t
*
sib1
=
NR_UE_rrc_inst
[
module_id
].
sib1
[
gNB_index
];
if
((
SI_info
->
SIStatus
&
1
)
==
0
)
{
if
(
sib1
!=
NULL
){
SEQUENCE_free
(
&
asn_DEF_NR_SIB1
,
(
void
*
)
sib1
,
1
);
}
NR_UE_rrc_inst
[
module_id
].
Info
[
gNB_index
].
SIStatus
|=
1
;
SI_info
->
SIStatus
|=
1
;
sib1
=
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
;
if
(
*
(
int64_t
*
)
sib1
!=
1
)
{
NR_UE_rrc_inst
[
module_id
].
sib1
[
gNB_index
]
=
sib1
;
SI_info
->
sib1
=
sib1
;
if
(
g_log
->
log_component
[
NR_RRC
].
level
>=
OAILOG_DEBUG
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_SIB1
,
(
const
void
*
)
NR_UE_rrc_inst
[
module_id
].
sib1
[
gNB_index
]
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_SIB1
,
(
const
void
*
)
SI_info
->
sib1
);
}
LOG_A
(
NR_RRC
,
"SIB1 decoded
\n
"
);
...
...
@@ -1220,7 +1088,7 @@ int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id_t module_id,
break
;
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation
:
if
((
NR_UE_rrc_inst
[
module_id
].
Info
[
gNB_index
].
SIStatus
&
1
)
==
1
)
{
if
((
SI_info
->
SIStatus
&
1
)
==
1
)
{
LOG_W
(
NR_RRC
,
"Decoding SI not implemented yet
\n
"
);
// TODO: Decode SI
/*
...
...
@@ -1279,31 +1147,32 @@ void nr_rrc_ue_process_masterCellGroup(const protocol_ctxt_t *const ctxt_pP,
LOG_A
(
NR_RRC
,
"Received the reconfigurationWithSync in %s
\n
"
,
__FUNCTION__
);
NR_ReconfigurationWithSync_t
*
reconfigurationWithSync
=
cellGroupConfig
->
spCellConfig
->
reconfigurationWithSync
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_active
=
1
;
NR_UE_Timers_Constants_t
*
timers_and_constants
=
&
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
timers_and_constants
;
timers_and_constants
->
T304_active
=
1
;
switch
(
reconfigurationWithSync
->
t304
)
{
case
NR_ReconfigurationWithSync__t304_ms100
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
100
;
timers_and_constants
->
T304_cnt
=
100
;
break
;
case
NR_ReconfigurationWithSync__t304_ms150
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
150
;
timers_and_constants
->
T304_cnt
=
150
;
break
;
case
NR_ReconfigurationWithSync__t304_ms200
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
200
;
timers_and_constants
->
T304_cnt
=
200
;
break
;
case
NR_ReconfigurationWithSync__t304_ms500
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
500
;
timers_and_constants
->
T304_cnt
=
500
;
break
;
case
NR_ReconfigurationWithSync__t304_ms1000
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
1000
;
timers_and_constants
->
T304_cnt
=
1000
;
break
;
case
NR_ReconfigurationWithSync__t304_ms2000
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
2000
;
timers_and_constants
->
T304_cnt
=
2000
;
break
;
case
NR_ReconfigurationWithSync__t304_ms10000
:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
10000
;
timers_and_constants
->
T304_cnt
=
10000
;
break
;
default:
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
T304_cnt
=
50
;
timers_and_constants
->
T304_cnt
=
50
;
}
}
...
...
@@ -1423,7 +1292,7 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
int
rval
=
0
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH
,
VCD_FUNCTION_IN
);
LOG_D
(
RRC
,
"[NR UE%d] Decoding DL-CCCH message (%d bytes), State %d
\n
"
,
ctxt_pP
->
module_id
,
Srb_info
->
Rx_buffer
.
payload_size
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
nrRrc
State
);
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_DL_CCCH_Message
,
(
void
**
)
&
dl_ccch_msg
,
...
...
@@ -1441,7 +1310,7 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
}
if
(
dl_ccch_msg
->
message
.
present
==
NR_DL_CCCH_MessageType_PR_c1
)
{
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
SIStatus
>
0
)
{
if
(
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
S
Info
[
gNB_index
].
SIStatus
>
0
)
{
switch
(
dl_ccch_msg
->
message
.
choice
.
c1
->
present
)
{
case
NR_DL_CCCH_MessageType__c1_PR_NOTHING
:
LOG_I
(
NR_RRC
,
"[UE%d] Frame %d : Received PR_NOTHING on DL-CCCH-Message
\n
"
,
...
...
@@ -1463,13 +1332,13 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
// Get configuration
// Release T300 timer
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
]
.
T300_active
=
0
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
timers_and_constants
.
T300_active
=
0
;
nr_rrc_ue_process_masterCellGroup
(
ctxt_pP
,
gNB_index
,
&
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
->
masterCellGroup
);
nr_rrc_ue_process_RadioBearerConfig
(
ctxt_pP
,
gNB_index
,
&
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
->
radioBearerConfig
);
nr_rrc_set_state
(
ctxt_pP
->
module_id
,
RRC_STATE_CONNECTED_NR
);
nr_rrc_set_sub_state
(
ctxt_pP
->
module_id
,
RRC_SUB_STATE_CONNECTED_NR
);
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
rnti
=
ctxt_pP
->
rntiMaybeUEid
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
rnti
=
ctxt_pP
->
rntiMaybeUEid
;
rrc_ue_generate_RRCSetupComplete
(
ctxt_pP
,
gNB_index
,
dl_ccch_msg
->
message
.
choice
.
c1
->
choice
.
rrcSetup
->
rrc_TransactionIdentifier
,
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
selected_plmn_identity
);
rval
=
0
;
break
;
...
...
@@ -2129,7 +1998,7 @@ nr_rrc_ue_establish_srb2(
}
}
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
Info
[
gNB_index
].
State
=
NR_RRC_CONNECTED
;
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
nrRrcState
=
RRC_STATE_CONNECTED_NR
;
LOG_I
(
NR_RRC
,
"[UE %d] State = NR_RRC_CONNECTED (gNB %d)
\n
"
,
ctxt_pP
->
module_id
,
gNB_index
);
}
...
...
@@ -2446,7 +2315,7 @@ nr_rrc_ue_establish_srb2(
/* Create message for PDCP (ULInformationTransfer_t) */
length
=
do_NR_ULInformationTransfer
(
&
buffer
,
NAS_UPLINK_DATA_REQ
(
msg_p
).
nasMsg
.
length
,
NAS_UPLINK_DATA_REQ
(
msg_p
).
nasMsg
.
data
);
/* Transfer data to PDCP */
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
ue_mod_id
,
GNB_FLAG_NO
,
NR_UE_rrc_inst
[
ue_mod_id
].
Info
[
0
].
rnti
,
0
,
0
,
0
);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
ue_mod_id
,
GNB_FLAG_NO
,
NR_UE_rrc_inst
[
ue_mod_id
].
rnti
,
0
,
0
,
0
);
// check if SRB2 is created, if yes request data_req on DCCH1 (SRB2)
rb_id_t
srb_id
=
NR_UE_rrc_inst
[
ue_mod_id
].
SRB2_config
[
0
]
==
NULL
?
DCCH
:
DCCH1
;
nr_pdcp_data_req_srb
(
ctxt
.
rntiMaybeUEid
,
srb_id
,
nr_rrc_mui
++
,
length
,
buffer
,
deliver_pdu_srb_rlc
,
NULL
);
...
...
@@ -2839,7 +2708,7 @@ void *nr_rrc_timers_update() {
for
(
int
mod_id
=
0
;
mod_id
<
NB_NR_UE_INST
;
mod_id
++
)
{
for
(
int
i
=
0
;
i
<
NB_SIG_CNX_UE
;
i
++
)
{
NR_UE_
RRC_INFO
*
timers
=
&
NR_UE_rrc_inst
[
mod_id
].
Info
[
i
]
;
NR_UE_
Timers_Constants_t
*
timers
=
&
NR_UE_rrc_inst
[
mod_id
].
timers_and_constants
;
// T304
if
(
timers
->
T304_active
==
1
)
{
...
...
openair2/RRC/NR_UE/rrc_defs.h
View file @
8e71ca86
...
...
@@ -38,9 +38,8 @@
#include <string.h>
#include "platform_types.h"
#include "commonDef.h"
#include "NR_MAC_COMMON/nr_mac.h"
#include "rrc_list.h"
#include "NR_asn_constant.h"
#include "NR_MeasConfig.h"
#include "NR_CellGroupConfig.h"
...
...
@@ -48,12 +47,15 @@
#include "NR_RLC-BearerConfig.h"
#include "NR_TAG.h"
#include "NR_asn_constant.h"
#include "NR_SchedulingRequestToAddMod.h"
#include "NR_MIB.h"
#include "NR_SIB1.h"
#include "NR_BCCH-BCH-Message.h"
#include "NR_DL-DCCH-Message.h"
#include "../NR/nr_rrc_defs.h"
#include "NR_SystemInformation.h"
#include "NR_UE-NR-Capability.h"
#include "RRC/NR/nr_rrc_common.h"
#include "as_message.h"
#define NB_NR_UE_INST 1
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
...
...
@@ -77,6 +79,36 @@ typedef struct OAI_NR_UECapability_s {
NR_UE_NR_Capability_t
*
UE_NR_Capability
;
}
OAI_NR_UECapability_t
;
typedef
enum
Rrc_State_NR_e
{
RRC_STATE_IDLE_NR
=
0
,
RRC_STATE_INACTIVE_NR
,
RRC_STATE_CONNECTED_NR
,
RRC_STATE_FIRST_NR
=
RRC_STATE_IDLE_NR
,
RRC_STATE_LAST_NR
=
RRC_STATE_CONNECTED_NR
,
}
Rrc_State_NR_t
;
typedef
enum
Rrc_Sub_State_NR_e
{
RRC_SUB_STATE_INACTIVE_NR
=
0
,
RRC_SUB_STATE_IDLE_SEARCHING_NR
,
RRC_SUB_STATE_IDLE_RECEIVING_SIB_NR
,
RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR
,
RRC_SUB_STATE_IDLE_CONNECTING_NR
,
RRC_SUB_STATE_IDLE_NR
,
RRC_SUB_STATE_CONNECTED_NR
,
RRC_SUB_STATE_INACTIVE_FIRST_NR
=
RRC_SUB_STATE_INACTIVE_NR
,
RRC_SUB_STATE_INACTIVE_LAST_NR
=
RRC_SUB_STATE_INACTIVE_NR
,
RRC_SUB_STATE_IDLE_FIRST_NR
=
RRC_SUB_STATE_IDLE_SEARCHING_NR
,
RRC_SUB_STATE_IDLE_LAST_NR
=
RRC_SUB_STATE_IDLE_NR
,
RRC_SUB_STATE_CONNECTED_FIRST_NR
=
RRC_SUB_STATE_CONNECTED_NR
,
RRC_SUB_STATE_CONNECTED_LAST_NR
=
RRC_SUB_STATE_CONNECTED_NR
,
}
Rrc_Sub_State_NR_t
;
typedef
enum
requested_SI_List_e
{
SIB2
=
1
,
SIB3
=
2
,
...
...
@@ -101,6 +133,55 @@ typedef enum RA_trigger_e {
BEAM_FAILURE_RECOVERY
,
}
RA_trigger_t
;
typedef
struct
UE_RRC_SI_INFO_NR_s
{
uint32_t
SIStatus
;
uint32_t
SIcnt
;
NR_SystemInformation_t
*
si
;
NR_SIB1_t
*
sib1
;
NR_SIB2_t
*
sib2
;
NR_SIB3_t
*
sib3
;
NR_SIB4_t
*
sib4
;
NR_SIB5_t
*
sib5
;
NR_SIB6_t
*
sib6
;
NR_SIB7_t
*
sib7
;
NR_SIB8_t
*
sib8
;
NR_SIB9_t
*
sib9
;
NR_SIB10_r16_t
*
sib10
;
NR_SIB11_r16_t
*
sib11
;
NR_SIB12_r16_t
*
sib12
;
NR_SIB13_r16_t
*
sib13
;
NR_SIB14_r16_t
*
sib14
;
}
__attribute__
((
__packed__
))
NR_UE_RRC_SI_INFO
;
typedef
struct
NR_UE_Timers_Constants_s
{
// timers status
bool
T300_active
;
bool
T301_active
;
bool
T304_active
;
bool
T310_active
;
bool
T311_active
;
bool
T319_active
;
// timers
uint32_t
T300_cnt
;
uint32_t
T301_cnt
;
uint32_t
T304_cnt
;
uint32_t
T310_cnt
;
uint32_t
T311_cnt
;
uint32_t
T319_cnt
;
// counters
uint32_t
N310_cnt
;
uint32_t
N311_cnt
;
// constants (limits configured by the network)
uint32_t
N310_k
;
uint32_t
N311_k
;
uint32_t
T300_k
;
uint32_t
T301_k
;
uint32_t
T304_k
;
uint32_t
T310_k
;
uint32_t
T311_k
;
uint32_t
T319_k
;
}
NR_UE_Timers_Constants_t
;
typedef
struct
NR_UE_RRC_INST_s
{
NR_MeasConfig_t
*
meas_config
;
...
...
@@ -121,6 +202,7 @@ typedef struct NR_UE_RRC_INST_s {
rb_id_t
*
defaultDRB
;
// remember the ID of the default DRB
char
*
uecap_file
;
rnti_t
rnti
;
NR_SRB_INFO
Srb0
[
NB_SIG_CNX_UE
];
NR_SRB_INFO_TABLE_ENTRY
Srb1
[
NB_CNX_UE
];
...
...
@@ -131,27 +213,14 @@ typedef struct NR_UE_RRC_INST_s {
uint8_t
*
UECapability
;
uint16_t
UECapability_size
;
NR_UE_Timers_Constants_t
timers_and_constants
;
RA_trigger_t
ra_trigger
;
BIT_STRING_t
requested_SI_List
;
NR_SystemInformation_t
*
si
[
NB_CNX_UE
];
NR_SIB1_t
*
sib1
[
NB_CNX_UE
];
NR_SIB2_t
*
sib2
[
NB_CNX_UE
];
NR_SIB3_t
*
sib3
[
NB_CNX_UE
];
NR_SIB4_t
*
sib4
[
NB_CNX_UE
];
NR_SIB5_t
*
sib5
[
NB_CNX_UE
];
NR_SIB6_t
*
sib6
[
NB_CNX_UE
];
NR_SIB7_t
*
sib7
[
NB_CNX_UE
];
NR_SIB8_t
*
sib8
[
NB_CNX_UE
];
NR_SIB9_t
*
sib9
[
NB_CNX_UE
];
NR_SIB10_r16_t
*
sib10
[
NB_CNX_UE
];
NR_SIB11_r16_t
*
sib11
[
NB_CNX_UE
];
NR_SIB12_r16_t
*
sib12
[
NB_CNX_UE
];
NR_SIB13_r16_t
*
sib13
[
NB_CNX_UE
];
NR_SIB14_r16_t
*
sib14
[
NB_CNX_UE
];
plmn_t
plmnID
;
NR_UE_RRC_INFO
Info
[
NB_SIG_CNX_UE
];
BIT_STRING_t
requested_SI_List
;
NR_UE_RRC_SI_INFO
SInfo
[
NB_SIG_CNX_UE
];
NR_MIB_t
*
mib
;
...
...
@@ -161,54 +230,6 @@ typedef struct NR_UE_RRC_INST_s {
//RRC_LIST_TYPE(NR_SecurityAlgorithmConfig_t, NR_SecurityAlgorithmConfig) SecurityAlgorithmConfig_list;
NR_CipheringAlgorithm_t
cipheringAlgorithm
;
e_NR_IntegrityProtAlgorithm
integrityProtAlgorithm
;
// lists
// CellGroupConfig.rlc-BearerToAddModList
RRC_LIST_TYPE
(
NR_RLC_BearerConfig_t
,
NR_maxLC_ID
)
RLC_Bearer_Config_list
;
// CellGroupConfig.mac-CellGroupConfig.schedulingrequest
RRC_LIST_TYPE
(
NR_SchedulingRequestToAddMod_t
,
NR_maxNrofSR_ConfigPerCellGroup
)
SchedulingRequest_list
;
// CellGroupConfig.mac-CellGroupConfig.TAG
RRC_LIST_TYPE
(
NR_TAG_t
,
NR_maxNrofTAGs
)
TAG_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated.tdduldlslotconfig
RRC_LIST_TYPE
(
NR_TDD_UL_DL_SlotConfig_t
,
NR_maxNrofSlots
)
TDD_UL_DL_SlotConfig_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated.bwps
RRC_LIST_TYPE
(
NR_BWP_Downlink_t
,
NR_maxNrofBWPs
)
BWP_Downlink_list
;
//BWP-DownlinkDedicated 0=INIT-DL-BWP, 1..4 for DL-BWPs
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdcchconfig.controlresourceset
RRC_LIST_TYPE
(
NR_ControlResourceSet_t
,
3
)
ControlResourceSet_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdcchconfig.searchspace
RRC_LIST_TYPE
(
NR_SearchSpace_t
,
10
)
SearchSpace_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdcchconfig.slotformatindicator
RRC_LIST_TYPE
(
NR_SlotFormatCombinationsPerCell_t
,
NR_maxNrofAggregatedCellsPerCellGroup
)
SlotFormatCombinationsPerCell_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdschconfig
RRC_LIST_TYPE
(
NR_TCI_State_t
,
NR_maxNrofTCI_States
)
TCI_State_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdschconfig
RRC_LIST_TYPE
(
NR_RateMatchPattern_t
,
NR_maxNrofRateMatchPatterns
)
RateMatchPattern_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdschconfig
RRC_LIST_TYPE
(
NR_ZP_CSI_RS_Resource_t
,
NR_maxNrofZP_CSI_RS_Resources
)
ZP_CSI_RS_Resource_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdschconfig
RRC_LIST_TYPE
(
NR_ZP_CSI_RS_ResourceSet_t
,
NR_maxNrofZP_CSI_RS_ResourceSets
)
Aperidic_ZP_CSI_RS_ResourceSet_list
[
5
];
// CellGroupConfig.spCellConfig.spCellConfigDedicated.initialdlbwp.pdschconfig
RRC_LIST_TYPE
(
NR_ZP_CSI_RS_ResourceSet_t
,
NR_maxNrofZP_CSI_RS_ResourceSets
)
SP_ZP_CSI_RS_ResourceSet_list
[
5
];
// TODO check the way to implement mutiple list inside bwps
// uplink bwp also
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_NZP_CSI_RS_Resource_t
,
NR_maxNrofNZP_CSI_RS_Resources
)
NZP_CSI_RS_Resource_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_NZP_CSI_RS_ResourceSet_t
,
NR_maxNrofNZP_CSI_RS_ResourceSets
)
NZP_CSI_RS_ResourceSet_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_IM_Resource_t
,
NR_maxNrofCSI_IM_Resources
)
CSI_IM_Resource_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_IM_ResourceSet_t
,
NR_maxNrofCSI_IM_ResourceSets
)
CSI_IM_ResourceSet_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_SSB_ResourceSet_t
,
NR_maxNrofCSI_SSB_ResourceSets
)
CSI_SSB_ResourceSet_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_ResourceConfig_t
,
NR_maxNrofCSI_ResourceConfigurations
)
CSI_ResourceConfig_list
;
// CellGroupConfig.spCellConfig.spCellConfigDedicated
RRC_LIST_TYPE
(
NR_CSI_ReportConfig_t
,
NR_maxNrofCSI_ReportConfigurations
)
CSI_ReportConfig_list
;
long
selected_plmn_identity
;
Rrc_State_NR_t
nrRrcState
;
...
...
openair2/RRC/NR_UE/rrc_list.h
deleted
100644 → 0
View file @
211fcb21
/*
* 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
*/
/* \file rrc_list.h
* \brief linked list implementation for ToAddModList mechanism in RRC layer
* \author R. Knopp, K.H. HSU
* \date 2018
* \version 0.1
* \company Eurecom / NTUST
* \email: knopp@eurecom.fr, kai-hsiang.hsu@eurecom.fr
* \note
* \warning
*/
#ifndef _RRC_LIST_H_
#define _RRC_LIST_H_
#define RRC_LIST_TYPE(T, N) \
struct { \
T *entries[N]; \
int next[N]; \
int prev[N]; \
int start; \
int count; \
}
// initial function for the certain list, storage number of entry, initial pointer and corresponding links
#define RRC_LIST_INIT(list, c) \
do { \
int iterator; \
(list).count = (c); \
for(iterator=0; iterator<c; ++iterator){ \
(list).entries[iterator] = NULL; \
(list).next[iterator] = -1; \
(list).prev[iterator] = -1; \
(list).start = -1; \
} \
}while(0)
// check the entry by id first then update or create new entry.
#define RRC_LIST_MOD_ADD(list, new, id_name) \
do { \
int iterator; \
for(iterator=(list).start; iterator!=-1; iterator=(list).next[iterator]){ \
if((new)->id_name == (list).entries[iterator]->id_name){ \
(list).entries[iterator] = (new); \
break; \
} \
} \
if(iterator==-1){ \
for(iterator=0; iterator<(list).count; ++iterator){ \
if((list).entries[iterator] == NULL){ \
(list).next[iterator] = (list).start; \
(list).prev[iterator] = -1; \
if((list).start != -1){ \
(list).prev[list.start] = iterator; \
} \
(list).start = iterator; \
(list).entries[iterator] = (new); \
break; \
} \
} \
} \
}while(0)
// search entries by id, unlink from the list and output free pointer for upper function to release memory
#define RRC_LIST_MOD_REL(list, id_name, id, free) \
do{ \
int iterator; \
for(iterator=(list).start; iterator!=-1; iterator=(list).next[iterator]){ \
if(id == (list).entries[iterator]->id_name){ \
if((list).prev[iterator] == -1){ \
(list).start = (list).next[iterator]; \
}else{ \
(list).next[(list).prev[iterator]] = (list).next[iterator]; \
} \
if((list).next[iterator] != -1){ \
(list).prev[(list).next[iterator]] = (list).prev[iterator]; \
} \
(free) = (list).entries[iterator]; \
(list).entries[iterator] = NULL; \
break; \
} \
} \
}while(0)
#define RRC_LIST_FOREACH(list, i) \
for((i)=(list).start; (i) != -1; (i)=(list).next[i])
#define RRC_LIST_ENTRY(list, i) \
list.entries[i]
#endif
openair2/RRC/NR_UE/rrc_proto.h
View file @
8e71ca86
...
...
@@ -40,6 +40,7 @@
#include "NR_CellGroupConfig.h"
#include "NR_RadioBearerConfig.h"
#include "openair2/PHY_INTERFACE/queue_t.h"
#include "common/utils/ocp_itti/intertask_interface.h"
extern
queue_t
nr_rach_ind_queue
;
extern
queue_t
nr_rx_ind_queue
;
...
...
@@ -82,11 +83,6 @@ int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCR
\param meas_config measurement configuration*/
int8_t
nr_rrc_ue_process_meas_config
(
NR_MeasConfig_t
*
meas_config
);
/**\prief Process secondary cell group config from NR RRC connection reconfiguration message or EN-DC primitives
\param cell_group_config secondary cell group configuration*/
//TODO check EN-DC function call flow.
int8_t
nr_rrc_ue_process_scg_config
(
const
module_id_t
module_id
,
NR_CellGroupConfig_t
*
cell_group_config
);
/**\prief Process radio bearer config from NR RRC connection reconfiguration message
\param radio_bearer_config radio bearer configuration*/
int8_t
nr_rrc_ue_process_radio_bearer_config
(
NR_RadioBearerConfig_t
*
radio_bearer_config
);
...
...
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