Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
spbro
OpenXG-RAN
Commits
d01c1470
Commit
d01c1470
authored
Feb 13, 2024
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_PSBCH_MERGE2' into integration_2024_w06
parents
0e531b44
4d411dbc
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
1475 additions
and
21 deletions
+1475
-21
CMakeLists.txt
CMakeLists.txt
+2
-0
executables/nr-ue.c
executables/nr-ue.c
+2
-0
executables/softmodem-common.h
executables/softmodem-common.h
+3
-10
nfapi/open-nFAPI/nfapi/public_inc/sidelink_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/sidelink_nr_ue_interface.h
+2
-2
openair2/COMMON/mac_messages_def.h
openair2/COMMON/mac_messages_def.h
+1
-0
openair2/COMMON/mac_messages_types.h
openair2/COMMON/mac_messages_types.h
+12
-0
openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
+533
-0
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+4
-0
openair2/LAYER2/NR_MAC_UE/mac_defs_sl.h
openair2/LAYER2/NR_MAC_UE/mac_defs_sl.h
+157
-0
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+24
-0
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures_sl.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures_sl.c
+524
-0
openair2/RRC/NR_UE/L2_interface_ue.c
openair2/RRC/NR_UE/L2_interface_ue.c
+26
-0
openair2/RRC/NR_UE/rrc_UE.c
openair2/RRC/NR_UE/rrc_UE.c
+23
-3
openair2/RRC/NR_UE/rrc_defs.h
openair2/RRC/NR_UE/rrc_defs.h
+6
-0
openair2/RRC/NR_UE/rrc_proto.h
openair2/RRC/NR_UE/rrc_proto.h
+14
-1
openair2/RRC/NR_UE/rrc_sl_preconfig.c
openair2/RRC/NR_UE/rrc_sl_preconfig.c
+142
-5
No files found.
CMakeLists.txt
View file @
d01c1470
...
...
@@ -1384,9 +1384,11 @@ set (MAC_NR_SRC_UE
${
NR_UE_PHY_INTERFACE_DIR
}
/NR_IF_Module.c
${
NR_UE_PHY_INTERFACE_DIR
}
/NR_Packet_Drop.c
${
NR_UE_MAC_DIR
}
/config_ue.c
${
NR_UE_MAC_DIR
}
/config_ue_sl.c
${
NR_UE_MAC_DIR
}
/mac_vars.c
${
NR_UE_MAC_DIR
}
/main_ue_nr.c
${
NR_UE_MAC_DIR
}
/nr_ue_procedures.c
${
NR_UE_MAC_DIR
}
/nr_ue_procedures_sl.c
${
NR_UE_MAC_DIR
}
/nr_ue_scheduler.c
${
NR_UE_MAC_DIR
}
/nr_ue_dci_configuration.c
${
NR_UE_MAC_DIR
}
/nr_ra_procedures.c
...
...
executables/nr-ue.c
View file @
d01c1470
...
...
@@ -987,6 +987,8 @@ void init_NR_UE(int nb_inst, char *uecap_file, char *reconfig_file, char *rbconf
init_nsa_message
(
rrc_inst
,
reconfig_file
,
rbconfig_file
);
nr_rlc_activate_srb0
(
mac_inst
->
crnti
,
NULL
,
send_srb0_rrc
);
}
//TODO: Move this call to RRC
start_sidelink
((
&
rrc_inst
[
i
])
->
ue_id
);
}
}
...
...
executables/softmodem-common.h
View file @
d01c1470
...
...
@@ -106,11 +106,9 @@ extern "C"
#define CONFIG_L1_EMULATOR "Run in L1 emulated mode (disable PHY layer)\n"
#define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n"
#define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence"
#define CONFIG_HLP_SYNC_REF "Sync Reference in Sidelink\n"
#define CONFIG_HLP_NID1 "Set NID1 value in Sidelink\n"
#define CONFIG_HLP_NID2 "Set NID2 value in Sidelink\n"
#define CONFIG_HLP_NOITTI "Do not start itti threads, call queue processing in place, inside the caller thread"
#define CONFIG_HLP_LDPC_OFFLOAD "Enable LDPC offload to AMD Xilinx T2 telco card\n"
#define CONFIG_HLP_SYNC_REF "UE acts a Sync Reference in Sidelink. 0-none 1-GNB 2-GNSS 4-localtiming\n"
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
/* command line parameters common to eNodeB and UE */
...
...
@@ -143,8 +141,6 @@ extern "C"
#define EMULATE_L1 softmodem_params.emulate_l1
#define CONTINUOUS_TX softmodem_params.continuous_tx
#define SYNC_REF softmodem_params.sync_ref
#define NID1 softmodem_params.nid1
#define NID2 softmodem_params.nid2
#define LDPC_OFFLOAD_FLAG softmodem_params.ldpc_offload_flag
#define REORDER_THREAD_DISABLE softmodem_params.reorder_thread_disable
...
...
@@ -191,10 +187,9 @@ extern int usrp_tx_thread;
{"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, .iptr=&EMULATE_L1, .defintval=0, TYPE_INT, 0}, \
{"continuous-tx", CONFIG_HLP_CONTINUOUS_TX, PARAMFLAG_BOOL, .iptr=&CONTINUOUS_TX, .defintval=0, TYPE_INT, 0}, \
{"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, .iptr=&stats_disabled, .defintval=0, TYPE_INT, 0}, \
{"nid1", CONFIG_HLP_NID1, 0, .iptr=&NID1, .defintval=10, TYPE_INT, 0}, \
{"nid2", CONFIG_HLP_NID2, 0, .iptr=&NID2, .defintval=1, TYPE_INT, 0}, \
{"no-itti-threads", CONFIG_HLP_NOITTI, PARAMFLAG_BOOL, .iptr=&softmodem_params.no_itti, .defintval=0, TYPE_INT, 0}, \
{"ldpc-offload-enable", CONFIG_HLP_LDPC_OFFLOAD, PARAMFLAG_BOOL, .iptr=&LDPC_OFFLOAD_FLAG, .defstrval=0, TYPE_INT, 0}, \
{"sync-ref", CONFIG_HLP_SYNC_REF, 0, .uptr=&SYNC_REF, .defintval=0, TYPE_UINT, 0}, \
}
// clang-format on
...
...
@@ -353,9 +348,7 @@ typedef struct {
int
non_stop
;
int
emulate_l1
;
int
continuous_tx
;
int
sync_ref
;
int
nid1
;
int
nid2
;
uint32_t
sync_ref
;
int
no_itti
;
int
ldpc_offload_flag
;
}
softmodem_params_t
;
...
...
nfapi/open-nFAPI/nfapi/public_inc/sidelink_nr_ue_interface.h
View file @
d01c1470
...
...
@@ -351,7 +351,7 @@ typedef struct
uint16_t
sl_bandwidth
;
//Absolute frequency of SL point A in KHz
//n38 (2570-2620 Mhz), n47 (5855-5925 Mhz) are defined.
uint
32
_t
sl_frequency
;
uint
64
_t
sl_frequency
;
//Only 1 SCS-SpecificCarrier allowed for NR-SL communication
uint16_t
sl_grid_size
;
// bandwidth for each numerology
...
...
@@ -363,7 +363,7 @@ typedef struct
uint8_t
sl_frequency_shift_7p5khz
;
//Indicates presence of +/-5Khz shift wrt FREF for V2X reference frequencies.
//Possible values: {-1,0,1}
u
int8_t
sl_value_N
;
int8_t
sl_value_N
;
}
sl_nr_carrier_config_t
;
...
...
openair2/COMMON/mac_messages_def.h
View file @
d01c1470
...
...
@@ -57,4 +57,5 @@ MESSAGE_DEF(RRC_MAC_DRX_CONFIG_REQ, MESSAGE_PRIORITY_MED, rrc_mac_drx_config_req
// gNB
MESSAGE_DEF
(
NR_RRC_MAC_CCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacCcchDataInd
,
nr_rrc_mac_ccch_data_ind
)
MESSAGE_DEF
(
NR_RRC_MAC_BCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacBcchDataInd
,
nr_rrc_mac_bcch_data_ind
)
MESSAGE_DEF
(
NR_RRC_MAC_SBCCH_DATA_IND
,
MESSAGE_PRIORITY_MED_PLUS
,
NRRrcMacSBcchDataInd
,
nr_rrc_mac_sbcch_data_ind
)
openair2/COMMON/mac_messages_types.h
View file @
d01c1470
...
...
@@ -41,6 +41,7 @@
#define RRC_MAC_BCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_req
#define RRC_MAC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_data_ind
#define NR_RRC_MAC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_bcch_data_ind
#define NR_RRC_MAC_SBCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_sbcch_data_ind
#define RRC_MAC_BCCH_MBMS_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_req
#define RRC_MAC_BCCH_MBMS_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_bcch_mbms_data_ind
...
...
@@ -119,6 +120,17 @@ typedef struct NRRrcMacBcchDataInd_s {
uint8_t
rsrp
;
}
NRRrcMacBcchDataInd
;
typedef
struct
NRRrcMacSBcchDataInd_s
{
uint32_t
frame
;
uint8_t
slot
;
uint32_t
sdu_size
;
uint8_t
sdu
[
BCCH_SDU_SIZE
];
uint8_t
gnb_index
;
uint16_t
rx_slss_id
;
uint8_t
rsrq
;
uint8_t
rsrp
;
}
NRRrcMacSBcchDataInd
;
typedef
struct
RrcMacBcchMbmsDataReq_s
{
uint32_t
frame
;
uint32_t
sdu_size
;
...
...
openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
0 → 100644
View file @
d01c1470
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
d01c1470
...
...
@@ -47,6 +47,7 @@
#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
#include "LAYER2/MAC/mac.h"
#include "NR_MAC_COMMON/nr_mac_extern.h"
#include "mac_defs_sl.h"
/* RRC */
#include "NR_DRX-Config.h"
...
...
@@ -543,6 +544,9 @@ typedef struct NR_UE_MAC_INST_s {
pthread_mutex_t
mutex_dl_info
;
//SIDELINK MAC PARAMETERS
sl_nr_ue_mac_params_t
*
SL_MAC_PARAMS
;
}
NR_UE_MAC_INST_t
;
/*@}*/
...
...
openair2/LAYER2/NR_MAC_UE/mac_defs_sl.h
0 → 100644
View file @
d01c1470
/*
* 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 __MAC_DEFS_SL_H__
#define __MAC_DEFS_SL_H__
#include "sidelink_nr_ue_interface.h"
#include "NR_SL-ResourcePool-r16.h"
#include "NR_TDD-UL-DL-ConfigCommon.h"
#include "NR_MAC_COMMON/nr_mac.h"
#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
#define SL_NR_MAC_NUM_RX_RESOURCE_POOLS 1
#define SL_NR_MAC_NUM_TX_RESOURCE_POOLS 1
#define SL_NUM_BYTES_TIMERESOURCEBITMAP 20
// Size of Fixed fields prio (3), sci_2ndstage(2),
// betaoffsetindicator(2), num dmrs ports (1), mcs (5bits)
#define SL_SCI_FORMAT_1A_LEN_IN_BITS_FIXED_FIELDS 13
#define NR_SBCCH_SL_BCH 0xFF
#define sci_field_t dci_field_t
typedef
struct
sidelink_sci_format_1a_fields
{
// Priority of this transmission
uint8_t
priority
;
//3 bits
//Indicates the format to be used in 2nd stage i.e SCI format 2 sent on PSSCH
//00 - SCI FORMAT 2A, 01 - SCI FORMAT 2B, 10, 11 - Reserved
//Spec 38.212 Table 8.3.1.1-1
uint8_t
sci_format_2nd_stage
;
//2 bits
//Num modulated symbols for stage 2 SCI - TBD:
// Spec 38.212 Table 8.3.1.1-2
uint8_t
beta_offset_indicator
;
//2 bits
//determine the number of layers for data on PSSCH
// Spec 38.212 Table 8.3.1.1-3
uint8_t
num_dmrs_ports
;
//1 bit
//Modulation and coding scheme to be used for data on PSSCH
uint8_t
mcs
;
//5 bits
//Identifies the frequence resource (subchannels) to be used for PSSCH/PSCCH
//sl-MaxNumPerReserve is 2 - ceil(log2(N_subch*(N_subch+1)/2)) bits
//sl-MaxNumPerReserve is 3 - ceil(log2(N_subch*(N_subch+1)(2*N_subch+1)/6)) bits
sci_field_t
frequency_resource_assignment
;
//variable
//Identifies the Time resource (slots) to be used for PSSCH/PSCCH
//sl-MaxNumPerReserve is 2 - 5 bits
//sl-MaxNumPerReserve is 3 - 9 bits
sci_field_t
time_resource_assignment
;
//variable
//TBD:
//sl-MultiReserveResource is not configured - 0 bits
//sl-MultiReserveResource is configured - ceil(log2(number of entries in sl-ResourceReservePeriodList)) bits
sci_field_t
resource_reservation_period
;
//variable
//Identifies the DMRS Pattern to be used on PSSCH
//ceil(log2(number of dmrs patterns in sl-PSSCH-DMRS-TimePatternList)) bits
sci_field_t
dmrs_pattern
;
//variable
//Identifies the TABLE to be used to determine MCS on PSSCH
//1 table configured in sl-Additional-MCS-Table - 1 bit
//2 tables configured in sl-Additional-MCS-Table - 2 bits
//Not configured- 0 bits
sci_field_t
additional_mcs_table_indicator
;
//variable
//Identifies the number of symbols for PSFCH
//sl-PSFCH-Period Not configured- 0 bits
//if sl-PSFCH-Period configured and value 2 or 4 - 1 bit
sci_field_t
psfch_overhead_indication
;
//variable
//number of bits determined by sl-NumReservedbits
//Value encoded is 0
sci_field_t
reserved_bits
;
}
sidelink_sci_format_1a_fields_t
;
typedef
struct
SL_ResourcePool_params
{
//This holds the structure from RRC
NR_SL_ResourcePool_r16_t
*
respool
;
//NUM Subchannels in this resource pool
uint16_t
num_subch
;
//SCI-1A length is the same for this resource pool.
uint16_t
sci_1a_len
;
//SCI-1A configuration according to RESPOOL configured.
sidelink_sci_format_1a_fields_t
sci_1a
;
}
SL_ResourcePool_params_t
;
typedef
struct
sl_ssb_timealloc
{
uint32_t
sl_NumSSB_WithinPeriod
;
uint32_t
sl_TimeOffsetSSB
;
uint32_t
sl_TimeInterval
;
}
sl_ssb_timealloc_t
;
typedef
struct
sl_bch_params
{
//configured from RRC
//Parameters used to determine PSBCH slot
sl_ssb_timealloc_t
ssb_time_alloc
;
uint16_t
slss_id
;
bool
status
;
uint8_t
sl_mib
[
4
];
//Parameters incremented by MAC PSBCH scheduler
//after every SSB txn/reception
uint16_t
num_ssb
;
uint16_t
ssb_slot
;
}
sl_bch_params_t
;
typedef
struct
sl_nr_ue_mac_params
{
//Holds the RX resource pool from RRC and its related parameters
SL_ResourcePool_params_t
*
sl_RxPool
[
SL_NR_MAC_NUM_RX_RESOURCE_POOLS
];
//Holds the TX resource pool from RRC and its related parameters
SL_ResourcePool_params_t
*
sl_TxPool
[
SL_NR_MAC_NUM_TX_RESOURCE_POOLS
];
//Holds either the TDD config from RRC
//or TDD config decoded from SL-MIB
NR_TDD_UL_DL_ConfigCommon_t
*
sl_TDD_config
;
//Configured from RRC
uint32_t
sl_MaxNumConsecutiveDTX
;
uint32_t
sl_SSB_PriorityNR
;
uint8_t
sl_CSI_Acquisition
;
//MAC prepares this and sends it to PHY
nr_sl_phy_config_t
sl_phy_config
;
//Holds Broadcast params incase UE sends Sidelink SSB
sl_bch_params_t
tx_sl_bch
;
//Holds Broadcast params incase UE receives SL-SSB
sl_bch_params_t
rx_sl_bch
;
}
sl_nr_ue_mac_params_t
;
#endif
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
d01c1470
...
...
@@ -515,4 +515,28 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
RAR_grant_t
*
rar_grant
,
uint16_t
rnti
,
const
nr_dci_format_t
dci_format
);
int
nr_rrc_mac_config_req_sl_preconfig
(
module_id_t
module_id
,
NR_SL_PreconfigurationNR_r16_t
*
sl_preconfiguration
,
uint8_t
sync_source
);
void
nr_rrc_mac_transmit_slss_req
(
module_id_t
module_id
,
uint8_t
*
sl_mib_payload
,
uint16_t
tx_slss_id
,
NR_SL_SSB_TimeAllocation_r16_t
*
ssb_ta
);
void
nr_rrc_mac_config_req_sl_mib
(
module_id_t
module_id
,
NR_SL_SSB_TimeAllocation_r16_t
*
ssb_ta
,
uint16_t
rx_slss_id
,
uint8_t
*
sl_mib
);
void
sl_prepare_psbch_payload
(
NR_TDD_UL_DL_ConfigCommon_t
*
TDD_UL_DL_Config
,
uint8_t
*
bits_0_to_7
,
uint8_t
*
bits_8_to_11
,
uint8_t
mu
,
uint8_t
L
,
uint8_t
Y
);
uint8_t
sl_decode_sl_TDD_Config
(
NR_TDD_UL_DL_ConfigCommon_t
*
TDD_UL_DL_Config
,
uint8_t
bits_0_to_7
,
uint8_t
bits_8_to_11
,
uint8_t
mu
,
uint8_t
L
,
uint8_t
Y
);
uint8_t
sl_determine_sci_1a_len
(
uint16_t
*
num_subchannels
,
NR_SL_ResourcePool_r16_t
*
rpool
,
sidelink_sci_format_1a_fields_t
*
sci_1a
);
#endif
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures_sl.c
0 → 100644
View file @
d01c1470
This diff is collapsed.
Click to expand it.
openair2/RRC/NR_UE/L2_interface_ue.c
View file @
d01c1470
...
...
@@ -94,6 +94,32 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id,
AssertFatal
(
false
,
"use RLC instead
\n
"
);
break
;
case
NR_SBCCH_SL_BCH
:
if
(
pdu_len
>
0
)
{
LOG_T
(
NR_RRC
,
"[UE %d] Received SL-MIB for NR_SBCCH_SL_BCH.
\n
"
,
module_id
);
MessageDef
*
message_p
;
int
msg_sdu_size
=
BCCH_SDU_SIZE
;
if
(
pdu_len
>
msg_sdu_size
)
{
LOG_E
(
NR_RRC
,
"SDU larger than NR_SBCCH_SL_BCH SDU buffer size (%d, %d)"
,
sdu_size
,
msg_sdu_size
);
sdu_size
=
msg_sdu_size
;
}
else
{
sdu_size
=
pdu_len
;
}
message_p
=
itti_alloc_new_message
(
TASK_MAC_UE
,
0
,
NR_RRC_MAC_SBCCH_DATA_IND
);
memset
(
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
sdu
,
0
,
BCCH_SDU_SIZE
);
memcpy
(
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
sdu
,
pduP
,
sdu_size
);
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
frame
=
frame
;
//frameP
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
slot
=
slot
;
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
sdu_size
=
sdu_size
;
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
gnb_index
=
gNB_index
;
NR_RRC_MAC_SBCCH_DATA_IND
(
message_p
).
rx_slss_id
=
rnti
;
//rx_slss_id is rnti
itti_send_msg_to_task
(
TASK_RRC_NRUE
,
GNB_MODULE_ID_TO_INSTANCE
(
module_id
),
message_p
);
}
break
;
default:
break
;
}
...
...
openair2/RRC/NR_UE/rrc_UE.c
View file @
d01c1470
...
...
@@ -324,10 +324,8 @@ NR_UE_RRC_INST_t* nr_rrc_init_ue(char* uecap_file, int nb_inst)
// SRB0 activated by default
ptr
->
Srb
[
0
]
=
RB_ESTABLISHED
;
}
}
if
(
get_softmodem_params
()
->
sl_mode
)
{
configure_NR_SL_Preconfig
(
get_softmodem_params
()
->
sync_ref
);
init_sidelink
(
rrc
);
}
return
NR_UE_rrc_inst
;
...
...
@@ -1437,6 +1435,14 @@ void *rrc_nrue(void *notUsed)
nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message
(
rrc
,
bcch
->
gnb_index
,
bcch
->
sdu
,
bcch
->
sdu_size
,
bcch
->
rsrq
,
bcch
->
rsrp
);
break
;
case
NR_RRC_MAC_SBCCH_DATA_IND
:
LOG_D
(
NR_RRC
,
"[UE %ld] Received %s: gNB %d
\n
"
,
instance
,
ITTI_MSG_NAME
(
msg_p
),
NR_RRC_MAC_SBCCH_DATA_IND
(
msg_p
).
gnb_index
);
NRRrcMacSBcchDataInd
*
sbcch
=
&
NR_RRC_MAC_SBCCH_DATA_IND
(
msg_p
);
nr_rrc_ue_decode_NR_SBCCH_SL_BCH_Message
(
rrc
,
sbcch
->
gnb_index
,
sbcch
->
frame
,
sbcch
->
slot
,
sbcch
->
sdu
,
sbcch
->
sdu_size
,
sbcch
->
rx_slss_id
);
break
;
case
NR_RRC_MAC_CCCH_DATA_IND
:
{
NRRrcMacCcchDataInd
*
ind
=
&
NR_RRC_MAC_CCCH_DATA_IND
(
msg_p
);
nr_rrc_ue_decode_ccch
(
rrc
,
ind
,
0
);
...
...
@@ -1921,3 +1927,17 @@ void handle_t300_expiry(NR_UE_RRC_INST_t *rrc)
// TODO handle connEstFailureControl
// TODO inform upper layers about the failure to establish the RRC connection
}
//This calls the sidelink preconf message after RRC, MAC instances are created.
void
start_sidelink
(
int
instance
)
{
NR_UE_RRC_INST_t
*
rrc
=
&
NR_UE_rrc_inst
[
instance
];
if
(
get_softmodem_params
()
->
sl_mode
==
2
)
{
//Process the Sidelink Preconfiguration
rrc_ue_process_sidelink_Preconfiguration
(
rrc
,
get_softmodem_params
()
->
sync_ref
);
}
}
openair2/RRC/NR_UE/rrc_defs.h
View file @
d01c1470
...
...
@@ -54,6 +54,8 @@
#include "NR_DL-DCCH-Message.h"
#include "NR_SystemInformation.h"
#include "NR_UE-NR-Capability.h"
#include "NR_SL-PreconfigurationNR-r16.h"
#include "NR_MasterInformationBlockSidelink.h"
#include "RRC/NR/nr_rrc_common.h"
#include "as_message.h"
...
...
@@ -210,6 +212,10 @@ typedef struct NR_UE_RRC_INST_s {
long
selected_plmn_identity
;
Rrc_State_NR_t
nrRrcState
;
as_nas_info_t
initialNasMsg
;
//Sidelink params
NR_SL_PreconfigurationNR_r16_t
*
sl_preconfig
;
}
NR_UE_RRC_INST_t
;
#endif
openair2/RRC/NR_UE/rrc_proto.h
View file @
d01c1470
...
...
@@ -121,7 +121,20 @@ void handle_rlf_sync(NR_UE_Timers_Constants_t *tac, nr_sync_msg_t sync_msg);
void
nr_rrc_handle_SetupRelease_RLF_TimersAndConstants
(
NR_UE_RRC_INST_t
*
rrc
,
struct
NR_SetupRelease_RLF_TimersAndConstants
*
rlf_TimersAndConstants
);
int
configure_NR_SL_Preconfig
(
int
sync_source
);
int
configure_NR_SL_Preconfig
(
NR_UE_RRC_INST_t
*
rrc
,
int
sync_source
);
void
init_sidelink
(
NR_UE_RRC_INST_t
*
rrc
);
void
start_sidelink
(
int
instance
);
void
rrc_ue_process_sidelink_Preconfiguration
(
NR_UE_RRC_INST_t
*
rrc_inst
,
int
sync_ref
);
void
nr_rrc_ue_decode_NR_SBCCH_SL_BCH_Message
(
NR_UE_RRC_INST_t
*
rrc
,
const
uint8_t
gNB_index
,
const
frame_t
frame
,
const
int
slot
,
uint8_t
*
pduP
,
const
sdu_size_t
pdu_len
,
const
uint16_t
rx_slss_id
);
/** @}*/
#endif
...
...
openair2/RRC/NR_UE/rrc_sl_preconfig.c
View file @
d01c1470
...
...
@@ -27,6 +27,17 @@
#include "common/utils/LOG/log.h"
#include "sl_preconfig_paramvalues.h"
#include "common/config/config_userapi.h"
#include "rrc_defs.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
#include "nr-uesoftmodem.h"
void
free_sl_rrc
(
NR_UE_RRC_INST_t
*
rrc
)
{
if
(
rrc
->
sl_preconfig
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_SL_PreconfigurationNR_r16
,
rrc
->
sl_preconfig
);
}
}
static
void
prepare_NR_SL_SyncConfig
(
NR_SL_SyncConfig_r16_t
*
sl_syncconfig
)
{
...
...
@@ -399,8 +410,7 @@ NR_SL_PreconfigurationNR_r16_t *prepare_NR_SL_PRECONFIGURATION(uint16_t num_tx_p
return
sl_preconfiguration
;
}
int
configure_NR_SL_Preconfig
(
int
sync_source
)
int
configure_NR_SL_Preconfig
(
NR_UE_RRC_INST_t
*
rrc
,
int
sync_source
)
{
NR_SL_PreconfigurationNR_r16_t
*
sl_preconfig
=
NULL
;
...
...
@@ -424,9 +434,136 @@ int configure_NR_SL_Preconfig(int sync_source)
}
}
ASN_STRUCT_FREE
(
asn_DEF_NR_SL_PreconfigurationNR_r16
,
sl_preconfig
);
sl_preconfig
=
NULL
;
//END.......
rrc
->
sl_preconfig
=
sl_preconfig
;
return
0
;
}
/*decode SL-BCH (SL-MIB) message*/
static
int8_t
nr_sl_rrc_ue_decode_SL_MIB
(
const
uint8_t
gNB_index
,
uint8_t
*
const
bufferP
,
const
uint8_t
buffer_len
)
{
NR_MasterInformationBlockSidelink_t
*
sl_mib
=
NULL
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_MasterInformationBlockSidelink
,
(
void
**
)
&
sl_mib
,
(
const
void
*
)
bufferP
,
buffer_len
);
int
ret
=
0
;
if
((
dec_rval
.
code
!=
RC_OK
)
||
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
NR_RRC
,
"SL-MIB decode error
\n
"
);
ret
=
-
1
;
}
else
{
int
bits_unused
=
sl_mib
->
directFrameNumber_r16
.
bits_unused
;
uint16_t
val_fn
=
sl_mib
->
directFrameNumber_r16
.
buf
[
0
];
val_fn
=
(
val_fn
<<
(
8
-
bits_unused
))
+
(
sl_mib
->
directFrameNumber_r16
.
buf
[
1
]
>>
bits_unused
);
uint8_t
val_slot
=
sl_mib
->
slotIndex_r16
.
buf
[
0
];
LOG_D
(
NR_RRC
,
"SL-RRC - Received MIB
\n
"
);
LOG_D
(
NR_RRC
,
"SL-MIB Contents - DFN:%d
\n
"
,
val_fn
);
LOG_D
(
NR_RRC
,
"SL-MIB Contents - SLOT:%d
\n
"
,
val_slot
>>
1
);
LOG_D
(
NR_RRC
,
"SL-MIB Contents - Incoverage:%d
\n
"
,
sl_mib
->
inCoverage_r16
);
LOG_D
(
NR_RRC
,
"SL-MIB Contents - sl-TDD-Config:%x
\n
"
,
*
((
uint16_t
*
)(
sl_mib
->
sl_TDD_Config_r16
.
buf
)));
ASN_STRUCT_FREE
(
asn_DEF_NR_MasterInformationBlockSidelink
,
sl_mib
);
}
return
ret
;
}
void
nr_rrc_ue_decode_NR_SBCCH_SL_BCH_Message
(
NR_UE_RRC_INST_t
*
rrc
,
const
uint8_t
gNB_index
,
const
frame_t
frame
,
const
int
slot
,
uint8_t
*
pduP
,
const
sdu_size_t
pdu_len
,
const
uint16_t
rx_slss_id
)
{
nr_sl_rrc_ue_decode_SL_MIB
(
gNB_index
,
(
uint8_t
*
)
pduP
,
pdu_len
);
DevAssert
(
rrc
->
sl_preconfig
);
NR_SL_FreqConfigCommon_r16_t
*
fcfg
=
NULL
;
if
(
rrc
->
sl_preconfig
->
sidelinkPreconfigNR_r16
.
sl_PreconfigFreqInfoList_r16
)
fcfg
=
rrc
->
sl_preconfig
->
sidelinkPreconfigNR_r16
.
sl_PreconfigFreqInfoList_r16
->
list
.
array
[
0
];
DevAssert
(
fcfg
);
NR_SL_SSB_TimeAllocation_r16_t
*
sl_SSB_TimeAllocation
=
NULL
;
//Current implementation only supports one SSB Timeallocation
//Extend RRC to use multiple SSB Time allocations TBD....
if
(
fcfg
->
sl_SyncConfigList_r16
)
sl_SSB_TimeAllocation
=
fcfg
->
sl_SyncConfigList_r16
->
list
.
array
[
0
]
->
sl_SSB_TimeAllocation1_r16
;
DevAssert
(
sl_SSB_TimeAllocation
);
nr_rrc_mac_config_req_sl_mib
(
rrc
->
ue_id
,
sl_SSB_TimeAllocation
,
rx_slss_id
,
pduP
);
return
;
}
void
rrc_ue_process_sidelink_Preconfiguration
(
NR_UE_RRC_INST_t
*
rrc_inst
,
sl_sync_source_enum_t
sync_source
)
{
AssertFatal
(
rrc_inst
,
"RRC instance not created.
\n
"
);
NR_SL_PreconfigurationNR_r16_t
*
sl_preconfig
=
rrc_inst
->
sl_preconfig
;
AssertFatal
(
rrc_inst
->
sl_preconfig
,
"Check if SL-preconfig was created"
);
AssertFatal
(
sync_source
!=
SL_SYNC_SOURCE_GNBENB
,
"Sync source GNB not supported
\n
"
);
nr_rrc_mac_config_req_sl_preconfig
(
rrc_inst
->
ue_id
,
sl_preconfig
,
sync_source
);
//TBD.. These should be chosen by RRC according to 3GPP 38.331 RRC specification.
//Currently hardcoding the values to these
uint16_t
slss_id
=
671
,
ssb_ta_index
=
1
;
//12 bits -sl-TDD-config will be filled by MAC
//Incoverage 1bit is FALSE as this is mode 2
//DFN, sfn will be filled by PHY
uint8_t
sl_mib_payload
[
4
]
=
{
0
,
0
,
0
,
0
};
NR_SL_SSB_TimeAllocation_r16_t
*
ssb_ta
=
NULL
;
NR_SL_FreqConfigCommon_r16_t
*
fcfg
=
NULL
;
NR_SL_SyncConfig_r16_t
*
synccfg
=
NULL
;
if
(
sl_preconfig
->
sidelinkPreconfigNR_r16
.
sl_PreconfigFreqInfoList_r16
)
fcfg
=
sl_preconfig
->
sidelinkPreconfigNR_r16
.
sl_PreconfigFreqInfoList_r16
->
list
.
array
[
0
];
AssertFatal
(
fcfg
,
"Fcfg cannot be NULL
\n
"
);
if
(
fcfg
->
sl_SyncConfigList_r16
)
synccfg
=
fcfg
->
sl_SyncConfigList_r16
->
list
.
array
[
0
];
AssertFatal
(
synccfg
,
"Synccfg cannot be NULL
\n
"
);
if
(
ssb_ta_index
==
1
)
ssb_ta
=
synccfg
->
sl_SSB_TimeAllocation1_r16
;
else
if
(
ssb_ta_index
==
2
)
ssb_ta
=
synccfg
->
sl_SSB_TimeAllocation2_r16
;
else
if
(
ssb_ta_index
==
3
)
ssb_ta
=
synccfg
->
sl_SSB_TimeAllocation3_r16
;
else
DevAssert
(
0
);
AssertFatal
(
ssb_ta
,
"SSB_timeallocation cannot be NULL
\n
"
);
if
(
sync_source
==
SL_SYNC_SOURCE_LOCAL_TIMING
||
sync_source
==
SL_SYNC_SOURCE_GNSS
)
nr_rrc_mac_transmit_slss_req
(
rrc_inst
->
ue_id
,
sl_mib_payload
,
slss_id
,
ssb_ta
);
}
//For Sidelink mode 2 operation this prepares the sidelink preconfiguration
void
init_sidelink
(
NR_UE_RRC_INST_t
*
rrc
)
{
int
sync_ref
=
get_softmodem_params
()
->
sync_ref
;
if
(
get_softmodem_params
()
->
sl_mode
==
2
)
{
//Preparation of the Sidelink PRE-Configuration message
configure_NR_SL_Preconfig
(
rrc
,
sync_ref
);
}
}
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