**Note**
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 7f01ce6745..bd4a1a72aa 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -48,6 +48,7 @@
#include "SCHED_NR/sched_nr.h"
#include "SCHED_NR/fapi_nr_l1.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/MODULATION/nr_modulation.h"
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 8271e66e2f..fb757a9f47 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -83,6 +83,8 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "executables/thread-common.h"
#include "NB_IoT_interface.h"
#include "x2ap_eNB.h"
+#include "ngap_gNB.h"
+#include "gnb_paramdef.h"
pthread_cond_t nfapi_sync_cond;
pthread_mutex_t nfapi_sync_mutex;
@@ -387,30 +389,52 @@ int create_gNB_tasks(uint32_t gnb_nb) {
return -1;
}*/
if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
- LOG_E(SCTP, "Create task for SCTP failed\n");
- return -1;
+ LOG_E(SCTP, "Create task for SCTP failed\n");
+ return -1;
}
if (is_x2ap_enabled()) {
- if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
- LOG_E(X2AP, "Create task for X2AP failed\n");
- }
+ if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
+ LOG_E(X2AP, "Create task for X2AP failed\n");
+ }
}
else {
- LOG_I(X2AP, "X2AP is disabled.\n");
+ LOG_I(X2AP, "X2AP is disabled.\n");
}
}
+
+ paramdef_t NETParams[] = GNBNETPARAMS_DESC;
+ char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+ sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+ config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
- if (EPC_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0)) {
+ for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++){
+ if( NETParams[i].strptr == NULL){
+ LOG_E(NGAP, "No configuration in the file.\n");
+ NGAP_CONF_MODE = 0;
+ }
+ else {
+ LOG_D(NGAP, "Configuration in the file: %s.\n",*NETParams[i].strptr);
+ }
+
+ }
+
+
+ if (AMF_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0)) {
if (gnb_nb > 0) {
- /*if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
+ /*
+ if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
LOG_E(SCTP, "Create task for SCTP failed\n");
return -1;
}
-
- if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
- LOG_E(S1AP, "Create task for S1AP failed\n");
- return -1;
- }*/
+ */
+ if(NGAP_CONF_MODE){
+ if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
+ LOG_E(NGAP, "Create task for NGAP failed\n");
+ return -1;
+ }
+ } else {
+ LOG_E(NGAP, "Ngap task not created\n");
+ }
if(!emulate_rf){
@@ -430,9 +454,9 @@ int create_gNB_tasks(uint32_t gnb_nb) {
if (gnb_nb > 0) {
if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
- LOG_E(GNB_APP, "Create task for gNB APP failed\n");
- return -1;
- }
+ LOG_E(GNB_APP, "Create task for gNB APP failed\n");
+ return -1;
+ }
LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
@@ -821,7 +845,8 @@ int main( int argc, char **argv )
}
openair0_cfg[0].threequarter_fs = threequarter_fs;
- EPC_MODE_ENABLED = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
+ AMF_MODE_ENABLED = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
+ NGAP_CONF_MODE = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
if (get_softmodem_params()->do_ra)
AssertFatal(get_softmodem_params()->phy_test == 0,"RA and phy_test are mutually exclusive\n");
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index c1c6e98a41..5191551ea3 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -355,7 +355,7 @@ static void UE_synch(void *arg) {
void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
- int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_tti_tx);
+ int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
uint8_t gNB_id = 0;
if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
@@ -370,16 +370,16 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
ul_indication.gNB_index = gNB_id;
ul_indication.cc_id = UE->CC_id;
ul_indication.frame_rx = proc->frame_rx;
- ul_indication.slot_rx = proc->nr_tti_rx;
+ ul_indication.slot_rx = proc->nr_slot_rx;
ul_indication.frame_tx = proc->frame_tx;
- ul_indication.slot_tx = proc->nr_tti_tx;
+ ul_indication.slot_tx = proc->nr_slot_tx;
+ ul_indication.thread_id = proc->thread_id;
UE->if_inst->ul_indication(&ul_indication);
}
if (UE->mode != loop_through_memory) {
- uint8_t thread_id = PHY_vars_UE_g[UE->Mod_id][0]->current_thread_id[proc->nr_tti_rx];
- phy_procedures_nrUE_TX(UE,proc,0,thread_id);
+ phy_procedures_nrUE_TX(UE,proc,0);
}
}
}
@@ -387,7 +387,7 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
- int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_tti_rx);
+ int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
uint8_t gNB_id = 0;
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
@@ -400,7 +400,8 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
dl_indication.gNB_index = gNB_id;
dl_indication.cc_id = UE->CC_id;
dl_indication.frame = proc->frame_rx;
- dl_indication.slot = proc->nr_tti_rx;
+ dl_indication.slot = proc->nr_slot_rx;
+ dl_indication.thread_id = proc->thread_id;
UE->if_inst->dl_indication(&dl_indication, NULL);
}
@@ -411,16 +412,16 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
#else
uint64_t a=rdtsc();
phy_procedures_nrUE_RX( UE, proc, 0, UE->mode);
- LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_tti_rx, (rdtsc()-a)/3500);
+ LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_slot_rx, (rdtsc()-a)/3500);
//printf(">>> nr_ue_pdcch_procedures ended\n");
#endif
- if(IS_SOFTMODEM_NOS1){ //&& proc->nr_tti_rx==1
+ if(IS_SOFTMODEM_NOS1){ //&& proc->nr_slot_rx==1
//Hardcoded rnti value
protocol_ctxt_t ctxt;
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO,
0x1234, proc->frame_rx,
- proc->nr_tti_rx, 0);
+ proc->nr_slot_rx, 0);
pdcp_run(&ctxt);
}
}
@@ -435,7 +436,8 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
UE->ul_indication.gNB_index = 0;
UE->ul_indication.cc_id = 0;
UE->ul_indication.frame = proc->frame_rx;
- UE->ul_indication.slot = proc->nr_tti_rx;
+ UE->ul_indication.slot = proc->nr_slot_rx;
+ UE->ul_indication.thread_id = proc->thread_id;
UE->if_inst->ul_indication(&UE->ul_indication);
}
}
@@ -470,7 +472,7 @@ void UE_processing(void *arg) {
if (UE->mac_enabled == 1) {
uint8_t gNB_id = 0;
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
- int slot_tx = proc->nr_tti_tx;
+ int slot_tx = proc->nr_slot_tx;
int frame_tx = proc->frame_tx;
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
@@ -688,14 +690,12 @@ void *UE_thread(void *arg) {
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(msgToPush);
curMsg->UE=UE;
// update thread index for received subframe
- curMsg->UE->current_thread_id[slot_nr] = thread_idx;
- curMsg->proc.CC_id = UE->CC_id;
- curMsg->proc.nr_tti_rx= slot_nr;
- curMsg->proc.subframe_rx=slot_nr/(nb_slot_frame/10);
- curMsg->proc.nr_tti_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
- curMsg->proc.subframe_tx=curMsg->proc.nr_tti_rx;
- curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
- curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
+ curMsg->proc.thread_id = thread_idx;
+ curMsg->proc.CC_id = UE->CC_id;
+ curMsg->proc.nr_slot_rx = slot_nr;
+ curMsg->proc.nr_slot_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
+ curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
+ curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
curMsg->proc.decoded_frame_rx=-1;
//LOG_I(PHY,"Process slot %d thread Idx %d total gain %d\n", slot_nr, thread_idx, UE->rx_total_gain_dB);
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 87a4d6f6af..da84901602 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -472,6 +472,21 @@ typedef struct {
uint8_t cbgti;
uint8_t codeBlockGroupFlushIndicator;
// to be check the fields needed to L1 with NR_DL_UE_HARQ_t and NR_UE_DLSCH_t
+ // PTRS [TS38.214, sec 5.1.6.3]
+ /// PT-RS antenna ports [TS38.214, sec 5.1.6.3] [TS38.211, table 7.4.1.2.2-1] Bitmap occupying the 6 LSBs with: bit 0: antenna port 1000 bit 5: antenna port 1005 and for each bit 0: PTRS port not used 1: PTRS port used
+ uint8_t PTRSPortIndex ;
+ /// PT-RS time density [TS38.214, table 5.1.6.3-1] 0: 1 1: 2 2: 4
+ uint8_t PTRSTimeDensity;
+ /// PT-RS frequency density [TS38.214, table 5.1.6.3-2] 0: 2 1: 4
+ uint8_t PTRSFreqDensity;
+ /// PT-RS resource element offset [TS38.211, table 7.4.1.2.2-1] Value: 0->3
+ uint8_t PTRSReOffset;
+ /// PT-RS-to-PDSCH EPRE ratio [TS38.214, table 4.1-2] Value :0->3
+ uint8_t nEpreRatioOfPDSCHToPTRS;
+ /// MCS table for this DLSCH
+ uint8_t mcs_table;
+
+ uint16_t pduBitmap;
} fapi_nr_dl_config_dlsch_pdu_rel15_t;
typedef struct {
@@ -783,7 +798,7 @@ typedef struct {
} fapi_nr_pusch_power_control_t;
typedef enum {tx_config_codebook = 1, tx_config_nonCodebook = 2} tx_config_t;
-typedef enum {transform_precoder_disabled = 0, transform_precoder_enabled = 1} transform_precoder_t;
+typedef enum {transform_precoder_enabled = 0, transform_precoder_disabled = 1} transform_precoder_t;
typedef enum {
codebook_subset_fullyAndPartialAndNonCoherent = 1,
codebook_subset_partialAndNonCoherent = 2,
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 24e41d7bfb..9c74f3dba4 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -393,6 +393,9 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
// the allocated memory size is fixed:
AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
@@ -413,6 +416,9 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
+ pdsch->ptrs_re_per_slot[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * 14);
+ pdsch->ptrs_phase_per_slot[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
+ pdsch->dl_ch_ptrs_estimates_ext[idx]= (int32_t *)malloc16_clear( sizeof(int32_t) * num);
}
}
}
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index d2c28a448f..ba4147e5cd 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -284,9 +284,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp->slots_per_frame = 10* fp->slots_per_subframe;
- fp->nb_antenna_ports_gNB = 1; // default value until overwritten by RRCConnectionReconfiguration
- fp->nb_antennas_rx = 1; // default value until overwritten by RRCConnectionReconfiguration
- fp->nb_antennas_tx = 1; // default value until overwritten by RRCConnectionReconfiguration
+ fp->nb_antenna_ports_gNB = cfg->carrier_config.num_tx_ant.value;// It corresponds to pdsch_AntennaPorts
+ fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
+ fp->nb_antennas_tx = 1; // It corresponds to the number of UE Tx antennas
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
diff --git a/openair1/PHY/MODULATION/modulation_UE.h b/openair1/PHY/MODULATION/modulation_UE.h
index 228299095f..72a1334fe9 100644
--- a/openair1/PHY/MODULATION/modulation_UE.h
+++ b/openair1/PHY/MODULATION/modulation_UE.h
@@ -49,12 +49,14 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int reset_freq_est);
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
- unsigned char l,
- unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ UE_nr_rxtx_proc_t *proc,
+ unsigned char l,
+ unsigned char Ns,
+ int sample_offset,
+ int no_prefix);
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
int sample_offset,
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index f62880007d..60b28d4ad1 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -37,6 +37,7 @@
#endif*/
int nr_slot_fep(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
int sample_offset,
@@ -125,7 +126,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
}
for (aa=0; aa
nb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset - SOFFSET;
// Align with 256 bit
@@ -157,14 +158,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
(void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
#endif
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
@@ -185,11 +186,11 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
(void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
frame_parms->ofdm_symbol_size*sizeof(int));
dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
}
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
@@ -206,9 +207,9 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
- rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
(int16_t*)&rot2,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
@@ -222,6 +223,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
}
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
int sample_offset,
@@ -310,7 +312,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
}
for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset - SOFFSET;
// Align with 256 bit
@@ -342,7 +344,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
(void *) &common_vars->rxdata[aa][rx_offset],
frame_parms->ofdm_symbol_size*sizeof(int));
dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats);
@@ -350,7 +352,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
#endif
@@ -371,10 +373,10 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
(void *) &common_vars->rxdata[aa][rx_offset],
frame_parms->ofdm_symbol_size*sizeof(int));
dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly
dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
}
#if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats);
@@ -393,9 +395,9 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
#endif
- rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
(int16_t*)&rot2,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index b6388fb903..27c1ef2ac6 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -25,6 +25,7 @@
#include "nr_ul_estimation.h"
#include "PHY/sse_intrin.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
@@ -533,384 +534,107 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
* 3) Compensated DMRS based estimated signal with PTRS estimation for slot
*********************************************************************/
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
+ NR_DL_FRAME_PARMS *frame_parms,
nfapi_nr_pusch_pdu_t *rel15_ul,
uint8_t ulsch_id,
uint8_t nr_tti_rx,
- uint8_t dmrs_symbol_flag,
unsigned char symbol,
uint32_t nb_re_pusch)
{
- NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
- int16_t *phase_per_symbol;
-
- uint8_t L_ptrs = 0;
- uint8_t right_side_ref = 0;
- uint8_t left_side_ref = 0;
- uint8_t nb_dmrs_in_slot = 0;
-
//#define DEBUG_UL_PTRS 1
- /* First symbol calculate PTRS symbol index for slot & set the variables */
- if(symbol == rel15_ul->start_symbol_index)
- {
- gNB->pusch_vars[ulsch_id]->ptrs_symbols = 0;
- L_ptrs = 1<<(rel15_ul->pusch_ptrs.ptrs_time_density);
- set_ptrs_symb_idx(&gNB->pusch_vars[ulsch_id]->ptrs_symbols,
- rel15_ul->nr_of_symbols,
- rel15_ul->start_symbol_index,
- L_ptrs,
- rel15_ul->ul_dmrs_symb_pos);
- }/* First symbol check */
+ int16_t *phase_per_symbol = NULL;
+ int32_t *ptrs_re_symbol = NULL;
+ int8_t ret = 0;
+ uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
+ uint8_t *startSymbIndex = &rel15_ul->start_symbol_index;
+ uint8_t *nbSymb = &rel15_ul->nr_of_symbols;
+ uint8_t *L_ptrs = &rel15_ul->pusch_ptrs.ptrs_time_density;
+ uint8_t *K_ptrs = &rel15_ul->pusch_ptrs.ptrs_freq_density;
+ uint16_t *dmrsSymbPos = &rel15_ul->ul_dmrs_symb_pos;
+ uint16_t *ptrsSymbPos = &gNB->pusch_vars[ulsch_id]->ptrs_symbols;
+ uint8_t *ptrsSymbIdx = &gNB->pusch_vars[ulsch_id]->ptrs_symbol_index;
+ uint8_t *dmrsConfigType = &rel15_ul->dmrs_config_type;
+ uint16_t *nb_rb = &rel15_ul->rb_size;
+ uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
/* loop over antennas */
- for (int aarx=0; aarx< frame_parms->nb_antennas_rx; aarx++)
- {
+ for (int aarx=0; aarxnb_antennas_rx; aarx++) {
phase_per_symbol = (int16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx];
- /* set the previous estimations to zero at first symbol */
- if(symbol == rel15_ul->start_symbol_index)
- {
- memset(phase_per_symbol,0,sizeof(int32_t)*frame_parms->symbols_per_slot);
+ ptrs_re_symbol = &gNB->pusch_vars[ulsch_id]->ptrs_re_per_slot;
+ *ptrs_re_symbol = 0;
+ phase_per_symbol[(2*symbol)+1] = 0; // Imag
+ /* set DMRS estimates to 0 angle with magnitude 1 */
+ if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
+ /* set DMRS real estimation to 32767 */
+ phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767
+#ifdef DEBUG_UL_PTRS
+ printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]);
+#endif
+ }
+ else {// real ptrs value is set to 0
+ phase_per_symbol[2*symbol] = 0; // Real
+ }
+
+ if(symbol == *startSymbIndex) {
+ *ptrsSymbPos = 0;
+ set_ptrs_symb_idx(ptrsSymbPos,
+ *nbSymb,
+ *startSymbIndex,
+ 1<< *L_ptrs,
+ *dmrsSymbPos);
}
/* if not PTRS symbol set current ptrs symbol index to zero*/
- gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = 0;
- gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol = 0;
+ *ptrsSymbIdx = 0;
/* Check if current symbol contains PTRS */
- if(is_ptrs_symbol(symbol, gNB->pusch_vars[ulsch_id]->ptrs_symbols))
- {
- gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = symbol;
+ if(is_ptrs_symbol(symbol, *ptrsSymbPos)) {
+ *ptrsSymbIdx = symbol;
/*------------------------------------------------------------------------------------------------------- */
- /* 1) Estimate phase noise per PTRS symbol */
+ /* 1) Estimate common phase error per PTRS symbol */
/*------------------------------------------------------------------------------------------------------- */
- nr_pusch_phase_estimation(frame_parms,
- rel15_ul,
- (int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch],
- nr_tti_rx,
- symbol,
- (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
- gNB->nr_gold_pusch_dmrs[rel15_ul->scid],
- &phase_per_symbol[2* symbol],
- &gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol);
- }
- /* DMRS Symbol channel estimates extraction */
- else if(dmrs_symbol_flag)
- {
- phase_per_symbol[2* symbol]= (int16_t)((1<<15)-1); // 32767
- phase_per_symbol[2* symbol +1]= 0;// no angle
+ nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
+ rel15_ul->rnti,
+ (int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch],
+ nr_tti_rx,
+ symbol,frame_parms->ofdm_symbol_size,
+ (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
+ gNB->nr_gold_pusch_dmrs[rel15_ul->scid][nr_tti_rx][symbol],
+ &phase_per_symbol[2* symbol],
+ ptrs_re_symbol);
}
/* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
- if(symbol == (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols -1))
- {
- nb_dmrs_in_slot = get_dmrs_symbols_in_slot(rel15_ul->ul_dmrs_symb_pos,(rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
- for(uint8_t dmrs_sym = 0; dmrs_sym < nb_dmrs_in_slot; dmrs_sym ++)
- {
- if(dmrs_sym == 0)
- {
- /* get first DMRS position */
- left_side_ref = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
- /* get first DMRS position is not at start symbol position then we need to extrapolate left side */
- if(left_side_ref > rel15_ul->start_symbol_index)
- {
- left_side_ref = rel15_ul->start_symbol_index;
- }
+ if(symbol == (symbInSlot -1)) {
+ /*------------------------------------------------------------------------------------------------------- */
+ /* 2) Interpolate PTRS estimated value in TD */
+ /*------------------------------------------------------------------------------------------------------- */
+ /* If L-PTRS is > 0 then we need interpolation */
+ if(*L_ptrs > 0) {
+ ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb);
+ if(ret != 0) {
+ LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
}
- /* get the next symbol from left_side_ref value */
- right_side_ref = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, left_side_ref+1, (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols));
- /* if no symbol found then interpolate till end of slot*/
- if(right_side_ref == 0)
- {
- right_side_ref = (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);
- }
- /*------------------------------------------------------------------------------------------------------- */
- /* 2) Interpolate PTRS estimated value in TD */
- /*------------------------------------------------------------------------------------------------------- */
- nr_pusch_phase_interpolation(phase_per_symbol,left_side_ref,right_side_ref);
- /* set left to last dmrs */
- left_side_ref = right_side_ref;
- } /*loop over dmrs positions */
-
+ }
#ifdef DEBUG_UL_PTRS
- LOG_M("ptrsEst.m","est",gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
- LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
+ LOG_M("ptrsEstUl.m","est",gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
+ LOG_M("rxdataF_bf_ptrs_comp_ul.m","bf_ptrs_cmp",
&gNB->pusch_vars[0]->rxdataF_comp[aarx][rel15_ul->start_symbol_index * NR_NB_SC_PER_RB * rel15_ul->rb_size],
rel15_ul->nr_of_symbols * NR_NB_SC_PER_RB * rel15_ul->rb_size,1,1);
#endif
-
/*------------------------------------------------------------------------------------------------------- */
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
/*--------------------------------------------------------------------------------------------------------*/
- for(uint8_t i =rel15_ul->start_symbol_index; i< (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);i++)
- {
+ for(uint8_t i = *startSymbIndex; i< symbInSlot ;i++) {
+ /* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
+ /* Skip rotation if the slot processing is wrong */
+ if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
#ifdef DEBUG_UL_PTRS
- printf("PTRS: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
+ printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
#endif
- rotate_cpx_vector((int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
- &phase_per_symbol[2* i],
- (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
- (rel15_ul->rb_size * NR_NB_SC_PER_RB),
- 15);
+ rotate_cpx_vector((int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+ &phase_per_symbol[2* i],
+ (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)],
+ ((*nb_rb) * NR_NB_SC_PER_RB), 15);
+ }// if not DMRS Symbol
}// symbol loop
- }//interpolation and compensation
- }// Antenna loop
-}
-
-/*******************************************************************
- *
- * NAME : nr_pusch_phase_estimation
- *
- * PARAMETERS : frame_parms : UL frame parameters
- * rel15_ul : UL PDU Structure
- * Ns :
- * Symbol : OFDM symbol index
- * rxF : Channel compensated signal
- * ptrs_gold_seq: Gold sequence for PTRS regeneration
- * error_est : Estimated error output vector [Re Im]
- * RETURN : nothing
- *
- * DESCRIPTION :
- * perform phase estimation from regenerated PTRS SC and channel compensated
- * signal
- *********************************************************************/
-void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms,
- nfapi_nr_pusch_pdu_t *rel15_ul,
- int16_t *ptrs_ch_p,
- unsigned char Ns,
- unsigned char symbol,
- int16_t *rxF_comp,
- uint32_t ***ptrs_gold_seq,
- int16_t *error_est,
- uint16_t *ptrs_sc)
-{
- uint8_t is_ptrs_re = 0;
- uint16_t re_cnt = 0;
- uint16_t cnt = 0;
- unsigned short nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size;
- uint8_t K_ptrs = rel15_ul->pusch_ptrs.ptrs_freq_density;
- uint16_t sc_per_symbol = (rel15_ul->rb_size + K_ptrs - 1)/K_ptrs;
- int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
- int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
- double abs = 0.0;
- double real = 0.0;
- double imag = 0.0;
-#ifdef DEBUG_UL_PTRS
- double alpha = 0;
-#endif
- /* generate PTRS RE for the symbol */
- nr_gen_ref_conj_symbols(ptrs_gold_seq[Ns][symbol],sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
-
- /* loop over all sub carriers to get compensated RE on ptrs symbols*/
- for (int re = 0; re < nb_re_pusch; re++)
- {
- is_ptrs_re = is_ptrs_subcarrier(re,
- rel15_ul->rnti,
- 0,
- rel15_ul->dmrs_config_type,
- K_ptrs,
- rel15_ul->rb_size,
- rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
- 0,// start_re is 0 here
- frame_parms->ofdm_symbol_size);
- if(is_ptrs_re)
- {
- dmrs_comp_p[re_cnt*2] = rxF_comp[re *2];
- dmrs_comp_p[(re_cnt*2)+1] = rxF_comp[(re *2)+1];
- re_cnt++;
- }
- else
- {
- /* Skip PTRS symbols and keep data in a continuous vector */
- rxF_comp[cnt *2]= rxF_comp[re *2];
- rxF_comp[(cnt *2)+1]= rxF_comp[(re *2)+1];
- cnt++;
- }
- }/* RE loop */
- /* update the total ptrs RE in a symbol */
- *ptrs_sc = re_cnt;
-
- /*Multiple compensated data with conj of PTRS */
- mult_cpx_vector(dmrs_comp_p, ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
-
- /* loop over all ptrs sub carriers in a symbol */
- /* sum the error vector */
- for(int i = 0;i < sc_per_symbol; i++)
- {
- real+= ptrs_ch_p[(2*i)];
- imag+= ptrs_ch_p[(2*i)+1];
- }
-#ifdef DEBUG_UL_PTRS
- alpha = atan(imag/real);
- printf("PTRS: Symbol %d atan(Im,real):= %f \n",symbol, alpha );
-#endif
- /* mean */
- real /= sc_per_symbol;
- imag /= sc_per_symbol;
- /* absolute calculation */
- abs = sqrt(((real * real) + (imag * imag)));
- /* normalized error estimation */
- error_est[0]= (real / abs)*(1<<15);
- /* compensation in given by conjugate of estimated phase (e^-j*2*pi*fd*t)*/
- error_est[1]= (-1)*(imag / abs)*(1<<15);
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
-#endif
- /* free vectors */
- free(ptrs_p);
- free(dmrs_comp_p);
-}
-
-
-/*******************************************************************
- *
- * NAME : nr_pusch_phase_interpolation
- *
- * PARAMETERS : *error_est : Data Pointer [Re Im Re Im ...]
- * start_symbol : Start Symbol
- * end_symbol : End Symbol
- * RETURN : nothing
- *
- * DESCRIPTION :
- * Perform Interpolation, extrapolation based upon the estimation
- * location between the data Pointer Array.
- *
- *********************************************************************/
-void nr_pusch_phase_interpolation(int16_t *error_est,
- uint8_t start_symbol,
- uint8_t end_symbol
- )
-{
-
- int next = 0, prev = 0, candidates= 0, distance=0, leftEdge= 0, rightEdge = 0, getDiff =0 ;
- double weight = 0.0;
- double scale = 0.125 ; // to avoid saturation due to fixed point multiplication
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: INT: Left limit %d, Right limit %d, Loop over %d Symbols \n",
- start_symbol,end_symbol-1, (end_symbol -start_symbol)-1);
-#endif
- for(int i =start_symbol; i< end_symbol;i++)
- {
- /* Only update when an estimation is found */
- if( error_est[i*2] != 0 )
- {
- /* if found a symbol then set next symbol also */
- next = nr_ptrs_find_next_estimate(error_est, i, end_symbol);
- /* left extrapolation, if first estimate value is zero */
- if( error_est[i*2] == 0 )
- {
- leftEdge = 1;
- }
- /* right extrapolation, if next is 0 before end symbol */
- if((next == 0) && (end_symbol > i))
- {
- rightEdge = 1;
- /* special case as no right extrapolation possible with DMRS on left */
- /* In this case take mean of most recent 2 estimated points */
- if(prev ==0)
- {
- prev = start_symbol -1;
- next = start_symbol -2;
- getDiff =1;
- }else
- {
- /* for right edge previous is second last from right side */
- next = prev;
- /* Set the current as recent estimation reference */
- prev = i;
- }
- }
- /* update current symbol as prev for next symbol */
- if (rightEdge==0)
- /* Set the current as recent estimation reference */
- prev = i;
- }
- /*extrapolation left side*/
- if(leftEdge)
- {
- distance = next - prev;
- weight = 1.0/distance;
- candidates = i;
- for(int j = 1; j <= candidates; j++)
- {
- error_est[(i-j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance + j) * weight) -
- ((double)(error_est[next*2]) * scale * j * weight));
- error_est[((i-j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale* (distance + j) * weight) -
- ((double)(error_est[((next*2)+1)]) * scale * j * weight));
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: INT: Left Edge i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
- (i-j),weight, error_est[(i-j)*2],error_est[((i-j)*2)+1], prev,next);
-#endif
- }
- leftEdge = 0;
- }
- /* extrapolation at right side */
- else if (rightEdge )
- {
- if(getDiff)
- {
- error_est[(i+1)*2] = ((1<<15) +(error_est[prev*2]) - error_est[next*2]);
- error_est[((i+1)*2)+1]= error_est[(prev*2)+1] - error_est[(next*2)+1];
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: INT: Right Edge Special Case i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
- (i+1),weight, error_est[(i+1)*2],error_est[((i+1)*2)+1], prev,next);
-#endif
- i++;
- }
- else
- {
- distance = prev - next;
- candidates = (end_symbol -1) - i;
- weight = 1.0/distance;
- for(int j = 1; j <= candidates; j++)
- {
- error_est[(i+j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance + j) * weight) -
- ((double)(error_est[next*2]) * scale * j * weight));
- error_est[((i+j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale * (distance + j) * weight) -
- ((double)(error_est[((next*2)+1)]) * scale *j * weight));
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: INT: Right Edge i= %d weight= %f %d + j*%d, Prev %d Next %d \n",
- (i+j),weight, error_est[(i+j)*2],error_est[((i+j)*2)+1], prev,next);
-#endif
- }
- if(candidates > 1)
- {
- i+=candidates;
- }
- }
- }
- /* Interpolation between 2 estimated points */
- else if(next != 0 && ( error_est[2*i] == 0 ))
- {
- distance = next - prev;
- weight = 1.0/distance;
- candidates = next - i ;
- for(int j = 0; j < candidates; j++)
- {
-
- error_est[(i+j)*2] = 8 *(((double)(error_est[prev*2]) * scale * (distance - (j+1)) * weight) +
- ((double)(error_est[next*2]) * scale * (j+1) * weight));
- error_est[((i+j)*2)+1]= 8 *(((double)(error_est[(prev*2)+1]) * scale *(distance - (j+1)) * weight) +
- ((double)(error_est[((next*2)+1)]) * scale *(j+1) * weight));
-#ifdef DEBUG_UL_PTRS
- printf("PTRS: INT: Interpolation i= %d weight= %f %d + j*%d, Prev %d Next %d\n",
- (i+j),weight, error_est[(i+j)*2],error_est[((i+j)*2)+1],prev,next);
-#endif
- }
- if(candidates > 1)
- {
- i+=candidates-1;
- }
- }// interpolation
- }// symbol loop
-}
-
-/* Find the next non zero Real value in a complex vector */
-int nr_ptrs_find_next_estimate(int16_t *error_est,
- uint8_t counter,
- uint8_t end_symbol)
-{
- for (int i = counter +1 ; i< end_symbol; i++)
- {
- if( error_est[2*i] != 0)
- {
- return i;
- }
- }
- return 0;
+ }// last symbol check
+ }//Antenna loop
}
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
index 0f71487e36..a463e21839 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
@@ -53,28 +53,10 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
+ NR_DL_FRAME_PARMS *frame_parms,
nfapi_nr_pusch_pdu_t *rel15_ul,
uint8_t ulsch_id,
uint8_t nr_tti_rx,
- uint8_t dmrs_symbol_flag,
unsigned char symbol,
uint32_t nb_re_pusch);
-
-void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms,
- nfapi_nr_pusch_pdu_t *rel15_ul,
- int16_t *ptrs_ch_p,
- unsigned char Ns,
- unsigned char symbol,
- int16_t *rxF_comp,
- uint32_t ***ptrs_gold_seq,
- int16_t *error_est,
- uint16_t *ptrs_sc);
-
-void nr_pusch_phase_interpolation(int16_t *error_est,
- uint8_t start_symbol,
- uint8_t end_symbol);
-
-int nr_ptrs_find_next_estimate(int16_t *error_est,
- uint8_t counter,
- uint8_t end_symbol);
#endif
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index 415e6adfa2..03a37e2b27 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -37,6 +37,7 @@
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
uint16_t start_sc,
+ uint16_t ofdm_symbol_size,
uint8_t numDmrsCdmGrpsNoData,
uint8_t dmrs_type) {
uint8_t delta;
@@ -44,7 +45,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
if (k>start_sc)
diff = k-start_sc;
else
- diff = start_sc-k;
+ diff = (ofdm_symbol_size-start_sc)+k;
for (int i = 0; i>symbol)&0x01 )
- {
+ for(uint8_t symbol = counter; symbol < end_symbol; symbol++) {
+ if((ul_dmrs_symb_pos >> symbol) & 0x01 ) {
return symbol;
}
- return 0;
+ }
+ return -1;
}
@@ -378,9 +379,30 @@ int get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, ui
uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb)
{
uint8_t tmp = 0;
- for (int i = 0; i < nb_symb; i++)
- {
+ for (int i = 0; i < nb_symb; i++) {
tmp += (l_prime_mask >> i) & 0x01;
}
return tmp;
}
+
+/* return the position of valid dmrs symbol in a slot for channel compensation */
+int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter)
+{
+ int8_t symbIdx = -1;
+ /* if current symbol is DMRS then return this index */
+ if(is_dmrs_symbol(counter, dmrs_symb_pos ) ==1) {
+ return counter;
+ }
+ /* find previous DMRS symbol */
+ for(int8_t symbol = counter;symbol >=0 ; symbol--) {
+ if((1< 0) {
+ symbIdx = symbol;
+ break;
+ }
+ }
+ /* if there is no previous dmrs available then find the next possible*/
+ if(symbIdx == -1) {
+ symbIdx = get_next_dmrs_symbol_in_slot(dmrs_symb_pos,counter,15);
+ }
+ return symbIdx;
+}
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h
index c76f58ad18..b9e9ca6f0d 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h
@@ -58,9 +58,16 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
uint16_t start_sc,
+ uint16_t ofdm_symbol_size,
uint8_t numDmrsCdmGrpsNoData,
uint8_t dmrs_type);
+void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order);
+int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
+uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb);
+int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter);
+
+static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); }
#undef EXTERN
#endif /* DMRS_NR_H */
diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
index 3e758c4fa5..764885dbf8 100644
--- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
@@ -121,18 +121,18 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
array_of_w *wf;
array_of_w *wt;
- config_type = 0; //to be updated by higher layer
+ config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
- wf = (config_type==0) ? wf1 : wf2;
- wt = (config_type==0) ? wt1 : wt2;
+ wf = (config_type==pdsch_dmrs_type1) ? wf1 : wf2;
+ wt = (config_type==pdsch_dmrs_type1) ? wt1 : wt2;
if (config_type > 1)
LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type);
- if ((p>=1000) && (p<((config_type==0) ? 1008 : 1012))) {
+ if ((p>=1000) && (p<((config_type==pdsch_dmrs_type1) ? 1008 : 1012))) {
if (ue->frame_parms.Ncp == NORMAL) {
- for (int i=0; i>1) ^ (x2>>2) ^ (x2>>3))<<31);
@@ -145,7 +143,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
- //printf("x1 : %x, x2 : %x\n",x1,x2);
+ //printf("x1 : %x, x2 : %x\n",x1,x2);
}
for (n=0; n>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
- // if ((ns==2)&&(l==0))
- //printf("n=%d : c %x\n",n,x1^x2);
+ // if ((ns==2)&&(l==0))
+ //printf("n=%d : c %x\n",n,x1^x2);
}
}
diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h
index f82a7880bb..c5bba196a5 100644
--- a/openair1/PHY/NR_REFSIG/nr_refsig.h
+++ b/openair1/PHY/NR_REFSIG/nr_refsig.h
@@ -53,10 +53,6 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
uint8_t dmrs_type);
void init_scrambling_luts(void);
-void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order);
-uint8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
-uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb);
-
void nr_generate_modulation_table(void);
extern __m64 byte2m64_re[256];
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c
index 785252126a..b50c9a7bc9 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c
@@ -34,7 +34,7 @@
#include
#include "dmrs_nr.h"
#include "PHY/NR_REFSIG/ptrs_nr.h"
-
+#include "PHY/NR_REFSIG/nr_refsig.h"
/***********************************************************************/
@@ -180,93 +180,249 @@ uint8_t is_ptrs_subcarrier(uint16_t k,
return 0;
}
-
-/*
-int main(int argc, char const *argv[])
+/* return the total number of ptrs symbol in a slot */
+uint8_t get_ptrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t start_symb, uint16_t nb_symb)
{
-
- dmrs_UplinkConfig_t dmrs_Uplink_Config;
- ptrs_UplinkConfig_t ptrs_Uplink_Config;
- uint8_t resourceElementOffset;
- uint8_t dmrs_antenna_port;
- uint8_t L_ptrs, K_ptrs;
- int16_t k_RE_ref;
- uint16_t N_RB, ptrs_symbols, ofdm_symbol_size, k;
- uint8_t duration_in_symbols, I_mcs;
- uint8_t start_symbol, l;
- uint8_t ptrs_symbol_flag;
- uint16_t n_rnti;
-
- dmrs_Uplink_Config.pusch_dmrs_type = pusch_dmrs_type1;
- dmrs_Uplink_Config.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos1;
- dmrs_Uplink_Config.pusch_maxLength = pusch_len2;
-
- ptrs_Uplink_Config.timeDensity.ptrs_mcs1 = 0; // setting MCS values to 0 indicate abscence of time_density field in the configuration
- ptrs_Uplink_Config.timeDensity.ptrs_mcs2 = 0;
- ptrs_Uplink_Config.timeDensity.ptrs_mcs3 = 0;
- ptrs_Uplink_Config.frequencyDensity.n_rb0 = 0; // setting N_RB values to 0 indicate abscence of frequency_density field in the configuration
- ptrs_Uplink_Config.frequencyDensity.n_rb1 = 0;
- ptrs_Uplink_Config.resourceElementOffset = 0;
-
- n_rnti = 0x1234;
- resourceElementOffset = 0;
- ptrs_symbols = 0;
- dmrs_antenna_port = 0;
- N_RB = 50;
- duration_in_symbols = 14;
- ofdm_symbol_size = 2048;
- I_mcs = 9;
- start_symbol = 0;
- ptrs_symbol_flag = 0;
-
- k_RE_ref = get_kRE_ref(dmrs_antenna_port, dmrs_Uplink_Config.pusch_dmrs_type, resourceElementOffset);
-
- K_ptrs = get_K_ptrs(&ptrs_Uplink_Config, N_RB);
-
- L_ptrs = get_L_ptrs(&ptrs_Uplink_Config, I_mcs);
-
- set_ptrs_symb_idx(&ptrs_symbols,
- &ptrs_Uplink_Config,
- &dmrs_Uplink_Config,
- 1,
- duration_in_symbols,
- start_symbol,
- L_ptrs,
- ofdm_symbol_size);
-
- printf("PTRS OFDM symbol indicies: ");
-
- for (l = start_symbol; l < start_symbol + duration_in_symbols; l++){
-
- ptrs_symbol_flag = is_ptrs_symbol(l,
- 0,
- n_rnti,
- N_RB,
- duration_in_symbols,
- dmrs_antenna_port,
- K_ptrs,
- ptrs_symbols,
- dmrs_Uplink_Config.pusch_dmrs_type,
- &ptrs_Uplink_Config);
-
- if (ptrs_symbol_flag == 1)
- printf(" %d ", l);
-
+ uint8_t tmp = 0;
+ for (int i = start_symb; i <= nb_symb; i++)
+ {
+ tmp += (l_prime_mask >> i) & 0x01;
}
+ return tmp;
+}
- printf("\n");
-
- printf("PTRS subcarrier indicies: ");
-
- for (k = 0; k < N_RB*12; k++){
-
- if (is_ptrs_subcarrier(k, K_ptrs, n_rnti, N_RB, k_RE_ref) == 1)
- printf(" %d ", k);
-
+/* return the position of next ptrs symbol in a slot */
+int8_t get_next_ptrs_symbol_in_slot(uint16_t ptrs_symb_pos, uint8_t counter, uint8_t nb_symb)
+{
+ for(int8_t symbol = counter; symbol < nb_symb; symbol++) {
+ if((ptrs_symb_pos >>symbol)&0x01 ) {
+ return symbol;
}
+ }
+ return -1;
+}
- printf("\n");
+/* get the next nearest estimate from DMRS or PTRS */
+int8_t get_next_estimate_in_slot(uint16_t ptrsSymbPos,uint16_t dmrsSymbPos, uint8_t counter,uint8_t nb_symb)
+{
+ int8_t nextPtrs = get_next_ptrs_symbol_in_slot(ptrsSymbPos, counter,nb_symb);
+ int8_t nextDmrs = get_next_dmrs_symbol_in_slot(dmrsSymbPos, counter,nb_symb);
+ if(nextDmrs == -1) {
+ return nextPtrs;
+ }
+ /* Special case when DMRS is next valid estimation */
+ if(nextPtrs == -1) {
+ return nextDmrs;
+ }
+ return (nextPtrs > nextDmrs)?nextDmrs:nextPtrs;
+}
+/*******************************************************************
+ *
+ * NAME : nr_ptrs_cpe_estimation
+ *
+ * PARAMETERS : K_ptrs : K value for PTRS
+ * ptrsReOffset : RE offset for PTRS
+ * dmrsConfigType: DMRS configuration type
+ * nb_rb : No. of resource blocks
+ * rnti : RNTI
+ * ptrs_ch_p : pointer to ptrs channel structure
+ * Ns :
+ * symbol : OFDM symbol
+ * ofdm_symbol_size: OFDM Symbol Size
+ * rxF_comp : pointer to channel compensated signal
+ * gold_seq : Gold sequence pointer
+ * error_est : Estimated error output vector [Re Im]
+ * ptrs_sc : Total PTRS RE in a symbol
+ * RETURN : nothing
+ *
+ * DESCRIPTION :
+ * perform phase estimation from regenerated PTRS SC and channel compensated
+ * signal
+ *********************************************************************/
+void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
+ uint8_t ptrsReOffset,
+ uint8_t dmrsConfigType,
+ uint16_t nb_rb,
+ uint16_t rnti,
+ int16_t *ptrs_ch_p,
+ unsigned char Ns,
+ unsigned char symbol,
+ uint16_t ofdm_symbol_size,
+ int16_t *rxF_comp,
+ uint32_t *gold_seq,
+ int16_t *error_est,
+ int32_t *ptrs_sc)
+{
+//#define DEBUG_PTRS 1
+ uint8_t is_ptrs_re = 0;
+ uint16_t re_cnt = 0;
+ uint16_t cnt = 0;
+ unsigned short nb_re_pdsch = NR_NB_SC_PER_RB * nb_rb;
+ uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs;
+ int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
+ int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol));
+ double abs = 0.0;
+ double real = 0.0;
+ double imag = 0.0;
+#ifdef DEBUG_PTRS
+ double alpha = 0;
+#endif
+ /* generate PTRS RE for the symbol */
+ nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
+
+ /* loop over all sub carriers to get compensated RE on ptrs symbols*/
+ for (int re = 0; re < nb_re_pdsch; re++) {
+ is_ptrs_re = is_ptrs_subcarrier(re,
+ rnti,
+ 0,
+ dmrsConfigType,
+ K_ptrs,
+ nb_rb,
+ ptrsReOffset,
+ 0,// start_re is 0 here
+ ofdm_symbol_size);
+ if(is_ptrs_re) {
+ dmrs_comp_p[re_cnt*2] = rxF_comp[re *2];
+ dmrs_comp_p[(re_cnt*2)+1] = rxF_comp[(re *2)+1];
+ re_cnt++;
+ }
+ else {
+ /* Skip PTRS symbols and keep data in a continuous vector */
+ rxF_comp[cnt *2]= rxF_comp[re *2];
+ rxF_comp[(cnt *2)+1]= rxF_comp[(re *2)+1];
+ cnt++;
+ }
+ }/* RE loop */
+ /* update the total ptrs RE in a symbol */
+ *ptrs_sc = re_cnt;
+
+ /*Multiple compensated data with conj of PTRS */
+ mult_cpx_vector(dmrs_comp_p, ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
+
+ /* loop over all ptrs sub carriers in a symbol */
+ /* sum the error vector */
+ for(int i = 0;i < sc_per_symbol; i++) {
+ real+= ptrs_ch_p[(2*i)];
+ imag+= ptrs_ch_p[(2*i)+1];
+ }
+#ifdef DEBUG_PTRS
+ alpha = atan(imag/real);
+ printf("[PHY][PTRS]: Symbol %d atan(Im,real):= %f \n",symbol, alpha );
+#endif
+ /* mean */
+ real /= sc_per_symbol;
+ imag /= sc_per_symbol;
+ /* absolute calculation */
+ abs = sqrt(((real * real) + (imag * imag)));
+ /* normalized error estimation */
+ error_est[0]= (real / abs)*(1<<15);
+ /* compensation in given by conjugate of estimated phase (e^-j*2*pi*fd*t)*/
+ error_est[1]= (-1)*(imag / abs)*(1<<15);
+#ifdef DEBUG_PTRS
+ printf("[PHY][PTRS]: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
+#endif
+ /* free vectors */
+ free(ptrs_p);
+ free(dmrs_comp_p);
+}
+
+
+/*******************************************************************
+ *
+ * NAME : nr_ptrs_process_slot
+ *
+ * PARAMETERS : dmrsSymbPos DMRS symbol index mask per slot
+ * ptrsSymbpos PTRS symbol index mask per slot
+ * estPerSymb Estimated CPE pointer
+ * startSymbIdx First symbol index in a slot
+ * noSymb total number of OFDM symbols in a slot
+ * RETURN : True if slot is process correctly
+ * DESCRIPTION :
+ * Process whole slot and interpolate or extrapolate estimation for the symbols
+ * where there is neither PTRS nor DMRS configured
+ *
+ *********************************************************************/
+int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos,
+ uint16_t ptrsSymbPos,
+ int16_t *estPerSymb,
+ uint16_t startSymbIdx,
+ uint16_t noSymb)
+{
+ double slope[2] = {0,0};
+ double *slope_p = &slope[0];
+ uint8_t symbInSlot = startSymbIdx + noSymb;
+ int8_t rightRef = 0;
+ int8_t leftRef = 0;
+ int8_t tmp = 0;
+ for(uint8_t symb = startSymbIdx; symb %4d %4d from Slope (%4f %4f)\n", start+i,error_est[(start+i)*2],error_est[((start +i)*2)+1],
+ slope_p[0],slope_p[1]);
+#endif
+ }
+}
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.h b/openair1/PHY/NR_REFSIG/ptrs_nr.h
index e8a4e61232..41acde0d06 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.h
@@ -80,6 +80,31 @@ uint8_t is_ptrs_subcarrier(uint16_t k,
static inline uint8_t is_ptrs_symbol(uint8_t l, uint16_t ptrs_symbols) { return ((ptrs_symbols >> l) & 1); }
+uint8_t get_ptrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t start_symb, uint16_t nb_symb);
+int8_t get_next_ptrs_symbol_in_slot(uint16_t ptrsSymbPos, uint8_t counter, uint8_t nb_symb);
+int8_t get_next_estimate_in_slot(uint16_t ptrsSymbPos,uint16_t dmrsSymbPos, uint8_t counter,uint8_t nb_symb);
+int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos,
+ uint16_t ptrsSymbPos,
+ int16_t *estPerSymb,
+ uint16_t startSymbIdx,
+ uint16_t noSymb
+ );
+/* general function to estimate common phase error based upon PTRS */
+void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
+ uint8_t ptrsReOffset,
+ uint8_t dmrsConfigType,
+ uint16_t nb_rb,
+ uint16_t rnti,
+ int16_t *ptrs_ch_p,
+ unsigned char Ns,
+ unsigned char symbol,
+ uint16_t ofdm_symbol_size,
+ int16_t *rxF_comp,
+ uint32_t *gold_seq,
+ int16_t *error_est,
+ int32_t *ptrs_sc);
+void get_slope_from_estimates(uint8_t start, uint8_t end, int16_t *est_p, double *slope_p);
+void ptrs_estimate_from_slope(int16_t *error_est, double *slope_p, uint8_t start, uint8_t end);
#endif /* PTRS_NR_H */
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index 93a64051de..f349cfcd98 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -61,9 +61,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
unsigned short length_dmrs);
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
- unsigned short lbar,
- unsigned short *n_idDMRS,
- unsigned short length_dmrs);
+ unsigned short *n_idDMRS);
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
uint16_t *N_n_scid,
diff --git a/openair1/PHY/NR_REFSIG/sss_nr.h b/openair1/PHY/NR_REFSIG/sss_nr.h
index c260abd071..12d91ed3d1 100644
--- a/openair1/PHY/NR_REFSIG/sss_nr.h
+++ b/openair1/PHY/NR_REFSIG/sss_nr.h
@@ -92,13 +92,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]);
-int _do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
- int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
- int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
- uint8_t doPss, uint8_t doSss,
- uint8_t subframe);
-
-int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric, uint8_t *phase_max);
+int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max);
#undef INIT_VARIABLES_SSS_NR_H
#undef EXTERN
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 4461edb33b..d1b868eac8 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -35,7 +35,9 @@
#include "nr_sch_dmrs.h"
#include "PHY/MODULATION/nr_modulation.h"
#include "PHY/NR_REFSIG/dmrs_nr.h"
+#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
+#include "LAYER2/NR_MAC_gNB/mac_proto.h"
//#define DEBUG_DLSCH
//#define DEBUG_DLSCH_MAPPING
@@ -117,8 +119,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs[slot];
int32_t** txdataF = gNB->common_vars.txdataF;
int16_t amp = AMP;
- NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
int xOverhead = 0;
+ NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
time_stats_t *dlsch_encoding_stats=&gNB->dlsch_encoding_stats;
time_stats_t *dlsch_scrambling_stats=&gNB->dlsch_scrambling_stats;
time_stats_t *dlsch_modulation_stats=&gNB->dlsch_modulation_stats;
@@ -140,7 +142,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
- int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
+ int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
uint8_t dmrs_Type = rel15->dmrsConfigType;
int nb_re_dmrs;
uint16_t n_dmrs;
@@ -152,13 +154,31 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
nb_re_dmrs = 4*rel15->numDmrsCdmGrpsNoData;
n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
}
- uint16_t nb_re;
- nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->NrOfCodewords;
+
+ uint16_t dmrs_symbol_map = rel15->dlDmrsSymbPos;//single DMRS: 010000100 Double DMRS 110001100
+ uint8_t dmrs_len = get_num_dmrs(rel15->dlDmrsSymbPos);
+ uint16_t nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs*dmrs_len-xOverhead)*rel15->rbSize*rel15->nrOfLayers;
uint8_t Qm = rel15->qamModOrder[0];
uint32_t encoded_length = nb_re*Qm;
- int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16)));
-
-
+ int16_t mod_dmrs[14][n_dmrs] __attribute__ ((aligned(16)));
+
+ /* PTRS */
+ uint16_t beta_ptrs = 1;
+ uint8_t ptrs_symbol = 0;
+ uint16_t dlPtrsSymPos = 0;
+ uint16_t n_ptrs = 0;
+ uint16_t ptrs_idx = 0;
+ uint8_t is_ptrs_re = 0;
+ if(rel15->pduBitmap & 0x1) {
+ set_ptrs_symb_idx(&dlPtrsSymPos,
+ rel15->NrOfSymbols,
+ rel15->StartSymbolIndex,
+ 1<PTRSTimeDensity,
+ rel15->dlDmrsSymbPos);
+ n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity;
+ }
+ int16_t mod_ptrs[n_ptrs<<1] __attribute__ ((aligned(16)));
+
/// CRC, coding, interleaving and rate matching
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
start_meas(dlsch_encoding_stats);
@@ -248,24 +268,24 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
/// Antenna port mapping
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
-
+
/// DMRS QPSK modulation
-
-
- l0 = get_l0(rel15->dlDmrsSymbPos);
- nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
-
+ for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
+ if (rel15->dlDmrsSymbPos & (1 << l)) {
+ nr_modulation(pdsch_dmrs[l][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs[l]); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
+
#ifdef DEBUG_DLSCH
- printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
- for (int i=0; i>4; i++) {
- for (int j=0; j<8; j++) {
- printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
- }
- printf("\n");
- }
+ printf("DMRS modulation (symbol %d, %d symbols, type %d):\n", l, n_dmrs>>1, dmrs_Type);
+ for (int i=0; i>4; i++) {
+ for (int j=0; j<8; j++) {
+ printf("%d %d\t", mod_dmrs[l][((i<<3)+j)<<1], mod_dmrs[l][(((i<<3)+j)<<1)+1]);
+ }
+ printf("\n");
+ }
#endif
-
-
+ }
+ }
+
/// Resource mapping
// Non interleaved VRB to PRB mapping
@@ -283,55 +303,115 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
get_Wt(Wt, ap, dmrs_Type);
get_Wf(Wf, ap, dmrs_Type);
delta = get_delta(ap, dmrs_Type);
- l_prime[0] = 0; // single symbol ap 0
- uint8_t dmrs_symbol = l0+l_prime[0];
+ l_prime = 0; // single symbol ap 0
+ l0 = get_l0(rel15->dlDmrsSymbPos);
+ l_overline = l0;
+
#ifdef DEBUG_DLSCH_MAPPING
+ uint8_t dmrs_symbol = l0+l_prime;
printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
- 1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
+ 1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
#endif
- uint8_t k_prime=0;
- uint16_t m=0, n=0, dmrs_idx=0, k=0;
-
+
+ uint16_t m=0, dmrs_idx=0, k=0;
+
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
- if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
- dmrs_idx = rel15->rbStart*6;
- else
- dmrs_idx = rel15->rbStart*4;
-
+
+ // Loop Over OFDM symbols:
for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
- k = start_sc;
- for (int i=0; irbSize*NR_NB_SC_PER_RB; i++) {
- if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
+ /// DMRS QPSK modulation
+ uint8_t k_prime=0;
+ uint16_t n=0;
+ if ((dmrs_symbol_map & (1 << l))){ //DMRS time occasion
+ if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
+ dmrs_idx = rel15->rbStart*6;
+ else
+ dmrs_idx = rel15->rbStart*4;
+ }
+
+ // Update l_prime in the case of double DMRS config
+ if ((dmrs_symbol_map & (1 << l))){ //DMRS time occasion
+ if (l==(l_overline+1)) //take into account the double DMRS symbols
+ l_prime = 1;
+ else if (l>(l_overline+1)) {//new DMRS pair
+ l_overline = l;
+ l_prime = 0;
+ }
+ }
+
+ /* calculate if current symbol is PTRS symbols */
+ ptrs_idx = 0;
+
+ if(rel15->pduBitmap & 0x1) {
+ ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos);
+ if(ptrs_symbol) {
+ /* PTRS QPSK Modulation for each OFDM symbol in a slot */
+ nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
+ }
+ }
+ k = start_sc;
+ // Loop Over SCs:
+ for (int i=0; irbSize*NR_NB_SC_PER_RB; i++) {
+ /* check if cuurent RE is PTRS RE*/
+ is_ptrs_re=0;
+ /* check for PTRS symbol and set flag for PTRS RE */
+ if(ptrs_symbol){
+ is_ptrs_re = is_ptrs_subcarrier(k,
+ rel15->rnti,
+ ap,
+ rel15->dmrsConfigType,
+ rel15->PTRSFreqDensity,
+ rel15->rbSize,
+ rel15->PTRSReOffset,
+ start_sc,
+ frame_parms->ofdm_symbol_size);
+ }
+
+ /* Map DMRS Symbol */
+ if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
#ifdef DEBUG_DLSCH_MAPPING
- printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
- dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
+ dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
- dmrs_idx++;
- k_prime++;
- k_prime&=1;
- n+=(k_prime)?0:1;
- }
-
- else {
- if( (l != dmrs_symbol) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
+ dmrs_idx++;
+ k_prime++;
+ k_prime&=1;
+ n+=(k_prime)?0:1;
+ }
+ /* Map PTRS Symbol */
+ else if(is_ptrs_re){
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
#ifdef DEBUG_DLSCH_MAPPING
- printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
- m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ printf("ptrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
+ ptrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
- m++;
- }
- }
- if (++k >= frame_parms->ofdm_symbol_size)
- k -= frame_parms->ofdm_symbol_size;
- } //RE loop
+ ptrs_idx++;
+ }
+ /* Map DATA Symbol */
+ else {
+ if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
+#ifdef DEBUG_DLSCH_MAPPING
+ printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
+ m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+#endif
+ m++;
+ }
+ }
+ if (++k >= frame_parms->ofdm_symbol_size)
+ k -= frame_parms->ofdm_symbol_size;
+ } //RE loop
} // symbol loop
}// layer loop
+
+
dlsch->slot_tx[slot]=0;
}// dlsch loop
return 0;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 80d6d13d9e..cb395ff4af 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -328,8 +328,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
uint16_t nb_rb = rel15->rbSize;
uint8_t nb_symb_sch = rel15->NrOfSymbols;
uint32_t A, Kb, F=0;
- static uint32_t Z = 0;
- uint32_t *Zc = &Z;
+ uint32_t *Zc = &dlsch->harq_processes[harq_pid]->Z;
uint8_t mod_order = rel15->qamModOrder[0];
uint16_t Kr=0,r;
uint32_t r_offset=0;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
index 04045380eb..e6a9b8c5dc 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
@@ -67,12 +67,12 @@ void get_antenna_ports(uint8_t *ap, uint8_t n_symbs, uint8_t config) {
void get_Wt(int8_t *Wt, uint8_t ap, uint8_t config) {
for (int i=0; i<2; i++)
- *(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
+ *(Wt+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
}
void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config) {
for (int i=0; i<2; i++)
- *(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][5+i]):(pdsch_dmrs_2[ap][5+i]);
+ *(Wf+i)=(config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][3+i]):(pdsch_dmrs_2[ap][3+i]);
}
uint8_t get_delta(uint8_t ap, uint8_t config) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
index a30c529459..be3ba00989 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
@@ -44,7 +44,7 @@
void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
uint32_t n_id,
uint8_t n_hop,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t *u,
uint8_t *v);
@@ -53,7 +53,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
uint8_t mcs,
uint8_t lnormal,
uint8_t lprime,
- int nr_tti_tx);
+ int nr_slot_tx);
/** \brief Computes available bits G. */
uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint16_t length_dmrs, uint8_t Qm, uint8_t Nl);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c b/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
index 2b0cbe72b3..4d286bc937 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
@@ -33,11 +33,11 @@
#include "nr_dci.h"
void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
- uint32_t n_id,
- uint8_t n_hop,
- int nr_tti_tx,
- uint8_t *u,
- uint8_t *v) {
+ uint32_t n_id,
+ uint8_t n_hop,
+ int nr_slot_tx,
+ uint8_t *u,
+ uint8_t *v) {
/*
* Implements TS 38.211 subclause 6.3.2.2.1 Group and sequence hopping
* The following variables are set by higher layers:
@@ -65,7 +65,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
*v=0;
uint32_t c_init = 0;
uint32_t x1,s; // TS 38.211 Subclause 5.2.1
- int l = 32, minShift = ((2*nr_tti_tx+n_hop)<<3);
+ int l = 32, minShift = ((2*nr_slot_tx+n_hop)<<3);
int tmpShift =0;
#ifdef DEBUG_NR_PUCCH_TX
printf("\t\t [nr_group_sequence_hopping] calculating u,v -> ");
@@ -92,7 +92,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
f_gh = f_gh%30;
f_ss = n_id%30;
/* for (int m=0; m<8; m++){
- f_gh = f_gh + ((1<>(8*(2*nr_tti_tx+n_hop)+m))&1))); // Not sure we have to use nr_tti_tx FIXME!!!
+ f_gh = f_gh + ((1<>(8*(2*nr_slot_tx+n_hop)+m))&1))); // Not sure we have to use nr_slot_tx FIXME!!!
}
f_gh = f_gh%30;
f_ss = n_id%30;*/
@@ -102,7 +102,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
c_init = (1<<5)*floor(n_id/30)+(n_id%30); // we initialize c_init to calculate u,v
s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
f_ss = n_id%30;
- l = 32, minShift = (2*nr_tti_tx+n_hop);
+ l = 32, minShift = (2*nr_slot_tx+n_hop);
while(minShift >= l) {
s = lte_gold_generic(&x1, &c_init, 0);
@@ -111,7 +111,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
*v = (uint8_t)((s>>tmpShift)&1);
- // *v = (uint8_t)((s>>(2*nr_tti_tx+n_hop))&1); // Not sure we have to use nr_tti_tx FIXME!!!
+ // *v = (uint8_t)((s>>(2*nr_slot_tx+n_hop))&1); // Not sure we have to use nr_slot_tx FIXME!!!
}
*u = (f_gh+f_ss)%30;
@@ -125,7 +125,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
uint8_t mcs,
uint8_t lnormal,
uint8_t lprime,
- int nr_tti_tx) {
+ int nr_slot_tx) {
/*
* Implements TS 38.211 subclause 6.3.2.2.2 Cyclic shift hopping
* - n_id: higher-layer parameter hoppingId
@@ -140,7 +140,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
uint32_t x1,s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
uint8_t n_cs=0;
- int l = 32, minShift = (14*8*nr_tti_tx )+ 8*(lnormal+lprime);
+ int l = 32, minShift = (14*8*nr_slot_tx )+ 8*(lnormal+lprime);
int tmpShift =0;
#ifdef DEBUG_NR_PUCCH_TX
printf("\t\t [nr_cyclic_shift_hopping] calculating alpha (cyclic shift) using c_init=%u -> \n",c_init);
@@ -155,8 +155,8 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
tmpShift = (minShift&((1<<5)-1)); //minShift%32;
minShift ++;
n_cs = n_cs+((1<>tmpShift)&1)));
- // calculating n_cs (Not sure we have to use nr_tti_tx FIXME!!!)
- // n_cs = n_cs+((1<>((14*8*nr_tti_tx) + 8*(lnormal+lprime) + m))&1)));
+ // calculating n_cs (Not sure we have to use nr_slot_tx FIXME!!!)
+ // n_cs = n_cs+((1<>((14*8*nr_slot_tx) + 8*(lnormal+lprime) + m))&1)));
}
alpha = (alpha * (double)((m0+mcs+n_cs)%12));
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 4622c31db3..1372250aca 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1234,16 +1234,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
{
start_meas(&gNB->ulsch_ptrs_processing_stats);
nr_pusch_ptrs_processing(gNB,
+ frame_parms,
rel15_ul,
ulsch_id,
nr_tti_rx,
- dmrs_symbol_flag,
symbol,
nb_re_pusch);
stop_meas(&gNB->ulsch_ptrs_processing_stats);
/* Subtract total PTRS RE's in the symbol from PUSCH RE's */
- gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol] -= gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol;
+ gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol] -= gNB->pusch_vars[ulsch_id]->ptrs_re_per_slot;
}
/*---------------------------------------------------------------------------------------------------- */
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index dec3d7cc2d..990f3101fd 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -185,3 +185,57 @@ short filt8_rr1[8] = {
short filt8_rr2[8] = {
-4096,-8192,-12288,-16384,0,0,0,0};
+
+short filt8_l2[8] = {
+0,0,13107,9830,6554,3277,0,0};
+
+short filt8_r2[8] = {
+0,0,3277,6554,9830,13107,0,0};
+
+short filt8_m2[8] = {
+0,0,0,0,13107,9830,6554,3277};
+
+short filt8_mm2[8]= {
+0,0,0,0,3277,6554,9830,13107};
+
+short filt8_rl2[8] = {
+19661,22938,26214,29491,0,0,0,0};
+
+short filt8_rm2[8] = {
+-3277,-6554,-9830,-13107,0,0,0,0};//-3277,-6554,-9830,-13107
+
+short filt8_l3[8] = {
+22938,19661,0,0,13107,9830,6554,3277};
+
+short filt8_r3[8] = {
+-7537,-4260,0,0,3277,6554,9830,13107};//-6554,-3277
+
+short filt8_rl3[8] = {
+0,0,19661,22938,0,0,0,0};
+
+short filt8_rr3[8] = {
+0,0,-4260,-7537,0,0,0,0};//-3277,-6554
+
+short filt8_dcrl1[8] = {
+14895,13405,11916,10426,8937,7447,5958,4468};
+
+short filt8_dcrh1[8] = {
+2979,1489,0,0,0,0,0,0};
+
+short filt8_dcll1[8] = {
+13405,14895,0,0,0,0,0,0};
+
+short filt8_dclh1[8] = {
+1489,2979,4468,5958,7447,8937,10426,11916};
+
+short filt8_dcrl2[8] = {
+0,0,0,0,14895,13405,11916,10426};
+
+short filt8_dcrh2[8] = {
+8937,7447,5958,4468,2979,1489,0,0,};
+
+short filt8_dcll2[8] = {
+7447,8937,10426,11916,13405,14895,0,0};
+
+short filt8_dclh2[8] = {
+0,0,0,0,1489,2979,4468,5958};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index e350985b0a..ef6137a07f 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -133,4 +133,40 @@ extern short filt8_rr1[8];
extern short filt8_rr2[8];
+extern short filt8_rm2[8];
+
+extern short filt8_rl2[8];
+
+extern short filt8_l2[8];
+
+extern short filt8_r2[8];
+
+extern short filt8_m2[8];
+
+extern short filt8_mm2[8];
+
+extern short filt8_l3[8];
+
+extern short filt8_r3[8];
+
+extern short filt8_rr3[8];
+
+extern short filt8_rl3[8];
+
+extern short filt8_dcrl1[8];
+
+extern short filt8_dcrh1[8];
+
+extern short filt8_dcll1[8];
+
+extern short filt8_dclh1[8];
+
+extern short filt8_dcrl2[8];
+
+extern short filt8_dcrh2[8];
+
+extern short filt8_dcll2[8];
+
+extern short filt8_dclh2[8];
+
#endif
\ No newline at end of file
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
index e388bf8bc1..fa2f07726f 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
@@ -107,7 +107,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
if (ue->mac_enabled==1) {
LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
//mac_resynch();
- //dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
+ //dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
ue->UE_mode[0] = PRACH;
ue->prach_resources[gNB_id]->sync_frame = frame;
ue->prach_resources[gNB_id]->init_msg1 = 0;
@@ -126,9 +126,8 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
#ifdef DEBUG_PHY
- LOG_D(PHY,"AbsSubframe %d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
+ LOG_D(PHY,"AbsSubframe %d: diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
subframe,
- ue->current_thread_id[subframe],
diff,
ue->rx_offset,
clear,
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 71cd4c44e4..0a37f7d6ad 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -24,6 +24,10 @@
#include "SCHED_NR_UE/defs.h"
#include "nr_estimation.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
+#include "PHY/NR_REFSIG/nr_refsig.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
+#include "PHY/NR_REFSIG/ptrs_nr.h"
+#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
#include "filt16a_32.h"
//#define DEBUG_PDSCH
@@ -31,6 +35,7 @@
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -48,7 +53,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
uint8_t nushift;
uint8_t ssb_index=current_ssb->i_ssb;
uint8_t n_hf=current_ssb->n_hf;
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
nushift = ue->frame_parms.Nid_cell%4;
ue->frame_parms.nushift = nushift;
@@ -65,7 +70,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
k = nushift;
#ifdef DEBUG_CH
- printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ue->frame_parms.ofdm_symbol_size,
+ printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -192,6 +197,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -211,7 +217,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
uint8_t nushift;
int **dl_ch_estimates =ue->pbch_vars[eNB_offset]->dl_ch_estimates;
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
nushift = ue->frame_parms.Nid_cell%4;
ue->frame_parms.nushift = nushift;
@@ -233,7 +239,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
k = nushift;
#ifdef DEBUG_CH
- printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
+ printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -447,17 +453,17 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
if( dmrss == 2) // update time statistics for last PBCH symbol
{
- // do ifft of channel estimate
- for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
- for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) {
- if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
- {
- LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, ue->current_thread_id[Ns], symbol, ch_offset);
- idft(idftsizeidx,
- (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
- (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
- }
- }
+ // do ifft of channel estimate
+ for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
+ for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) {
+ if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
+ {
+ LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset);
+ idft(idftsizeidx,
+ (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
+ (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
+ }
+ }
}
//}
@@ -467,6 +473,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
}
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -482,8 +489,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
- int **dl_ch_estimates =ue->pdcch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates;
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
+ int **dl_ch_estimates =ue->pdcch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
@@ -496,7 +503,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
k = coreset_start_subcarrier;
#ifdef DEBUG_PDCCH
- printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
+ printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
@@ -641,6 +648,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
}
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned short p,
@@ -652,20 +660,17 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned char aarx;
unsigned short k;
unsigned int pilot_cnt;
- int16_t ch[2],*pil,*rxF,*dl_ch;
- int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
+ int16_t ch_l[2],ch_r[2],ch[2],*pil,*rxF,*dl_ch;
+ int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh, *frl, *frr;
int ch_offset,symbol_offset;
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
uint8_t nushift;
- int **dl_ch_estimates =ue->pdsch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates;
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF;
+ int **dl_ch_estimates =ue->pdsch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
- nushift = (p>>1)&1;
- ue->frame_parms.nushift = nushift;
-
- if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
+ if (ue->high_speed_flag == 0)
ch_offset = ue->frame_parms.ofdm_symbol_size ;
else
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
@@ -676,55 +681,103 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int re_offset = k;
#ifdef DEBUG_CH
- printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
+ printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,Ns,k, symbol);
#endif
- switch (nushift) {
- case 0:
- fl = filt8_l0;
- fm = filt8_m0;
- fr = filt8_r0;
- fmm = filt8_mm0;
- fml = filt8_m0;
- fmr = filt8_mr0;
- fdcl = filt8_dcl0;
- fdcr = filt8_dcr0;
- fdclh = filt8_dcl0_h;
- fdcrh = filt8_dcr0_h;
- break;
-
- case 1:
- fl = filt8_l1;
- fm = filt8_m1;
- fr = filt8_r1;
- fmm = filt8_mm1;
- fml = filt8_ml1;
- fmr = filt8_m1;
- fdcl = filt8_dcl1;
- fdcr = filt8_dcr1;
- fdclh = filt8_dcl1_h;
- fdcrh = filt8_dcr1_h;
- break;
-
- default:
- msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
- return(-1);
- break;
- }
-
-
- // generate pilot
+ // generate pilot for gNB port number 1000+p
uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12;
- int config_type = 0; // needs to be updated from higher layer
- nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
+ uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
+ int8_t delta = get_delta(p, config_type);
+ nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
+
+ if (config_type == pdsch_dmrs_type1){
+ nushift = (p>>1)&1;
+ ue->frame_parms.nushift = nushift;
+ switch (delta) {
+
+ case 0://port 0,1
+ fl = filt8_l0;//left interpolation Filter for DMRS config. 1
+ fm = filt8_m0;//left middle interpolation Filter
+ fr = filt8_r0;//right interpolation Filter
+ fmm = filt8_mm0;;//middle middle interpolation Filter
+ fml = filt8_m0;//left middle interpolation Filter
+ fmr = filt8_mr0;//middle right interpolation Filter
+ fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
+ fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
+ fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
+ fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
+ frl = NULL;
+ frr = NULL;
+ break;
+
+ case 1://port2,3
+ fl = filt8_l1;
+ fm = filt8_m1;
+ fr = filt8_r1;
+ fmm = filt8_mm1;
+ fml = filt8_ml1;
+ fmr = filt8_m1;
+ fdcl = filt8_dcl1;
+ fdcr = filt8_dcr1;
+ fdclh = filt8_dcl1_h;
+ fdcrh = filt8_dcr1_h;
+ frl = NULL;
+ frr = NULL;
+ break;
+
+ default:
+ msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+ return -1;
+ break;
+ }
+ } else {//pdsch_dmrs_type2
+ nushift = delta;
+ ue->frame_parms.nushift = nushift;
+ switch (delta) {
+ case 0://port 0,1
+ fl = filt8_l2;//left interpolation Filter should be fml
+ fr = filt8_r2;//right interpolation Filter should be fmr
+ fm = filt8_l2;
+ fmm = filt8_r2;
+ fml = filt8_ml2;
+ fmr = filt8_mr2;
+ frl = filt8_rl2;
+ frr = filt8_rm2;
+ fdcl = filt8_dcl1;
+ fdcr = filt8_dcr1;
+ fdclh = filt8_dcl1_h;
+ fdcrh = filt8_dcr1_h;
+ break;
+
+ case 2://port2,3
+ fl = filt8_l3;
+ fm = filt8_m2;
+ fr = filt8_r3;
+ fmm = filt8_mm2;
+ fml = filt8_l2;
+ fmr = filt8_r2;
+ frl = filt8_rl3;
+ frr = filt8_rr3;
+ fdcl = NULL;
+ fdcr = NULL;
+ fdclh = NULL;
+ fdcrh = NULL;
+ break;
+
+ default:
+ msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+ return -1;
+ break;
+ }
+ }
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
-
- pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)];
+ pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
k = k % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
- dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
+ re_offset = k;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+re_offset+nushift)];
+ dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
@@ -737,7 +790,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
printf("rxF addr %p p %d\n", rxF,p);
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
#endif
- //if ((ue->frame_parms.N_RB_DL&1)==0) {
+
+ if (config_type == pdsch_dmrs_type1) {
// Treat first 2 pilots specially (left edge)
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -867,7 +921,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch,
dl_ch,
8);
- //}
// check if PRB crosses DC and improve estimates around DC
if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
@@ -875,7 +928,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
uint16_t idxPil = idxDC/2;
re_offset = k;
- pil = (int16_t *)&pilot[rb_offset*((config_type==0) ? 6:4)];
+ pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
pil += (idxPil-2);
dl_ch += (idxDC-4);
dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
@@ -920,20 +973,394 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch,
8);
}
+ }
+ } else { //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
+ // Treat first 4 pilots specially (left edge)
+ ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+#ifdef DEBUG_PDSCH
+ printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
+ printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch_l[0],ch_l[1],pil[0],pil[1]);
+#endif
+
+ pil+=2;
+ re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+ ch[0] = (ch_l[0]+ch_r[0])>>1;
+ ch[1] = (ch_l[1]+ch_r[1])>>1;
+
+ dl_ch[(0+2*nushift)] = ch[0];
+ dl_ch[(1+2*nushift)] = ch[1];
+ dl_ch[2+2*nushift] = ch[0];
+ dl_ch[3+2*nushift] = ch[1];
+
+ multadd_real_vector_complex_scalar(fl,
+ ch,
+ dl_ch,
+ 8);
+
+ pil+=2;
+ re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+ pil+=2;
+ re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+ ch[0] = (ch_l[0]+ch_r[0])>>1;
+ ch[1] = (ch_l[1]+ch_r[1])>>1;
+
+ multadd_real_vector_complex_scalar(fr,
+ ch,
+ dl_ch,
+ 8);
+
+ dl_ch+=12;
+ dl_ch[0+2*nushift] = ch[0];
+ dl_ch[1+2*nushift] = ch[1];
+ dl_ch[2+2*nushift] = ch[0];
+ dl_ch[3+2*nushift] = ch[1];
+ dl_ch+=4;
+
+ for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt+=4) {
+
+ multadd_real_vector_complex_scalar(fml,
+ ch,
+ dl_ch,
+ 8);
+ pil+=2;
+ re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+#ifdef DEBUG_PDSCH
+ printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch_l[0],ch_l[1],pil[0],pil[1]);
+#endif
+
+ pil+=2;
+ re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+ ch[0] = (ch_l[0]+ch_r[0])>>1;
+ ch[1] = (ch_l[1]+ch_r[1])>>1;
+
+#ifdef DEBUG_PDSCH
+ printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch_r[0],ch_r[1],pil[0],pil[1]);
+#endif
+
+ multadd_real_vector_complex_scalar(fmr,
+ ch,
+ dl_ch,
+ 8);
+
+ dl_ch+=8;
+ dl_ch[0+2*nushift] = ch[0];
+ dl_ch[1+2*nushift] = ch[1];
+ dl_ch[2+2*nushift] = ch[0];
+ dl_ch[3+2*nushift] = ch[1];
+
+ multadd_real_vector_complex_scalar(fm,
+ ch,
+ dl_ch,
+ 8);
+
+ pil+=2;
+ re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+ pil+=2;
+ re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+ rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+ ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+ ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+
+#ifdef DEBUG_PDSCH
+ printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch_r[0],ch_r[1],pil[0],pil[1]);
+#endif
+
+ ch[0] = (ch_l[0]+ch_r[0])>>1;
+ ch[1] = (ch_l[1]+ch_r[1])>>1;
+
+ multadd_real_vector_complex_scalar(fmm,
+ ch,
+ dl_ch,
+ 8);
+
+ dl_ch+=12;
+ dl_ch[0+2*nushift] = ch[0];
+ dl_ch[1+2*nushift] = ch[1];
+ dl_ch[2+2*nushift] = ch[0];
+ dl_ch[3+2*nushift] = ch[1];
+ dl_ch+=4;
+ }
+
+ // Treat last 2 pilots specially (right edge)
+ // dl_ch-2+nushift<<1
+ multadd_real_vector_complex_scalar(frl,
+ dl_ch-2+2*nushift,
+ dl_ch,
+ 8);
+
+ multadd_real_vector_complex_scalar(frr,
+ dl_ch-14+2*nushift,/*14*/
+ dl_ch,
+ 8);
+
+ // check if PRB crosses DC and improve estimates around DC
+ if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size) && (p<2)) {
+
+ dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
+ uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
+ dl_ch += (idxDC-8);
+ dl_ch = memset(dl_ch, 0, sizeof(int16_t)*20);
+
+ dl_ch -= 2;
+
+ ch_r[0] = dl_ch[0];
+ ch_r[1]= dl_ch[1] ;
+ dl_ch += 22;
+ ch_l[0] = dl_ch[0];
+ ch_l[1]= dl_ch[1] ;
+
+ // for proper allignment of SIMD vectors
+ if((ue->frame_parms.N_RB_DL&1)==0) {
+ dl_ch -= 20;
+ //Interpolate fdcrl1 with ch_r
+ multadd_real_vector_complex_scalar(filt8_dcrl1,
+ ch_r,
+ dl_ch,
+ 8);
+ //Interpolate fdclh1 with ch_l
+ multadd_real_vector_complex_scalar(filt8_dclh1,
+ ch_l,
+ dl_ch,
+ 8);
+ dl_ch += 16;
+ //Interpolate fdcrh1 with ch_r
+ multadd_real_vector_complex_scalar(filt8_dcrh1,
+ ch_r,
+ dl_ch,
+ 8);
+ //Interpolate fdcll1 with ch_l
+ multadd_real_vector_complex_scalar(filt8_dcll1,
+ ch_l,
+ dl_ch,
+ 8);
+ } else {
+ dl_ch -= 28;
+ //Interpolate fdcrl1 with ch_r
+ multadd_real_vector_complex_scalar(filt8_dcrl2,
+ ch_r,
+ dl_ch,
+ 8);
+ //Interpolate fdclh1 with ch_l
+ multadd_real_vector_complex_scalar(filt8_dclh2,
+ ch_l,
+ dl_ch,
+ 8);
+ dl_ch += 16;
+ //Interpolate fdcrh1 with ch_r
+ multadd_real_vector_complex_scalar(filt8_dcrh2,
+ ch_r,
+ dl_ch,
+ 8);
+ //Interpolate fdcll1 with ch_l
+ multadd_real_vector_complex_scalar(filt8_dcll2,
+ ch_l,
+ dl_ch,
+ 8);
+ }
+ }
}
#ifdef DEBUG_PDSCH
- dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
+ dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
for(uint16_t idxP=0; idxPstatus == ACTIVE) {
+ symbInSlot = dlsch0_harq->start_symbol + dlsch0_harq->nb_symbols;
+ startSymbIndex = &dlsch0_harq->start_symbol;
+ nbSymb = &dlsch0_harq->nb_symbols;
+ L_ptrs = &dlsch0_harq->PTRSTimeDensity;
+ K_ptrs = &dlsch0_harq->PTRSFreqDensity;
+ dmrsSymbPos = &dlsch0_harq->dlDmrsSymbPos;
+ ptrsSymbPos = &dlsch0_harq->ptrs_symbols;
+ ptrsSymbIdx = &dlsch0_harq->ptrs_symbol_index;
+ ptrsReOffset = &dlsch0_harq->PTRSReOffset;
+ dmrsConfigType = &dlsch0_harq->ptrs_symbol_index;
+ nb_rb = &dlsch0_harq->nb_rb;
+ }
+ if(dlsch1_harq) {
+ symbInSlot = dlsch1_harq->start_symbol + dlsch0_harq->nb_symbols;
+ startSymbIndex = &dlsch1_harq->start_symbol;
+ nbSymb = &dlsch1_harq->nb_symbols;
+ L_ptrs = &dlsch1_harq->PTRSTimeDensity;
+ K_ptrs = &dlsch1_harq->PTRSFreqDensity;
+ dmrsSymbPos = &dlsch1_harq->dlDmrsSymbPos;
+ ptrsSymbPos = &dlsch1_harq->ptrs_symbols;
+ ptrsSymbIdx = &dlsch1_harq->ptrs_symbol_index;
+ ptrsReOffset = &dlsch1_harq->PTRSReOffset;
+ dmrsConfigType = &dlsch1_harq->ptrs_symbol_index;
+ nb_rb = &dlsch1_harq->nb_rb;
+ }
+ /* loop over antennas */
+ for (int aarx=0; aarxnb_antennas_rx; aarx++) {
+ phase_per_symbol = (int16_t*)pdsch_vars[eNB_id]->ptrs_phase_per_slot[aarx];
+ ptrs_re_symbol = (int32_t*)pdsch_vars[eNB_id]->ptrs_re_per_slot[aarx];
+ ptrs_re_symbol[symbol] = 0;
+ phase_per_symbol[(2*symbol)+1] = 0; // Imag
+ /* set DMRS estimates to 0 angle with magnitude 1 */
+ if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
+ /* set DMRS real estimation to 32767 */
+ phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767
+#ifdef DEBUG_DL_PTRS
+ printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]);
+#endif
+ }
+ else { // real ptrs value is set to 0
+ phase_per_symbol[2*symbol] = 0; // Real
+ }
+
+ if(dlsch0_harq->status == ACTIVE) {
+ if(symbol == *startSymbIndex) {
+ *ptrsSymbPos = 0;
+ set_ptrs_symb_idx(ptrsSymbPos,
+ *nbSymb,
+ *startSymbIndex,
+ 1<< *L_ptrs,
+ *dmrsSymbPos);
+ }
+ /* if not PTRS symbol set current ptrs symbol index to zero*/
+ *ptrsSymbIdx = 0;
+ /* Check if current symbol contains PTRS */
+ if(is_ptrs_symbol(symbol, *ptrsSymbPos)) {
+ *ptrsSymbIdx = symbol;
+ /*------------------------------------------------------------------------------------------------------- */
+ /* 1) Estimate common phase error per PTRS symbol */
+ /*------------------------------------------------------------------------------------------------------- */
+ nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
+ rnti,
+ (int16_t *)&pdsch_vars[eNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch],
+ nr_slot_rx,
+ symbol,frame_parms->ofdm_symbol_size,
+ (int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)],
+ ue->nr_gold_pdsch[eNB_id][nr_slot_rx][symbol],
+ &phase_per_symbol[2* symbol],
+ &ptrs_re_symbol[symbol]);
+ }
+ }// HARQ 0
+
+ /* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
+ if(symbol == (symbInSlot -1)) {
+ /*------------------------------------------------------------------------------------------------------- */
+ /* 2) Interpolate PTRS estimated value in TD */
+ /*------------------------------------------------------------------------------------------------------- */
+ /* If L-PTRS is > 0 then we need interpolation */
+ if(*L_ptrs > 0) {
+ ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb);
+ if(ret != 0) {
+ LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
+ }
+ }
+#ifdef DEBUG_DL_PTRS
+ LOG_M("ptrsEst.m","est",pdsch_vars[eNB_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
+ LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
+ &pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ],
+ (*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb),1,1);
+#endif
+ /*------------------------------------------------------------------------------------------------------- */
+ /* 3) Compensated DMRS based estimated signal with PTRS estimation */
+ /*--------------------------------------------------------------------------------------------------------*/
+ for(uint8_t i = *startSymbIndex; i< symbInSlot ;i++) {
+ /* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
+ /* Skip rotation if the slot processing is wrong */
+ if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
+#ifdef DEBUG_DL_PTRS
+ printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
+#endif
+ rotate_cpx_vector((int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+ &phase_per_symbol[2* i],
+ (int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+ ((*nb_rb) * NR_NB_SC_PER_RB), 15);
+ }// if not DMRS Symbol
+ }// symbol loop
+ }// last symbol check
+ }//Antenna loop
+}//main function
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index 892c6b7692..419f84d418 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -43,6 +43,7 @@
\param symbol symbol within frame
*/
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -50,6 +51,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned short nb_rb_coreset);
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -57,6 +59,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
NR_UE_SSB *current_ssb);
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned char symbol,
@@ -65,6 +68,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
uint8_t n_hf);
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t eNB_offset,
unsigned char Ns,
unsigned short p,
@@ -81,6 +85,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
short coef);
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
unsigned int subframe_offset,
unsigned char N0_symbol,
unsigned char abstraction_flag,
@@ -88,8 +93,9 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
uint8_t subframe);
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
- uint8_t slot,
- uint8_t abstraction_flag);
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t slot,
+ uint8_t abstraction_flag);
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
uint32_t rx_power_fil_dB,
@@ -97,6 +103,18 @@ void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index);
+void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
+ NR_UE_PDSCH **pdsch_vars,
+ NR_DL_FRAME_PARMS *frame_parms,
+ NR_DL_UE_HARQ_t *dlsch0_harq,
+ NR_DL_UE_HARQ_t *dlsch1_harq,
+ uint8_t eNB_id,
+ uint8_t nr_slot_rx,
+ unsigned char symbol,
+ uint32_t nb_re_pdsch,
+ unsigned char harq_pid,
+ uint16_t rnti,
+ RX_type_t rx_type);
float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
index d3eb5e7563..971db724c6 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
@@ -107,11 +107,12 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
- unsigned int subframe_offset,
- unsigned char N0_symbol,
- unsigned char abstraction_flag,
- unsigned char rank_adaptation,
- uint8_t subframe)
+ UE_nr_rxtx_proc_t *proc,
+ unsigned int subframe_offset,
+ unsigned char N0_symbol,
+ unsigned char abstraction_flag,
+ unsigned char rank_adaptation,
+ uint8_t subframe)
{
int aarx,aatx,eNB_id=0; //,gain_offset=0;
//int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
@@ -131,7 +132,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
/*int16_t *dl_ch;
- dl_ch = (int16_t *)&ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates[eNB_id][ch_offset];*/
+ dl_ch = (int16_t *)&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset];*/
ch_offset = ue->frame_parms.ofdm_symbol_size*2;
@@ -142,7 +143,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
for (aarx=0; aarxnb_antennas_rx; aarx++) {
for (aatx=0; aatxnb_antenna_ports_gNB; aatx++) {
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
- (signal_energy_nodc(&ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates[eNB_id][ch_offset],
+ (signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset],
(50*12)));
//- ue->measurements.n0_power[aarx];
@@ -224,6 +225,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
}
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
uint8_t slot,
uint8_t abstraction_flag)
{
@@ -234,7 +236,7 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
uint8_t eNB_offset=0,l,nushift;
uint16_t off,nb_rb;
// NR_UE_MAC_INST_t *mac = get_mac_inst(0);
- int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF;
+ int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
nushift = ue->frame_parms.Nid_cell%4;
ue->frame_parms.nushift = nushift;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index 64dc8f5950..5e45b90536 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -668,12 +668,13 @@ void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
#ifdef NR_PDCCH_DCI_RUN
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
- uint32_t frame,
- uint32_t slot) {
+ UE_nr_rxtx_proc_t *proc) {
+ uint32_t frame = proc->frame_rx;
+ uint32_t slot = proc->nr_slot_rx;
NR_UE_COMMON *common_vars = &ue->common_vars;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[slot]][0];
+ NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
uint8_t log2_maxh, aarx;
@@ -687,7 +688,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
- nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF,
+ nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
pdcch_vars->dl_ch_estimates,
pdcch_vars->rxdataF_ext,
pdcch_vars->dl_ch_estimates_ext,
@@ -779,8 +780,9 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
#endif
-void pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
- uint8_t nr_tti_rx,
+#if 0
+void nr_pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nr_slot_rx,
uint8_t *e,
uint32_t length) {
int i;
@@ -788,7 +790,7 @@ void pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
uint32_t x1, x2, s=0;
reset = 1;
// x1 is set in lte_gold_generic
- x2 = (nr_tti_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
+ x2 = (nr_slot_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
for (i=0; i>(i&0x1f))&1);
}
}
+#endif
#ifdef NR_PDCCH_DCI_RUN
@@ -839,11 +842,10 @@ void nr_pdcch_unscrambling(int16_t *z,
#ifdef NR_PDCCH_DCI_RUN
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
- int frame,
- int slot,
- fapi_nr_dci_indication_t *dci_ind) {
+ UE_nr_rxtx_proc_t *proc,
+ fapi_nr_dci_indication_t *dci_ind) {
- NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[slot]][0];
+ NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
for (int i=0;inb_search_space;i++) {
@@ -884,8 +886,8 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
if (crc == n_rnti) {
LOG_D(PHY,"Decoded crc %x matches rnti %x for DCI format %d\n", crc, n_rnti, rel15->dci_format_options[k]);
- dci_ind->SFN = frame;
- dci_ind->slot = slot;
+ dci_ind->SFN = proc->frame_rx;
+ dci_ind->slot = proc->nr_slot_rx;
dci_ind->dci_list[dci_ind->number_of_dcis].rnti = n_rnti;
dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE = CCEind;
dci_ind->dci_list[dci_ind->number_of_dcis].dci_format = rel15->dci_format_options[k];
@@ -909,7 +911,7 @@ void nr_dci_decoding_procedure0(int s,
uint16_t coreset_nbr_rb,
NR_UE_PDCCH **pdcch_vars,
int do_common,
- uint8_t nr_tti_rx,
+ uint8_t nr_slot_rx,
NR_DCI_ALLOC_t *dci_alloc,
int16_t eNB_id,
uint8_t current_thread_id,
@@ -944,7 +946,7 @@ void nr_dci_decoding_procedure0(int s,
LOG_DDD("format_found is %d \n", *format_found);
//if (mode == NO_DCI) {
// #ifdef NR_PDCCH_DCI_DEBUG
- // LOG_DDD("skip DCI decoding: expect no DCIs at nr_tti_rx %d in current searchSpace\n", nr_tti_rx);
+ // LOG_DDD("skip DCI decoding: expect no DCIs at nr_slot_rx %d in current searchSpace\n", nr_slot_rx);
// #endif
// return;
//}
@@ -978,8 +980,8 @@ void nr_dci_decoding_procedure0(int s,
// }
// if (mode == NO_DCI) {
-// LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_tti_rx %d\n",
-// nr_tti_rx);
+// LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_slot_rx %d\n",
+// nr_slot_rx);
// return;
// }
@@ -1050,7 +1052,7 @@ void nr_dci_decoding_procedure0(int s,
// compute Yk
Yk = (unsigned int) pdcch_vars[eNB_id]->crnti;
- for (i = 0; i <= nr_tti_rx; i++)
+ for (i = 0; i <= nr_slot_rx; i++)
Yk = (Yk * A[p%3]) % 65537;
}
@@ -1319,7 +1321,7 @@ void nr_dci_decoding_procedure0(int s,
}
// store first nCCE of group for PUCCH transmission of ACK/NAK
- pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
+ pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
// if (crc == si_rnti) {
// dci_alloc[*dci_cnt].format = format_si;
@@ -1330,7 +1332,7 @@ void nr_dci_decoding_procedure0(int s,
// } else if (crc == ra_rnti) {
// dci_alloc[*dci_cnt].format = format_ra;
// // store first nCCE of group for PUCCH transmission of ACK/NAK
- // pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
+ // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
// *dci_cnt = *dci_cnt + 1;
// } else if (crc == pdcch_vars[eNB_id]->crnti) {
@@ -1341,23 +1343,23 @@ void nr_dci_decoding_procedure0(int s,
// dci_alloc[*dci_cnt].format = format0;
// *format0_found = 1;
// *dci_cnt = *dci_cnt + 1;
- // pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
+ // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
// }
// } else if (format_c == format0) { // this is a format 1A DCI
// dci_alloc[*dci_cnt].format = format1A;
// *dci_cnt = *dci_cnt + 1;
- // pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
+ // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
// } else {
// // store first nCCE of group for PUCCH transmission of ACK/NAK
// if (*format_c_found == 0) {
// dci_alloc[*dci_cnt].format = format_c;
// *dci_cnt = *dci_cnt + 1;
// *format_c_found = 1;
- // pdcch_vars[eNB_id]->nCCE[nr_tti_rx] = CCEind;
+ // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
// }
// }
// }
- //LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[nr_tti_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_tti_rx, pdcch_vars[eNB_id]->nCCE[nr_tti_rx],L2);
+ //LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[nr_slot_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_slot_rx, pdcch_vars[eNB_id]->nCCE[nr_slot_rx],L2);
// memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
switch (1 << L) {
case 1:
@@ -1424,7 +1426,7 @@ uint8_t nr_dci_decoding_procedure(int s,
NR_DCI_ALLOC_t *dci_alloc,
NR_SEARCHSPACE_TYPE_t searchSpacetype,
int16_t eNB_id,
- uint8_t nr_tti_rx,
+ uint8_t nr_slot_rx,
uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
uint16_t n_RB_ULBWP,
uint16_t n_RB_DLBWP,
@@ -1432,16 +1434,16 @@ uint8_t nr_dci_decoding_procedure(int s,
format_found_t *format_found,
uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES]) {
// uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
- LOG_DD("(nr_dci_decoding_procedure) nr_tti_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
- nr_tti_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
+ LOG_DD("(nr_dci_decoding_procedure) nr_slot_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
+ nr_slot_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
int do_common = (int)searchSpacetype;
uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
crc_scrambled_t crc_scrambled_ = *crc_scrambled;
format_found_t format_found_ = *format_found;
uint8_t dci_cnt = 0, old_dci_cnt = 0;
uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
- NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]];
- NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
+ NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]];
+ NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]][eNB_id];
uint16_t pdcch_DMRS_scrambling_id = pdcch_vars2->coreset[p].pdcchDMRSScramblingID;
uint64_t coreset_freq_dom = pdcch_vars2->coreset[p].frequencyDomainResources;
int coreset_time_dur = pdcch_vars2->coreset[p].duration;
@@ -1455,7 +1457,7 @@ uint8_t nr_dci_decoding_procedure(int s,
coreset_nbr_rb = 6 * coreset_nbr_rb;
// coreset_time_dur,coreset_nbr_rb,
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- //uint8_t mi;// = get_mi(&ue->frame_parms, nr_tti_rx);
+ //uint8_t mi;// = get_mi(&ue->frame_parms, nr_slot_rx);
//uint8_t tmode = ue->transmission_mode[eNB_id];
//uint8_t frame_type = frame_parms->frame_type;
uint8_t format_0_0_1_0_size_bits = 0, format_0_0_1_0_size_bytes = 0; //FIXME
@@ -1490,7 +1492,7 @@ uint8_t nr_dci_decoding_procedure(int s,
* Possible overlap between RE for SS/PBCH blocks (described in section 10, 38.213) has not been implemented yet
* This can be implemented by setting variable 'mode = NO_DCI' when overlap occurs
*/
- //dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_tti_rx);
+ //dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_slot_rx);
LOG_DD("searSpaceType=%d\n",do_common);
LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
@@ -1520,7 +1522,7 @@ uint8_t nr_dci_decoding_procedure(int s,
// blind decoding (Type0-PDCCH,Type0A-PDCCH,Type1-PDCCH,Type2-PDCCH)
// for format0_0 => we are NOT implementing format0_0 for common search spaces. FIXME!
// for format0_0 and format1_0, first we calculate dci pdu size
- format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
+ format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
@@ -1531,7 +1533,7 @@ uint8_t nr_dci_decoding_procedure(int s,
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat0_0_and_1_0, uformat0_0_and_1_0,
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
@@ -1540,7 +1542,7 @@ uint8_t nr_dci_decoding_procedure(int s,
if (dci_cnt != old_dci_cnt) {
// we will exit the loop as we have found the DCI
aggregationLevel = 5;
- format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
+ format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
0); // after decoding dci successfully we recalculate dci pdu size with correct crc scrambled to get the right field sizes
old_dci_cnt = dci_cnt;
@@ -1555,7 +1557,7 @@ uint8_t nr_dci_decoding_procedure(int s,
// or TPC-PUSCH-RNTI, or TPC-PUCCH-RNTI, or TPC-SRS-RNTI, or C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
if (css_dci_format == cformat2_0) {
// for format2_0, first we calculate dci pdu size
- format_2_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_sfi_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,4);
+ format_2_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_sfi_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,4);
format_2_0_size_bytes = (format_2_0_size_bits%8 == 0) ? (uint8_t)floor(format_2_0_size_bits/8) : (uint8_t)(floor(format_2_0_size_bits/8) + 1);
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_0_size_bits=%d, format2_0_size_bytes=%d\n",
css_dci_format,format_2_0_size_bits,format_2_0_size_bytes);
@@ -1565,7 +1567,7 @@ uint8_t nr_dci_decoding_procedure(int s,
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevelSFI,
cformat2_0, uformat0_0_and_1_0,
format_2_0_size_bits, format_2_0_size_bytes, &dci_cnt,
@@ -1585,7 +1587,7 @@ uint8_t nr_dci_decoding_procedure(int s,
if (css_dci_format == cformat2_1) {
// for format2_1, first we calculate dci pdu size
- format_2_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_int_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,5);
+ format_2_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_int_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,5);
format_2_1_size_bytes = (format_2_1_size_bits%8 == 0) ? (uint8_t)floor(format_2_1_size_bits/8) : (uint8_t)(floor(format_2_1_size_bits/8) + 1);
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_1_size_bits=%d, format2_1_size_bytes=%d\n",
css_dci_format,format_2_1_size_bits,format_2_1_size_bytes);
@@ -1595,7 +1597,7 @@ uint8_t nr_dci_decoding_procedure(int s,
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat2_1, uformat0_0_and_1_0,
format_2_1_size_bits, format_2_1_size_bytes, &dci_cnt,
@@ -1615,7 +1617,7 @@ uint8_t nr_dci_decoding_procedure(int s,
if (css_dci_format == cformat2_2) {
// for format2_2, first we calculate dci pdu size
- format_2_2_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_tpc_pucch_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,6);
+ format_2_2_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_pucch_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,6);
format_2_2_size_bytes = (format_2_2_size_bits%8 == 0) ? (uint8_t)floor(format_2_2_size_bits/8) : (uint8_t)(floor(format_2_2_size_bits/8) + 1);
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_2_size_bits=%d, format2_2_size_bytes=%d\n",
css_dci_format,format_2_2_size_bits,format_2_2_size_bytes);
@@ -1625,7 +1627,7 @@ uint8_t nr_dci_decoding_procedure(int s,
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat2_2, uformat0_0_and_1_0,
format_2_2_size_bits, format_2_2_size_bytes, &dci_cnt,
@@ -1645,7 +1647,7 @@ uint8_t nr_dci_decoding_procedure(int s,
if (css_dci_format == cformat2_3) {
// for format2_1, first we calculate dci pdu size
- format_2_3_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_tpc_srs_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,7);
+ format_2_3_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_tpc_srs_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,7);
format_2_3_size_bytes = (format_2_3_size_bits%8 == 0) ? (uint8_t)floor(format_2_3_size_bits/8) : (uint8_t)(floor(format_2_3_size_bits/8) + 1);
LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format2_3_size_bits=%d, format2_3_size_bytes=%d\n",
css_dci_format,format_2_3_size_bits,format_2_3_size_bytes);
@@ -1655,7 +1657,7 @@ uint8_t nr_dci_decoding_procedure(int s,
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 1, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat2_3, uformat0_0_and_1_0,
format_2_3_size_bits, format_2_3_size_bytes, &dci_cnt,
@@ -1676,7 +1678,7 @@ uint8_t nr_dci_decoding_procedure(int s,
// UE-specific search space for a DCI format with CRC scrambled by C-RNTI, or CS-RNTI(s), or SP-CSI-RNTI
if (uss_dci_format == uformat0_0_and_1_0) {
// for format0_0 and format1_0, first we calculate dci pdu size
- format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
+ format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
@@ -1687,7 +1689,7 @@ uint8_t nr_dci_decoding_procedure(int s,
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat0_0_and_1_0, uformat0_0_and_1_0,
format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
@@ -1707,7 +1709,7 @@ uint8_t nr_dci_decoding_procedure(int s,
if (uss_dci_format == uformat0_1_and_1_1) {
// for format0_0 and format1_0, first we calculate dci pdu size
- format_0_1_1_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_tti_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,1);
+ format_0_1_1_1_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,1);
format_0_1_1_1_size_bytes = (format_0_1_1_1_size_bits%8 == 0) ? (uint8_t)floor(format_0_1_1_1_size_bits/8) : (uint8_t)(floor(format_0_1_1_1_size_bits/8) + 1);
LOG_DD("calculating dci format size for UE-specific searchSpaces with format uss_dci_format=%d, format_0_1_1_1_size_bits=%d, format_0_1_1_1_size_bytes=%d\n",
css_dci_format,format_0_1_1_1_size_bits,format_0_1_1_1_size_bytes);
@@ -1718,7 +1720,7 @@ uint8_t nr_dci_decoding_procedure(int s,
LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
css_dci_format,(1<current_thread_id[nr_tti_rx], frame_parms,
+ nr_dci_decoding_procedure0(s,p,coreset_time_dur,coreset_nbr_rb,pdcch_vars, 0, nr_slot_rx, dci_alloc, eNB_id, ue->current_thread_id[nr_slot_rx], frame_parms,
crc_scrambled_values, aggregationLevel,
cformat0_0_and_1_0, uformat0_1_and_1_1,
format_0_1_1_1_size_bits, format_0_1_1_1_size_bytes, &dci_cnt,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index fb3f1ae133..75cb6ff91b 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -218,16 +218,18 @@ void nr_dlsch_unscrambling(int16_t* llr,
}
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
- short *dlsch_llr,
- NR_DL_FRAME_PARMS *frame_parms,
- NR_UE_DLSCH_t *dlsch,
- NR_DL_UE_HARQ_t *harq_process,
- uint32_t frame,
- uint16_t nb_symb_sch,
- uint8_t nr_tti_rx,
- uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag)
+ UE_nr_rxtx_proc_t *proc,
+ int eNB_id,
+ short *dlsch_llr,
+ NR_DL_FRAME_PARMS *frame_parms,
+ NR_UE_DLSCH_t *dlsch,
+ NR_DL_UE_HARQ_t *harq_process,
+ uint32_t frame,
+ uint16_t nb_symb_sch,
+ uint8_t nr_slot_rx,
+ uint8_t harq_pid,
+ uint8_t is_crnti,
+ uint8_t llr8_flag)
{
#if UE_TIMING_TRACE
@@ -277,7 +279,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
}
uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
- AssertFatal(dmrs_length == 1 || dmrs_length == 2,"Illegal dmrs_length %d\n",dmrs_length);
uint32_t i,j;
@@ -298,14 +299,14 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
return(dlsch->max_ldpc_iterations + 1);
}
- /*if (nr_tti_rx> (frame_parms->slots_per_subframe-1)) {
- printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx);
+ /*if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
+ printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
return(dlsch->max_ldpc_iterations + 1);
}*/
/*if (harq_process->harq_ack.ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
- phy_vars_ue->Mod_id, nr_tti_rx, harq_process->harq_ack.ack);
+ phy_vars_ue->Mod_id, nr_slot_rx, harq_process->harq_ack.ack);
}*/
// nb_rb = dlsch->nb_rb;
@@ -316,7 +317,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
return(max_ldpc_iterations + 1);
}*/
- /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
+ /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_ldpc_iterations + 1);
@@ -553,7 +554,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
start_meas(dlsch_turbo_decoding_stats);
#endif
- //LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_tti_rx,r,harq_process->C-1, A);
+ //LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_slot_rx,r,harq_process->C-1, A);
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
@@ -646,7 +647,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
- LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
+ LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
err_flag = 1;
}
}
@@ -654,14 +655,14 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if (err_flag == 1) {
//#if UE_DEBUG_TRACE
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- phy_vars_ue->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+ phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
//#endif
harq_process->harq_ack.ack = 0;
harq_process->harq_ack.harq_id = harq_pid;
harq_process->harq_ack.send_harq_status = 1;
harq_process->errors[harq_process->round]++;
- // printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round);
+ // printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round);
if (harq_process->round >= dlsch->Mlimit) {
harq_process->status = SCH_IDLE;
harq_process->round = 0;
@@ -670,15 +671,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if(is_crnti)
{
- LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
- phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+ phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
}
return((1 + dlsch->max_ldpc_iterations));
} else {
//#if UE_DEBUG_TRACE
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
- phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
+ phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
//#endif
harq_process->status = SCH_IDLE;
@@ -692,7 +693,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if(is_crnti)
{
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
}
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
@@ -761,7 +762,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
NR_DL_UE_HARQ_t *harq_process,
uint32_t frame,
uint16_t nb_symb_sch,
- uint8_t nr_tti_rx,
+ uint8_t nr_slot_rx,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag)
@@ -838,14 +839,14 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
return(dlsch->max_ldpc_iterations);
}
- /* if (nr_tti_rx> (frame_parms->slots_per_subframe-1)) {
- printf("dlsch_decoding.c: Illegal subframe index %d\n",nr_tti_rx);
+ /* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
+ printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
return(dlsch->max_ldpc_iterations);
}
- if (dlsch->harq_ack[nr_tti_rx].ack != 2) {
+ if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
- phy_vars_ue->Mod_id, nr_tti_rx, dlsch->harq_ack[nr_tti_rx].ack);
+ phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
}*/
/*
@@ -854,7 +855,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
return(max_ldpc_iterations);
}*/
- /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
+ /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_ldpc_iterations);
@@ -982,15 +983,16 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
memset(&curMsg->proc, 0, sizeof(curMsg->proc));
- curMsg->proc.frame_rx = proc->frame_rx;
- curMsg->proc.nr_tti_rx = proc->nr_tti_rx;
- curMsg->proc.num_seg = nb_seg;
+ curMsg->proc.frame_rx = proc->frame_rx;
+ curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
+ curMsg->proc.thread_id = proc->thread_id;
+ curMsg->proc.num_seg = nb_seg;
curMsg->proc.eNB_id= eNB_id;
curMsg->proc.harq_pid=harq_pid;
curMsg->proc.llr8_flag = llr8_flag;
- msgToPush_dl->key= (nr_tti_rx%2) ? (nb_seg+30): nb_seg;
+ msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
pushTpool(Tpool_dl, msgToPush_dl);
/*Qm= harq_process->Qm;
@@ -1144,7 +1146,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
#if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats);
#endif
- LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
+ LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
/*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
inv_d[cnt] = (1)*harq_process->d[r][cnt];
@@ -1236,7 +1238,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
- LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_tti_rx,r,harq_process->C-1);
+ LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
err_flag = 1;
}
//} //loop r
@@ -1244,7 +1246,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
if (err_flag == 1) {
#if UE_DEBUG_TRACE
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
- phy_vars_ue->Mod_id, frame, nr_tti_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+ phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
#endif
harq_process->harq_ack.ack = 0;
harq_process->harq_ack.harq_id = harq_pid;
@@ -1260,15 +1262,15 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
}
if(is_crnti)
{
- LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
- phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+ phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
}
return((1+dlsch->max_ldpc_iterations));
} else {
#if UE_DEBUG_TRACE
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d\n",
- phy_vars_ue->Mod_id,nr_tti_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
+ phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
#endif
harq_process->status = SCH_IDLE;
@@ -1281,7 +1283,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
if(is_crnti)
{
- LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
+ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
}
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
@@ -1380,7 +1382,7 @@ void nr_dlsch_decoding_process(void *arg)
__m128i *pl = (__m128i*)&l;
proc->instance_cnt_dlsch_td=-1;
- //proc->nr_tti_rx=proc->sub_frame_start;
+ //proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
proc->decoder_thread_available = 1;
@@ -1404,16 +1406,16 @@ void nr_dlsch_decoding_process(void *arg)
int harq_pid = proc->harq_pid;
llr8_flag1 = proc->llr8_flag;
int frame = proc->frame_rx;
- int slot = proc->nr_tti_rx;
+ int slot = proc->nr_slot_rx;
r = proc->num_seg;
- NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[slot]][eNB_id][0];
+ NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid];
- short *dlsch_llr = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[slot]][eNB_id]->llr[0];
+ short *dlsch_llr = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
//printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag);
p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
nb_symb_sch = harq_process->nb_symbols;
- printf("dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_tti_rx, proc->num_seg, r, harq_process->nb_symbols);
+ printf("dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
/*
@@ -1422,7 +1424,7 @@ void nr_dlsch_decoding_process(void *arg)
return(max_ldpc_iterations);
}*/
- /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
+ /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_ldpc_iterations);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index fae97f6824..81349f202c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -37,7 +37,10 @@
//#include "extern.h"
#include "PHY/sse_intrin.h"
#include "T.h"
+#include "openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h"
#include "openair1/PHY/NR_TRANSPORT/nr_dlsch.h"
+#include "PHY/NR_REFSIG/nr_refsig.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
#ifndef USER_MODE
#define NOCYGWIN_STATIC static
@@ -99,17 +102,41 @@ static void nr_dlsch_layer_demapping(int16_t **llr_cw,
uint16_t length,
int16_t **llr_layers);
+
+/* compute LLR */
+static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
+ NR_DL_FRAME_PARMS *frame_parms,
+ int32_t **rxdataF_comp_ptr,
+ int32_t **dl_ch_mag_ptr,
+ NR_DL_UE_HARQ_t *dlsch0_harq,
+ NR_DL_UE_HARQ_t *dlsch1_harq,
+ RX_type_t rx_type,
+ unsigned char harq_pid,
+ unsigned char eNB_id,
+ unsigned char eNB_id_i,
+ unsigned char first_symbol_flag,
+ unsigned char symbol,
+ unsigned short nb_rb,
+ unsigned short round,
+ int32_t codeword_TB0,
+ int32_t codeword_TB1,
+ uint32_t len,
+ uint8_t nr_slot_rx,
+ uint8_t beamforming_mode);
+
+/* Main Function */
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
- PDSCH_t type,
- unsigned char eNB_id,
- unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
- uint32_t frame,
- uint8_t nr_tti_rx,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- RX_type_t rx_type,
- unsigned char i_mod,
- unsigned char harq_pid)
+ UE_nr_rxtx_proc_t *proc,
+ PDSCH_t type,
+ unsigned char eNB_id,
+ unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
+ uint32_t frame,
+ uint8_t nr_slot_rx,
+ unsigned char symbol,
+ unsigned char first_symbol_flag,
+ RX_type_t rx_type,
+ unsigned char i_mod,
+ unsigned char harq_pid)
{
NR_UE_COMMON *common_vars = &ue->common_vars;
@@ -142,51 +169,50 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//to be updated higher layer
unsigned short start_rb = 0;
unsigned short nb_rb_pdsch = 50;
- int16_t *pllr_symbol_cw0;
- int16_t *pllr_symbol_cw1;
- int16_t *pllr_symbol_layer0;
- int16_t *pllr_symbol_layer1;
//int16_t *pllr_symbol_cw0_deint;
//int16_t *pllr_symbol_cw1_deint;
- uint32_t llr_offset_symbol;
//uint16_t bundle_L = 2;
uint8_t pilots=0;
+ uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
uint16_t n_tx=1, n_rx=1;
int32_t median[16];
uint32_t len;
+ uint16_t startSymbIdx=0;
+ uint16_t nbSymb=0;
+ uint16_t pduBitmap=0x0;
switch (type) {
case SI_PDSCH:
- pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
+ pdsch_vars = ue->pdsch_vars[proc->thread_id];
dlsch = &ue->dlsch_SI[eNB_id];
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
break;
case RA_PDSCH:
- pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
+ pdsch_vars = ue->pdsch_vars[proc->thread_id];
dlsch = &ue->dlsch_ra[eNB_id];
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
break;
case PDSCH:
- pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]];
- dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id];
+ pdsch_vars = ue->pdsch_vars[proc->thread_id];
+ dlsch = ue->dlsch[proc->thread_id][eNB_id];
dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
beamforming_mode = ue->transmission_mode[eNB_id] < 7 ? 0 :ue->transmission_mode[eNB_id];
break;
default:
- LOG_E(PHY, "[UE][FATAL] nr_tti_rx %d: Unknown PDSCH format %d\n", nr_tti_rx, type);
+ LOG_E(PHY, "[UE][FATAL] nr_slot_rx %d: Unknown PDSCH format %d\n", nr_slot_rx, type);
return -1;
break;
}
if (dlsch0_harq && dlsch1_harq){
- LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_tti_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
+ LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", frame, nr_slot_rx, symbol, harq_pid, dlsch0_harq->status, dlsch1_harq->status);
if ((dlsch0_harq->status == ACTIVE) && (dlsch1_harq->status == ACTIVE)){
codeword_TB0 = dlsch0_harq->codeword;
@@ -220,7 +246,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
return -1;
} else {
- LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
+ LOG_E(PHY,"[UE][FATAL] nr_slot_rx %d: no active DLSCH\n", nr_slot_rx);
return(-1);
}
} else if (dlsch0_harq) {
@@ -232,7 +258,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
printf("[DEMOD] I am assuming only TB0 is active\n");
#endif
} else {
- LOG_E(PHY,"[UE][FATAL] nr_tti_rx %d: no active DLSCH\n", nr_tti_rx);
+ LOG_E(PHY,"[UE][FATAL] nr_slot_rx %d: no active DLSCH\n", nr_slot_rx);
return (-1);
}
} else {
@@ -312,9 +338,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
+ nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
pdsch_vars[eNB_id]->dl_ch_estimates,
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
@@ -324,7 +350,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pilots,
start_rb,
nb_rb_pdsch,
- nr_tti_rx,
+ nr_slot_rx,
ue->high_speed_flag,
frame_parms,
dlsch0_harq->mimo_mode);
@@ -337,7 +363,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
if (rx_type >= rx_IC_single_stream) {
if (eNB_id_in_connected_eNB) // we are in TM5
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
+ nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
pdsch_vars[eNB_id]->dl_ch_estimates,
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
@@ -347,12 +373,12 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pilots,
start_rb,
nb_rb_pdsch,
- nr_tti_rx,
+ nr_slot_rx,
ue->high_speed_flag,
frame_parms,
dlsch0_harq->mimo_mode);
else
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
+ nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
pdsch_vars[eNB_id]->dl_ch_estimates,
pdsch_vars[eNB_id_i]->rxdataF_ext,
pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
@@ -362,14 +388,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pilots,
start_rb,
nb_rb_pdsch,
- nr_tti_rx,
+ nr_slot_rx,
ue->high_speed_flag,
frame_parms,
dlsch0_harq->mimo_mode);
}
} else if (beamforming_mode==0) { //else if nb_antennas_ports_gNB==1 && beamforming_mode == 0
- //printf("start nr dlsch extract nr_tti_rx %d thread id %d \n", nr_tti_rx, ue->current_thread_id[nr_tti_rx]);
- nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
+ //printf("start nr dlsch extract nr_slot_rx %d thread id %d \n", nr_slot_rx, proc->thread_id);
+ nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
pdsch_vars[eNB_id]->dl_ch_estimates,
pdsch_vars[eNB_id]->rxdataF_ext,
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
@@ -377,11 +403,13 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[eNB_id]->pmi_ext,
symbol,
pilots,
+ config_type,
start_rb,
nb_rb_pdsch,
- nr_tti_rx,
+ nr_slot_rx,
ue->high_speed_flag,
- frame_parms);
+ frame_parms,
+ dlsch0_harq->dlDmrsSymbPos);
} /*else if(beamforming_mode>7) {
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
@@ -393,21 +421,21 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
return(-1);
}
- len = (pilots==1)? (nb_rb*6):(nb_rb*12);
+ len = (pilots==1)? ((config_type==pdsch_dmrs_type1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
printf("[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
- frame,nr_tti_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ frame,nr_slot_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",
- frame,nr_tti_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ frame,nr_slot_rx,slot,symbol,ue->high_speed_flag,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
n_tx = frame_parms->nb_antenna_ports_gNB;
n_rx = frame_parms->nb_antennas_rx;
@@ -417,19 +445,20 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
dlsch,
symbol,
pilots,
+ len,
nb_rb);
#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
if (first_symbol_flag==1) {
if (beamforming_mode==0){
@@ -470,7 +499,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
}
//#ifdef UE_DEBUG_TRACE
LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
- frame%1024,nr_tti_rx, pdsch_vars[eNB_id]->log2_maxh,
+ frame%1024,nr_slot_rx, pdsch_vars[eNB_id]->log2_maxh,
pdsch_vars[eNB_id]->log2_maxh0,
pdsch_vars[eNB_id]->log2_maxh1,
avg[0],avgs);
@@ -493,23 +522,23 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#if T_TRACER
if (type == PDSCH)
{
- T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(nr_tti_rx),
+ T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(nr_slot_rx),
T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3]));
}
#endif
#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_tti_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
// Now channel compensation
if (dlsch0_harq->mimo_modegeneric_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_slot_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_tti_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,nr_slot_rx,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
// MRC
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
if (frame_parms->nb_antennas_rx > 1) {
@@ -657,395 +686,85 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
}
#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- //printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
- // compute LLRs
- // -> // compute @pointer where llrs should filled for this ofdm-symbol
+ /* Store the valid DL RE's */
+ pdsch_vars[eNB_id]->dl_valid_re[symbol-1] = len;
- if (first_symbol_flag==1) pdsch_vars[eNB_id]->llr_offset[symbol-1] = 0;
- llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol-1];
- //pllr_symbol_cw0_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0];
- //pllr_symbol_cw1_deint = (int8_t*)pdsch_vars[eNB_id]->llr[1];
- pllr_symbol_layer0 = pdsch_vars[eNB_id]->layer_llr[0];
- pllr_symbol_layer1 = pdsch_vars[eNB_id]->layer_llr[1];
- pllr_symbol_layer0 += llr_offset_symbol;
- pllr_symbol_layer1 += llr_offset_symbol;
- pllr_symbol_cw0 = pdsch_vars[eNB_id]->llr[0];
- pllr_symbol_cw1 = pdsch_vars[eNB_id]->llr[1];
- pllr_symbol_cw0 += llr_offset_symbol;
- pllr_symbol_cw1 += llr_offset_symbol;
-
- pdsch_vars[eNB_id]->llr_offset[symbol] = len*dlsch0_harq->Qm + llr_offset_symbol;
-
- LOG_D(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d energy %d\n",
- symbol,
- nb_rb,dlsch0_harq->Qm,
- pdsch_vars[eNB_id]->llr_length[symbol],
- pdsch_vars[eNB_id]->llr_offset[symbol],
- signal_energy(pdsch_vars[eNB_id]->rxdataF_comp0[0], 7*2*frame_parms->N_RB_DL*12));
-
-
- /*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
- symbol,
- nb_rb,dlsch0_harq->Qm,
- pdsch_vars[eNB_id]->llr_length[symbol],
- pdsch_vars[eNB_id]->llr_offset[symbol],
- pdsch_vars[eNB_id]->llr[0],
- pllr_symbol_cw0);*/
-
- switch (dlsch0_harq->Qm) {
- case 2 :
- if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
- nr_dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pllr_symbol_cw0,
- symbol,
- len,
- first_symbol_flag,
- nb_rb,
- beamforming_mode);
-
- } else if (codeword_TB0 == -1){
-
- nr_dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pllr_symbol_cw1,
- symbol,
- len,
- first_symbol_flag,
- nb_rb,
- beamforming_mode);
+ if(dlsch0_harq->status == ACTIVE) {
+ startSymbIdx = dlsch0_harq->start_symbol;
+ nbSymb = dlsch0_harq->nb_symbols;
+ pduBitmap = dlsch0_harq->pduBitmap;
}
- else if (rx_type >= rx_IC_single_stream) {
- if (dlsch1_harq->Qm == 2) {
- nr_dlsch_qpsk_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_qpsk_qpsk_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- else if (dlsch1_harq->Qm == 4) {
- nr_dlsch_qpsk_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_16qam_qpsk_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
+ if(dlsch1_harq) {
+ startSymbIdx = dlsch1_harq->start_symbol;
+ nbSymb = dlsch1_harq->nb_symbols;
+ pduBitmap = dlsch1_harq->pduBitmap;
+ }
+
+ /* Check for PTRS bitmap and process it respectively */
+ if((pduBitmap & 0x1) && (type == PDSCH)) {
+ nr_pdsch_ptrs_processing(ue,
+ pdsch_vars,
+ frame_parms,
+ dlsch0_harq, dlsch1_harq,
+ eNB_id, nr_slot_rx,
+ symbol, (nb_rb*12),
+ harq_pid,
+ dlsch[0]->rnti,rx_type);
+ pdsch_vars[eNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[eNB_id]->ptrs_re_per_slot[0][symbol];
+ }
+
+ /* at last symbol in a slot calculate LLR's for whole slot */
+ if(symbol == (startSymbIdx + nbSymb -1)) {
+ for(uint8_t i =startSymbIdx; i <= nbSymb;i++) {
+ /* re evaluating the first symbol flag as LLR's are done in symbol loop */
+ if(i == startSymbIdx && i < 3) {
+ first_symbol_flag =1;
}
else {
- nr_dlsch_qpsk_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_64qam_qpsk_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- }
- break;
- case 4 :
- if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) {
- nr_dlsch_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
- pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr128,
- beamforming_mode);
- } else if (codeword_TB0 == -1){
- nr_dlsch_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[1],
- pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr128_2ndstream,
- beamforming_mode);
- }
- else if (rx_type >= rx_IC_single_stream) {
- if (dlsch1_harq->Qm == 2) {
- nr_dlsch_16qam_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_qpsk_16qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,//i
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- else if (dlsch1_harq->Qm == 4) {
- nr_dlsch_16qam_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_16qam_16qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_mag0,//i
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- else {
- nr_dlsch_16qam_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_64qam_16qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
+ first_symbol_flag=0;
}
+ /* Calculate LLR's for each symbol */
+ nr_dlsch_llr(pdsch_vars, frame_parms,
+ rxdataF_comp_ptr, dl_ch_mag_ptr,
+ dlsch0_harq, dlsch1_harq,
+ rx_type, harq_pid,
+ eNB_id, eNB_id_i,
+ first_symbol_flag,
+ i, nb_rb, round,
+ codeword_TB0, codeword_TB1,
+ pdsch_vars[eNB_id]->dl_valid_re[i-1],
+ nr_slot_rx, beamforming_mode);
}
}
- break;
- case 6 :
- if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
- nr_dlsch_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- (int16_t*)pllr_symbol_cw0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr_offset[symbol],
- beamforming_mode);
- } else if (codeword_TB0 == -1){
- nr_dlsch_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pllr_symbol_cw1,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr_offset[symbol],
- beamforming_mode);
- }
- else if (rx_type >= rx_IC_single_stream) {
- if (dlsch1_harq->Qm == 2) {
- nr_dlsch_64qam_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_qpsk_64qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- else if (dlsch1_harq->Qm == 4) {
- nr_dlsch_64qam_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- pdsch_vars[eNB_id]->layer_llr[0],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_16qam_64qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_mag0,//i
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[eNB_id]->layer_llr[1],
- symbol,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr128_2ndstream);
- }
- }
- else {
- nr_dlsch_64qam_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- rxdataF_comp_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_mag0,
- dl_ch_mag_ptr,//i
- pdsch_vars[eNB_id]->dl_ch_rho2_ext,
- (int16_t*)pllr_symbol_layer0,
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr_offset[symbol]);
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_64qam_64qam_llr(frame_parms,
- rxdataF_comp_ptr,
- pdsch_vars[eNB_id]->rxdataF_comp0,//i
- dl_ch_mag_ptr,
- pdsch_vars[eNB_id]->dl_ch_mag0,//i
- pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
- pllr_symbol_layer1,
- symbol,len,first_symbol_flag,nb_rb,
- adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_tti_rx,symbol),
- pdsch_vars[eNB_id]->llr_offset[symbol]);
- }
- }
- }
- break;
- default:
- LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
- return(-1);
- break;
- }
-
- if (dlsch1_harq) {
- uint8_t Qm = nr_get_Qm_dl(dlsch1_harq->mcs,dlsch1_harq->mcs_table);
- if (Qm == 0){
- LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n");
- return -1;
- }
- switch (Qm) {
- case 2 :
- if (rx_type==rx_standard) {
- nr_dlsch_qpsk_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pllr_symbol_cw0,
- symbol,len,first_symbol_flag,nb_rb,
- beamforming_mode);
- }
- break;
- case 4:
- if (rx_type==rx_standard) {
- nr_dlsch_16qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pdsch_vars[eNB_id]->llr[0],
- pdsch_vars[eNB_id]->dl_ch_mag0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr128,
- beamforming_mode);
- }
- break;
- case 6 :
- if (rx_type==rx_standard) {
- nr_dlsch_64qam_llr(frame_parms,
- pdsch_vars[eNB_id]->rxdataF_comp0,
- pllr_symbol_cw0,
- pdsch_vars[eNB_id]->dl_ch_mag0,
- pdsch_vars[eNB_id]->dl_ch_magb0,
- symbol,len,first_symbol_flag,nb_rb,
- pdsch_vars[eNB_id]->llr_offset[symbol],
- beamforming_mode);
- }
- break;
- default:
- LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
- return(-1);
- break;
- }
- }
//nr_dlsch_deinterleaving(symbol,bundle_L,(int16_t*)pllr_symbol_cw0,(int16_t*)pllr_symbol_cw0_deint, nb_rb_pdsch);
-
- if (rx_type==rx_IC_dual_stream) {
- nr_dlsch_layer_demapping(pdsch_vars[eNB_id]->llr,
- dlsch[0]->harq_processes[harq_pid]->Nl,
- dlsch[0]->harq_processes[harq_pid]->Qm,
- dlsch[0]->harq_processes[harq_pid]->G,
- pdsch_vars[eNB_id]->layer_llr);
- }
+
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_layer_demapping(pdsch_vars[eNB_id]->llr,
+ dlsch[0]->harq_processes[harq_pid]->Nl,
+ dlsch[0]->harq_processes[harq_pid]->Qm,
+ dlsch[0]->harq_processes[harq_pid]->G,
+ pdsch_vars[eNB_id]->layer_llr);
+ }
#if UE_TIMING_TRACE
- stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_tti_rx,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_I(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
@@ -1054,30 +773,30 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
char filename[40];
uint8_t aa = 0;
- snprintf(filename, 40, "rxdataF0_symb_%d_nr_tti_rx_%d.m", symbol, nr_tti_rx);
- write_output(filename, "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF[0][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
+ snprintf(filename, 40, "rxdataF0_symb_%d_nr_slot_rx_%d.m", symbol, nr_slot_rx);
+ write_output(filename, "rxdataF0", &common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
- snprintf(filename, 40, "dl_ch_estimates0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
+ snprintf(filename, 40, "dl_ch_estimates0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
write_output(filename, "dl_ch_estimates", &pdsch_vars[eNB_id]->dl_ch_estimates[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1);
- snprintf(filename, 40, "rxdataF_ext0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
+ snprintf(filename, 40, "rxdataF_ext0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
write_output(filename, "rxdataF_ext", &pdsch_vars[eNB_id]->rxdataF_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
- snprintf(filename, 40, "dl_ch_estimates_ext0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
+ snprintf(filename, 40, "dl_ch_estimates_ext0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
write_output(filename, "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
- snprintf(filename, 40, "rxdataF_comp0%d_symb_%d_nr_tti_rx_%d.m", aa, symbol, nr_tti_rx);
+ snprintf(filename, 40, "rxdataF_comp0%d_symb_%d_nr_slot_rx_%d.m", aa, symbol, nr_slot_rx);
write_output(filename, "rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[aa][0], NR_SYMBOLS_PER_SLOT*frame_parms->N_RB_DL*NR_NB_SC_PER_RB, 1, 1);
for (int i=0; i < 2; i++){
- snprintf(filename, 40, "llr%d_symb_%d_nr_tti_rx_%d.m", i, symbol, nr_tti_rx);
+ snprintf(filename, 40, "llr%d_symb_%d_nr_slot_rx_%d.m", i, symbol, nr_slot_rx);
write_output(filename,"llr", &pdsch_vars[eNB_id]->llr[i][0], (NR_SYMBOLS_PER_SLOT*nb_rb*NR_NB_SC_PER_RB*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm), 1, 0);
}
#endif
#if T_TRACER
T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame%1024),
- T_INT(nr_tti_rx), T_INT(nb_rb),
+ T_INT(nr_slot_rx), T_INT(nb_rb),
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_slot),
T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0],
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_slot*2));
@@ -1806,6 +1525,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
NR_UE_DLSCH_t **dlsch_ue,
uint8_t symbol,
uint8_t pilots,
+ uint32_t len,
unsigned short nb_rb)
{
@@ -1815,17 +1535,14 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
unsigned char aatx,aarx;
__m128i *dl_ch128, ch_amp128;
-
- if (pilots==1){
- nb_rb = nb_rb>>1;
- }
+ uint32_t nb_rb_0 = len/12 + ((len%12)?1:0);
// Determine scaling amplitude based the symbol
ch_amp = 1024*8; //((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
- LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
- // printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
+ LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol);
+ // printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13
@@ -1834,7 +1551,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
- for (rb=0;rbnushift ==0 || frame_parms->nushift == 1,
- "nushift %d is illegal\n",frame_parms->nushift);
+ if (config_type==pdsch_dmrs_type1)
+ AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 1,
+ "nushift %d is illegal\n",frame_parms->nushift);
+ else
+ AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 2 || frame_parms->nushift == 4,
+ "nushift %d is illegal\n",frame_parms->nushift);
for (aarx=0; aarxnb_antennas_rx; aarx++) {
k = frame_parms->first_carrier_offset + NR_NB_SC_PER_RB*start_rb;
- if (high_speed_flag == 1)
- dl_ch0 = &dl_ch_estimates[aarx][(2*(frame_parms->ofdm_symbol_size))];
- else
- dl_ch0 = &dl_ch_estimates[aarx][0];
+ validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
+
+ dl_ch0 = &dl_ch_estimates[aarx][(validDmrsEst*(frame_parms->ofdm_symbol_size))];
dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_rb_pdsch*12)];
@@ -2397,34 +2119,44 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
if (k>frame_parms->ofdm_symbol_size) {
k = k-frame_parms->ofdm_symbol_size;
rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
- }
+ }
if (pilots==0) {
memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
dl_ch0_ext+=12;
rxF_ext+=12;
- } else {
- j=0;
-
- for (i = (1-frame_parms->nushift);
- i<12;
- i+=2) {
- rxF_ext[j]=rxF[i];
- dl_ch0_ext[j]=dl_ch0[i];
- j++;
- }
-
-
- dl_ch0_ext+=6;
- rxF_ext+=6;
+ } else {//the symbol contains DMRS
+ j=0;
+ if (config_type==pdsch_dmrs_type1){
+ for (i = (1-frame_parms->nushift); i<12; i+=2) {
+ rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+=6;
+ rxF_ext+=6;
+ } else {
+ for (i = (2+frame_parms->nushift); i<6; i++) {
+ rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ for (i = (8+frame_parms->nushift); i<12; i++) {
+ rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+= 8;
+ rxF_ext+= 8;
+ }
}
-
+
dl_ch0+=12;
rxF+=12;
k+=12;
if (k>=frame_parms->ofdm_symbol_size) {
- k=k-(frame_parms->ofdm_symbol_size);
- rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
+ k = k-(frame_parms->ofdm_symbol_size);
+ rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
}
}
}
@@ -2443,7 +2175,7 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
uint8_t pilots,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
- unsigned char nr_tti_rx,
+ unsigned char nr_slot_rx,
uint32_t high_speed_flag,
NR_DL_FRAME_PARMS *frame_parms,
MIMO_mode_t mimo_mode) {
@@ -2555,12 +2287,393 @@ static void nr_dlsch_layer_demapping(int16_t **llr_cw,
AssertFatal(0, "Not supported number of layers %d\n", Nl);
}
}
+
+static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
+ NR_DL_FRAME_PARMS *frame_parms,
+ int32_t **rxdataF_comp_ptr,
+ int32_t **dl_ch_mag_ptr,
+ NR_DL_UE_HARQ_t *dlsch0_harq,
+ NR_DL_UE_HARQ_t *dlsch1_harq,
+ RX_type_t rx_type,
+ unsigned char harq_pid,
+ unsigned char eNB_id,
+ unsigned char eNB_id_i,
+ unsigned char first_symbol_flag,
+ unsigned char symbol,
+ unsigned short nb_rb,
+ unsigned short round,
+ int32_t codeword_TB0,
+ int32_t codeword_TB1,
+ uint32_t len,
+ uint8_t nr_slot_rx,
+ uint8_t beamforming_mode)
+{
+
+ int16_t *pllr_symbol_cw0;
+ int16_t *pllr_symbol_cw1;
+ int16_t *pllr_symbol_layer0;
+ int16_t *pllr_symbol_layer1;
+ uint32_t llr_offset_symbol;
+
+ if (first_symbol_flag==1) pdsch_vars[eNB_id]->llr_offset[symbol-1] = 0;
+ llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol-1];
+ //pllr_symbol_cw0_deint = (int8_t*)pdsch_vars[eNB_id]->llr[0];
+ //pllr_symbol_cw1_deint = (int8_t*)pdsch_vars[eNB_id]->llr[1];
+ pllr_symbol_layer0 = pdsch_vars[eNB_id]->layer_llr[0];
+ pllr_symbol_layer1 = pdsch_vars[eNB_id]->layer_llr[1];
+ pllr_symbol_layer0 += llr_offset_symbol;
+ pllr_symbol_layer1 += llr_offset_symbol;
+ pllr_symbol_cw0 = pdsch_vars[eNB_id]->llr[0];
+ pllr_symbol_cw1 = pdsch_vars[eNB_id]->llr[1];
+ pllr_symbol_cw0 += llr_offset_symbol;
+ pllr_symbol_cw1 += llr_offset_symbol;
+
+ pdsch_vars[eNB_id]->llr_offset[symbol] = len*dlsch0_harq->Qm + llr_offset_symbol;
+
+ /*LOG_I(PHY,"compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n",
+ symbol,
+ nb_rb,dlsch0_harq->Qm,
+ pdsch_vars[eNB_id]->llr_length[symbol],
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ (int16_t*)pdsch_vars[eNB_id]->llr[0],
+ pllr_symbol_cw0);*/
+
+ /*printf("compute LLRs [symbol %d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
+ symbol,
+ nb_rb,dlsch0_harq->Qm,
+ pdsch_vars[eNB_id]->llr_length[symbol],
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ pdsch_vars[eNB_id]->llr[0],
+ pllr_symbol_cw0);*/
+
+ switch (dlsch0_harq->Qm) {
+ case 2 :
+ if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
+ nr_dlsch_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pllr_symbol_cw0,
+ symbol,
+ len,
+ first_symbol_flag,
+ nb_rb,
+ beamforming_mode);
+
+ } else if (codeword_TB0 == -1){
+
+ nr_dlsch_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pllr_symbol_cw1,
+ symbol,
+ len,
+ first_symbol_flag,
+ nb_rb,
+ beamforming_mode);
+ }
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ nr_dlsch_qpsk_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_qpsk_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ nr_dlsch_qpsk_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_16qam_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ nr_dlsch_qpsk_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_64qam_qpsk_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ }
+ break;
+ case 4 :
+ if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) {
+ nr_dlsch_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[0],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr128,
+ beamforming_mode);
+ } else if (codeword_TB0 == -1){
+ nr_dlsch_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[1],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr128_2ndstream,
+ beamforming_mode);
+ }
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ nr_dlsch_16qam_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_qpsk_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ nr_dlsch_16qam_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_16qam_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ nr_dlsch_16qam_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_64qam_16qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ }
+ break;
+ case 6 :
+ if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
+ nr_dlsch_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ (int16_t*)pllr_symbol_cw0,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ beamforming_mode);
+ } else if (codeword_TB0 == -1){
+ nr_dlsch_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pllr_symbol_cw1,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ beamforming_mode);
+ }
+ else if (rx_type >= rx_IC_single_stream) {
+ if (dlsch1_harq->Qm == 2) {
+ nr_dlsch_64qam_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_qpsk_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else if (dlsch1_harq->Qm == 4) {
+ nr_dlsch_64qam_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[eNB_id]->layer_llr[0],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_16qam_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[eNB_id]->layer_llr[1],
+ symbol,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr128_2ndstream);
+ }
+ }
+ else {
+ nr_dlsch_64qam_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ rxdataF_comp_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ dl_ch_mag_ptr,//i
+ pdsch_vars[eNB_id]->dl_ch_rho2_ext,
+ (int16_t*)pllr_symbol_layer0,
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr_offset[symbol]);
+ if (rx_type==rx_IC_dual_stream) {
+ nr_dlsch_64qam_64qam_llr(frame_parms,
+ rxdataF_comp_ptr,
+ pdsch_vars[eNB_id]->rxdataF_comp0,//i
+ dl_ch_mag_ptr,
+ pdsch_vars[eNB_id]->dl_ch_mag0,//i
+ pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pllr_symbol_layer1,
+ symbol,len,first_symbol_flag,nb_rb,
+ adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,nr_slot_rx,symbol),
+ pdsch_vars[eNB_id]->llr_offset[symbol]);
+ }
+ }
+ }
+ break;
+ default:
+ LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
+ return(-1);
+ break;
+ }
+
+ if (dlsch1_harq) {
+ switch (nr_get_Qm_dl(dlsch1_harq->mcs,dlsch1_harq->mcs_table)) {
+ case 2 :
+ if (rx_type==rx_standard) {
+ nr_dlsch_qpsk_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pllr_symbol_cw0,
+ symbol,len,first_symbol_flag,nb_rb,
+ beamforming_mode);
+ }
+ break;
+ case 4:
+ if (rx_type==rx_standard) {
+ nr_dlsch_16qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pdsch_vars[eNB_id]->llr[0],
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr128,
+ beamforming_mode);
+ }
+ break;
+ case 6 :
+ if (rx_type==rx_standard) {
+ nr_dlsch_64qam_llr(frame_parms,
+ pdsch_vars[eNB_id]->rxdataF_comp0,
+ pllr_symbol_cw0,
+ pdsch_vars[eNB_id]->dl_ch_mag0,
+ pdsch_vars[eNB_id]->dl_ch_magb0,
+ symbol,len,first_symbol_flag,nb_rb,
+ pdsch_vars[eNB_id]->llr_offset[symbol],
+ beamforming_mode);
+ }
+ break;
+ default:
+ LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
+ return(-1);
+ break;
+ }
+ }
+ return 0;
+}
//==============================================================================================
#ifdef USER_MODE
-void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
+void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid)
{
unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
char fname[32],vname[32];
@@ -2568,50 +2681,50 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext0.m",eNB_id,round);
snprintf(vname, 32, "dl%d_rxF_r%d_ext0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antennas_rx >1) {
snprintf(fname, 32, "dlsch%d_rxF_r%d_ext1.m",eNB_id,round);
snprintf(vname, 32, "dl%d_rxF_r%d_ext1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
}
snprintf(fname, 32, "dlsch%d_ch_r%d_ext00.m",eNB_id,round);
snprintf(vname, 32, "dl%d_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
if (ue->transmission_mode[eNB_id]==7){
snprintf(fname, 32, "dlsch%d_bf_ch_r%d.m",eNB_id,round);
snprintf(vname, 32, "dl%d_bf_ch_r%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1);
//write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1);
snprintf(fname, 32, "dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round);
snprintf(vname, 32, "dl%d_bf_ch_r%d_ext00",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
}
if (ue->frame_parms.nb_antennas_rx == 2) {
snprintf(fname, 32, "dlsch%d_ch_r%d_ext01.m",eNB_id,round);
snprintf(vname, 32, "dl%d_ch_r%d_ext01",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
}
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
snprintf(fname, 32, "dlsch%d_ch_r%d_ext10.m",eNB_id,round);
snprintf(vname, 32, "dl%d_ch_r%d_ext10",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antennas_rx == 2) {
snprintf(fname, 32, "dlsch%d_ch_r%d_ext11.m",eNB_id,round);
snprintf(vname, 32, "dl%d_ch_r%d_ext11",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
}
}
snprintf(fname, 32, "dlsch%d_rxF_r%d_uespec0.m",eNB_id,round);
snprintf(vname, 32, "dl%d_rxF_r%d_uespec0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1);
/*
write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
@@ -2621,31 +2734,31 @@ void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t nr_tti_rx,unsigned int *
snprintf(fname, 32, "dlsch%d_r%d_rho.m",eNB_id,round);
snprintf(vname, 32, "dl_rho_r%d_%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
snprintf(fname, 32, "dlsch%d_r%d_rho2.m",eNB_id,round);
snprintf(vname, 32, "dl_rho2_r%d_%d",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1);
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
snprintf(vname, 32, "dl%d_rxF_r%d_comp0",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
if (ue->frame_parms.nb_antenna_ports_gNB == 2) {
snprintf(fname, 32, "dlsch%d_rxF_r%d_comp1.m",eNB_id,round);
snprintf(vname, 32, "dl%d_rxF_r%d_comp1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1);
}
snprintf(fname, 32, "dlsch%d_rxF_r%d_llr.m",eNB_id,round);
snprintf(vname, 32, "dl%d_r%d_llr",eNB_id,round);
- write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
+ write_output(fname,vname, ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0);
snprintf(fname, 32, "dlsch%d_r%d_mag1.m",eNB_id,round);
snprintf(vname, 32, "dl%d_r%d_mag1",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
snprintf(fname, 32, "dlsch%d_r%d_mag2.m",eNB_id,round);
snprintf(vname, 32, "dl%d_r%d_mag2",eNB_id,round);
- write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
+ write_output(fname,vname,ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
// printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh);
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index da538cccf6..b5ab563c26 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -131,7 +131,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
#endif
// computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf
for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats);
#endif
@@ -155,7 +155,7 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
#endif
// computing channel estimation for selected best ssb
for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf);
+ nr_pbch_channel_estimation(ue,proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf);
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_channel_estimation_stats);
#endif
@@ -286,16 +286,17 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, runmode_t mode,
for(int i=0; i<4;i++)
nr_slot_fep_init_sync(ue,
- i,
- 0,
- is*fp->samples_per_frame+ue->ssb_offset,
- 0);
+ proc,
+ i,
+ 0,
+ is*fp->samples_per_frame+ue->ssb_offset,
+ 0);
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n");
#endif
- rx_sss_nr(ue,&metric_tdd_ncp,&phase_tdd_ncp);
+ rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp);
nr_gold_pbch(ue);
ret = nr_pbch_detection(proc, ue,1,mode); // start pbch detection at first symbol after pss
@@ -321,8 +322,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, runmode_t mode,
int nb_prefix_samples0 = fp->nb_prefix_samples0;
fp->nb_prefix_samples0 = fp->nb_prefix_samples;
- nr_slot_fep(ue,0, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
- nr_slot_fep(ue,1, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
+ nr_slot_fep(ue, proc, 0, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
+ nr_slot_fep(ue, proc, 1, 0, ue->ssb_offset, 0, NR_PDCCH_EST);
fp->nb_prefix_samples0 = nb_prefix_samples0;
LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 54be6771da..4d21fe782b 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -418,12 +418,11 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
NR_UE_PBCH *nr_ue_pbch_vars,
NR_DL_FRAME_PARMS *frame_parms,
- uint8_t eNB_id,
+ uint8_t gNB_id,
uint8_t i_ssb,
MIMO_mode_t mimo_mode,
uint32_t high_speed_flag) {
- int Ns = proc->nr_tti_rx;
NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars;
int max_h=0;
int symbol;
@@ -457,15 +456,15 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
#ifdef DEBUG_PBCH
- //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF);
+ //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF);
write_output("rxdataF0_pbch.m","rxF0pbch",
- &nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1);
+ &nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1);
#endif
// symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot
for (symbol=1; symbol<4; symbol++) {
- nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF,
+ nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
nr_ue_pbch_vars->dl_ch_estimates,
nr_ue_pbch_vars->rxdataF_ext,
nr_ue_pbch_vars->dl_ch_estimates_ext,
@@ -610,11 +609,14 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
nr_downlink_indication_t dl_indication;
fapi_nr_rx_indication_t rx_ind;
- dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
- dl_indication.dci_ind = NULL;
- dl_indication.proc=proc;
- dl_indication.module_id=0;
- dl_indication.cc_id=proc->CC_id;
+ dl_indication.module_id = ue->Mod_id;
+ dl_indication.gNB_index = gNB_id;
+ dl_indication.cc_id = proc->CC_id;
+ dl_indication.frame = proc->frame_rx;
+ dl_indication.slot = proc->nr_slot_rx;
+ dl_indication.thread_id = proc->thread_id;
+ dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
+ dl_indication.dci_ind = NULL;
rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_MIB;
rx_ind.rx_indication_body[0].mib_pdu.pdu = &decoded_output[0]; //not good as it is pointing to a memory that can change
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index 0ae271c2db..3ab88dac0a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -421,16 +421,16 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
LOG_D(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen);
#endif
- //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
- uint8_t use_extended_prach_prefix = 0;
- if(fp->numerology_index == 0) {
- if (prachStartSymbol == 0 || prachStartSymbol == 7)
- use_extended_prach_prefix = 1;
- }
- else {
- if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- use_extended_prach_prefix = 1;
- }
+ //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
+ uint8_t use_extended_prach_prefix = 0;
+ if(fp->numerology_index == 0) {
+ if (prachStartSymbol == 0 || prachStartSymbol == 7)
+ use_extended_prach_prefix = 1;
+ }
+ else {
+ if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
+ use_extended_prach_prefix = 1;
+ }
if (fp->N_RB_UL <= 34) { //32 PRB case 61.44Msps
if (fp->threequarter_fs == 0) {
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 746c7edfa9..c74d887101 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -678,7 +678,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
uint8_t *pmi_ext,
uint32_t *rb_alloc,
uint8_t symbol,
- uint8_t subframe,
+ uint8_t nr_slot_rx,
NR_DL_FRAME_PARMS *frame_parms)
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
for the current allocation and for single antenna eNB transmission.
@@ -690,23 +690,10 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param pmi_ext Extracted PMI for chosen RBs
@param rb_alloc RB allocation vector
@param symbol Symbol to extract
- @param subframe Subframe number
- @param vrb_type Flag to indicate distributed VRB type
+ @param nr_slot_rx Slot number
@param high_speed_flag
@param frame_parms Pointer to frame descriptor
*/
-/*uint16_t nr_dlsch_extract_rbs_single(int32_t **rxdataF,
- int32_t **dl_ch_estimates,
- int32_t **rxdataF_ext,
- int32_t **dl_ch_estimates_ext,
- uint16_t pmi,
- uint8_t *pmi_ext,
- uint32_t *rb_alloc,
- uint8_t symbol,
- uint8_t subframe,
- uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms);*/
-
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
int **dl_ch_estimates,
int **rxdataF_ext,
@@ -714,12 +701,14 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
unsigned short pmi,
unsigned char *pmi_ext,
unsigned char symbol,
- uint8_t pilots,
- unsigned short start_rb,
- unsigned short nb_pdsch_rb,
- unsigned char nr_tti_rx,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_pdsch_rb,
+ unsigned char nr_slot_rx,
uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms);
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos);
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
int32_t **dl_ch_estimates,
@@ -740,7 +729,7 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
@param pmi_ext Extracted PMI for chosen RBs
@param rb_alloc RB allocation vector
@param symbol Symbol to extract
- @param subframe Subframe index
+ @param nr_slot_rx Slot index
@param high_speed_flag
@param frame_parms Pointer to frame descriptor
*/
@@ -754,7 +743,7 @@ unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
uint8_t pilots,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
- unsigned char nr_tti_rx,
+ unsigned char nr_slot_rx,
uint32_t high_speed_flag,
NR_DL_FRAME_PARMS *frame_parms,
MIMO_mode_t mimo_mode);
@@ -1002,7 +991,8 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t **dlsch_ue,
uint8_t symbol,
- uint8_t start_symbol,
+ uint8_t start_symbol,
+ uint32_t len,
uint16_t nb_rb);
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
@@ -1017,7 +1007,7 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
@param lte_frame_parms Pointer to frame descriptor
@param dlsch Pointer to DLSCH descriptor
@param frame Frame number
- @param subframe Subframe number
+ @param nr_slot_rx Slot number
@param num_pdcch_symbols Number of PDCCH symbols
@param is_crnti indicates if PDSCH belongs to a CRNTI (necessary for parallelizing decoding threads)
@param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
@@ -1025,13 +1015,15 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
*/
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
+ UE_nr_rxtx_proc_t *proc,
+ int eNB_id,
short *dlsch_llr,
NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t *dlsch,
NR_DL_UE_HARQ_t *harq_process,
uint32_t frame,
- uint16_t nb_symb_sch,
- uint8_t nr_tti_rx,
+ uint16_t nb_symb_sch,
+ uint8_t nr_slot_rx,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag);
@@ -1081,7 +1073,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
- UE_nr_rxtx_proc_t *proc,
+ UE_nr_rxtx_proc_t *proc,
int eNB_id,
short *dlsch_llr,
NR_DL_FRAME_PARMS *frame_parms,
@@ -1089,7 +1081,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
NR_DL_UE_HARQ_t *harq_process,
uint32_t frame,
uint16_t nb_symb_sch,
- uint8_t nr_tti_rx,
+ uint8_t nr_slot_rx,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag);
@@ -1111,8 +1103,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t eNB_id);
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
- uint32_t frame,
- uint32_t slot);
+ UE_nr_rxtx_proc_t *proc);
/*! \brief Extract PSS and SSS resource elements
@@ -1478,25 +1469,6 @@ void nr_rf_card_config(openair0_config_t *openair0_cfg,
int freq_offset);
-/*!
- \brief Encoding of PUSCH/ACK/RI/ACK from 36-212.
- @param a Pointer to ulsch SDU
- @param frame_parms Pointer to Frame parameters
- @param ulsch Pointer to ulsch descriptor
- @param harq_pid HARQ process ID
- @param tmode Transmission mode (1-7)
- @param control_only_flag Generate PUSCH with control information only
- @param Nbundled Parameter for ACK/NAK bundling (36.213 Section 7.3)
-*/
-uint32_t ulsch_encoding(uint8_t *a,
- PHY_VARS_NR_UE *phy_vars_ue,
- uint8_t harq_pid,
- uint8_t eNB_id,
- uint8_t subframe_rx,
- uint8_t tmode,
- uint8_t control_only_flag,
- uint8_t Nbundled);
-
void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
void fill_CQI(NR_UE_ULSCH_t *ulsch,PHY_NR_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff);
@@ -1720,9 +1692,8 @@ uint8_t get_prach_prb_offset(NR_DL_FRAME_PARMS *frame_parms,
uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
- int frame,
- int slot,
- fapi_nr_dci_indication_t *dci_ind);
+ UE_nr_rxtx_proc_t *proc,
+ fapi_nr_dci_indication_t *dci_ind);
/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs
@@ -1737,36 +1708,25 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
@param eNB_id eNb index (Nid1) 0,1,2
@param eNB_id_i Interfering eNB index (Nid1) 0,1,2, or 3 in case of MU-MIMO IC receiver
@param frame Frame number
- @param nr_tti_rx Subframe number
+ @param nr_slot_rx Slot number
@param symbol Symbol on which to act (within sub-frame)
@param first_symbol_flag set to 1 on first DLSCH symbol
@param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice.
@param i_mod Modulation order of the interfering stream
*/
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
PDSCH_t type,
unsigned char eNB_id,
unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference
uint32_t frame,
- uint8_t nr_tti_rx,
+ uint8_t nr_slot_rx,
unsigned char symbol,
unsigned char first_symbol_flag,
RX_type_t rx_type,
unsigned char i_mod,
unsigned char harq_pid);
-uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
- short *dlsch_llr,
- NR_DL_FRAME_PARMS *frame_parms,
- NR_UE_DLSCH_t *dlsch,
- NR_DL_UE_HARQ_t *harq_process,
- uint32_t frame,
- uint16_t nb_symb_sch,
- uint8_t nr_tti_rx,
- uint8_t harq_pid,
- uint8_t is_crnti,
- uint8_t llr8_flag);
-
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
void *dlsch_thread(void *arg);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index a3e202d4fe..7d0febbb5a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -141,6 +141,8 @@ typedef struct {
uint8_t decode_phich;
// Encoder BG
uint8_t BG;
+ // LDPC lifting size
+ uint32_t Z;
} NR_UL_UE_HARQ_t;
typedef struct {
@@ -316,6 +318,19 @@ typedef struct {
uint8_t codeword;
/// HARQ-ACKs
NR_UE_HARQ_STATUS_t harq_ack;
+ /// PTRS Frequency Density
+ uint8_t PTRSFreqDensity;
+ /// PTRS Time Density
+ uint8_t PTRSTimeDensity;
+ uint8_t PTRSPortIndex ;
+ uint8_t nEpreRatioOfPDSCHToPTRS;
+ uint8_t PTRSReOffset;
+ /// bit mask of PT-RS ofdm symbol indicies
+ uint16_t ptrs_symbols;
+ // PTRS symbol index, to be updated every PTRS symbol within a slot.
+ uint8_t ptrs_symbol_index;
+ /// PDU BITMAP
+ uint16_t pduBitmap;
} NR_DL_UE_HARQ_t;
typedef struct {
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index fdd40feeba..d9bea8a3ac 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -227,8 +227,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
NR_UL_UE_HARQ_t *harq_process;
uint16_t nb_rb ;
uint32_t A, F;
- static uint32_t Z = 0;
- uint32_t *pz = &Z;
+ uint32_t *pz;
uint8_t mod_order;
uint16_t Kr,r;
uint32_t r_offset;
@@ -249,7 +248,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
harq_process = ulsch->harq_processes[harq_pid];
nb_rb = harq_process->pusch_pdu.rb_size;
A = harq_process->pusch_pdu.pusch_data.tb_size*8;
- pz = &Z;
+ pz = &harq_process->Z;
mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
Kr=0;
@@ -387,12 +386,13 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
printf("%d \n", harq_process->d[0][cnt]);
}
printf("\n");*/
- encoder_implemparams_t impp;
- impp.n_segments = harq_process->C;
- impp.tinput = NULL;
- impp.tprep = NULL;
- impp.tparity = NULL;
- impp.toutput = NULL;
+ encoder_implemparams_t impp = {
+ .n_segments=harq_process->C,
+ .macro_num=0,
+ .tinput = NULL,
+ .tprep = NULL,
+ .tparity = NULL,
+ .toutput = NULL};
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index ea79fd467f..61e39aa79d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -360,7 +360,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
ptrs_idx++;
- } else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, cdm_grps_no_data, dmrs_type)) {
+ } else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) {
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) ulsch_ue->y)[m<<1];
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) ulsch_ue->y)[(m<<1) + 1];
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index dd43fcee5e..3560b23550 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -57,14 +57,14 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
long pucch_GroupHopping,
long hoppingId,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t m0,
uint8_t mcs,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint16_t startingPRB) {
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch0] start function at slot(nr_tti_tx)=%d\n",nr_tti_tx);
+ printf("\t [nr_generate_pucch0] start function at slot(nr_slot_tx)=%d\n",nr_slot_tx);
#endif
/*
* Implement TS 38.211 Subclause 6.3.2.3.1 Sequence generation
@@ -112,8 +112,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
for (int l=0; l= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_tti_tx=%d\n",
- n_hop,nr_tti_tx);
+ printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_slot_tx=%d\n",
+ n_hop,nr_slot_tx);
#endif
- nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
- alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,lprime,nr_tti_tx);
+ nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
+ alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,lprime,nr_slot_tx);
for (int n=0; n<12; n++) {
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
@@ -505,7 +505,7 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t m0,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
@@ -514,8 +514,8 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
uint8_t timeDomainOCC,
uint8_t nr_bit) {
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch1] start function at slot(nr_tti_tx)=%d payload=%d m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
- nr_tti_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
+ printf("\t [nr_generate_pucch1] start function at slot(nr_slot_tx)=%d payload=%d m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
+ nr_slot_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
#endif
/*
* Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
@@ -603,11 +603,11 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
// y_n contains the complex value d multiplied by the sequence r_u_v
int16_t y_n_re[12],y_n_im[12];
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_tti_tx=%d\n",
- n_hop,nr_tti_tx);
+ printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_slot_tx=%d\n",
+ n_hop,nr_slot_tx);
#endif
- nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
- alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,lnormal,lprime,nr_tti_tx);
+ nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
+ alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,lnormal,lprime,nr_slot_tx);
for (int n=0; n<12; n++) {
r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
@@ -806,7 +806,7 @@ inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,
int i;
uint8_t c;
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
- //x2 = (rnti) + ((uint32_t)(1+nr_tti_tx)<<16)*(1+(fp->Nid_cell<<1));
+ //x2 = (rnti) + ((uint32_t)(1+nr_slot_tx)<<16)*(1+(fp->Nid_cell<<1));
x2 = ((rnti)<<15)+n_id;
#ifdef DEBUG_NR_PUCCH_TX
printf("\t\t [nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d\n",s,M_bit);
@@ -960,14 +960,14 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint8_t nrofPRB,
uint16_t startingPRB,
uint8_t nr_bit) {
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch2] start function at slot(nr_tti_tx)=%d with payload=%lu and nr_bit=%d\n",nr_tti_tx, payload, nr_bit);
+ printf("\t [nr_generate_pucch2] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n",nr_slot_tx, payload, nr_bit);
#endif
// b is the block of bits transmitted on the physical channel after payload coding
uint64_t b[16]; // limit to 1024-bit encoded length
@@ -1043,7 +1043,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
int m=0;
for (int l=0; l>2); ii++) {
@@ -1130,7 +1130,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint8_t nrofPRB,
@@ -1140,7 +1140,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
uint8_t occ_length_format4,
uint8_t occ_index_format4) {
#ifdef DEBUG_NR_PUCCH_TX
- printf("\t [nr_generate_pucch3_4] start function at slot(nr_tti_tx)=%d with payload=%lu and nr_bit=%d\n", nr_tti_tx, payload, nr_bit);
+ printf("\t [nr_generate_pucch3_4] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n", nr_slot_tx, payload, nr_bit);
#endif
// b is the block of bits transmitted on the physical channel after payload coding
uint64_t b[16];
@@ -1455,7 +1455,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
for (int l=0; l= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
- nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
+ nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
// Next we proceed to calculate base sequence for DM-RS signal, according to TS 38.211 subclause 6.4.1.33
if (nrofPRB >= 3) { // TS 38.211 subclause 5.2.2.1 (Base sequences of length 36 or larger) applies
@@ -1501,7 +1501,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
}
uint16_t j=0;
- alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_tti_tx);
+ alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
for (int rb=0; rbframe_tx;
- int slot_number = proc->nr_tti_tx;
+ int slot_number = proc->nr_slot_tx;
uint16_t n_SRS, n_SRS_cs_i;
double alpha_i;
uint8_t K_TC_p;
@@ -445,7 +445,7 @@ int ue_srs_procedure_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB
/* SRS resource configurated ? */
if (p_srs_resource != NULL) {
if (p_srs_resource_set->resourceType == periodic) {
- if (is_srs_period_nr(p_srs_resource, frame_parms, proc->frame_tx, proc->nr_tti_tx) == 0) {
+ if (is_srs_period_nr(p_srs_resource, frame_parms, proc->frame_tx, proc->nr_slot_tx) == 0) {
generate_srs = 1;
}
}
@@ -459,7 +459,7 @@ int ue_srs_procedure_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB
if (generate_srs == 1) {
int16_t txptr = AMP;
uint16_t nsymb = (ue->frame_parms.Ncp==0) ? 14:12;
- uint16_t symbol_offset = (int)ue->frame_parms.ofdm_symbol_size*((proc->nr_tti_tx*nsymb)+(nsymb-1));
+ uint16_t symbol_offset = (int)ue->frame_parms.ofdm_symbol_size*((proc->nr_slot_tx*nsymb)+(nsymb-1));
if (generate_srs_nr(p_srs_resource_set, frame_parms, &ue->common_vars.txdataF[eNB_id][symbol_offset], txptr, proc) == 0) {
return 0;
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
index e3f1f13a8d..66296910fc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
@@ -314,6 +314,7 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
*********************************************************************/
int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
uint8_t doPss, uint8_t doSss,
@@ -331,7 +332,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
pss_symbol = 0;
sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
- rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF;
+ rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size;
@@ -386,7 +387,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
/*******************************************************************
*
-* NAME : rx_sss_nr
+* NAME : pss_sss_extract_nr
*
* PARAMETERS : none
*
@@ -397,11 +398,12 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
*********************************************************************/
int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
+ UE_nr_rxtx_proc_t *proc,
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
uint8_t subframe)
{
- return do_pss_sss_extract_nr(phy_vars_ue, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe);
+ return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe);
}
/*******************************************************************
@@ -417,7 +419,7 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
*
*********************************************************************/
-int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
+int rx_sss_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int32_t *tot_metric, uint8_t *phase_max)
{
uint8_t i;
int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR];
@@ -433,6 +435,7 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
// pss sss extraction
pss_sss_extract_nr(ue,
+ proc,
pss_ext,
sss_ext,
0); /* subframe */
@@ -440,8 +443,8 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
#ifdef DEBUG_PLOT_SSS
write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_subframe,1,1);
- write_output("rxdataF0_pss.m","rxF0_pss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][0],frame_parms->ofdm_symbol_size,1,1);
- write_output("rxdataF0_sss.m","rxF0_sss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][(SSS_SYMBOL_NB-PSS_SYMBOL_NB)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+ write_output("rxdataF0_pss.m","rxF0_pss",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],frame_parms->ofdm_symbol_size,1,1);
+ write_output("rxdataF0_sss.m","rxF0_sss",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(SSS_SYMBOL_NB-PSS_SYMBOL_NB)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
write_output("pss_ext.m","pss_ext",pss_ext,LENGTH_PSS_NR,1,1);
#endif
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index b6ffd06c2b..cf5f74856e 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -112,6 +112,8 @@ typedef struct {
uint32_t F;
/// Encoder BG
uint8_t BG;
+ /// LDPC lifting size
+ uint32_t Z;
} NR_DL_gNB_HARQ_t;
typedef struct {
@@ -467,7 +469,7 @@ typedef struct {
/// bit mask of PT-RS ofdm symbol indicies
uint16_t ptrs_symbols;
// PTRS subcarriers per OFDM symbol
- uint16_t ptrs_sc_per_ofdm_symbol;
+ int32_t ptrs_re_per_slot;
/// \brief Estimated phase error based upon PTRS on each symbol .
/// - first index: ? [0..7] Number of Antenna
/// - second index: ? [0...14] smybol per slot
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 2a808486f0..4a685bfeb9 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -338,6 +338,10 @@ typedef struct {
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
/// - second index: ? [0..168*N_RB_DL[
int32_t **dl_ch_estimates_ext;
+ /// \brief Downlink channel estimates extracted in PRBS.
+ /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
+ /// - second index: ? [0..168*N_RB_DL[
+ int32_t **dl_ch_ptrs_estimates_ext;
/// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round
/// - first index: ? [0..7] (hard coded) accessed via \c harq_pid
/// - second index: ? [0..7] (hard coded) accessed via \c round
@@ -414,6 +418,16 @@ typedef struct {
uint32_t llr_offset[14];
// llr length per ofdm symbol
uint32_t llr_length[14];
+ // llr offset per ofdm symbol
+ uint32_t dl_valid_re[14];
+ /// \brief Estimated phase error based upon PTRS on each symbol .
+ /// - first index: ? [0..7] Number of Antenna
+ /// - second index: ? [0...14] smybol per slot
+ int32_t **ptrs_phase_per_slot;
+ /// \brief Estimated phase error based upon PTRS on each symbol .
+ /// - first index: ? [0..7] Number of Antenna
+ /// - second index: ? [0...14] smybol per slot
+ int32_t **ptrs_re_per_slot;
} NR_UE_PDSCH;
#define NR_PDCCH_DEFS_NR_UE
@@ -848,9 +862,6 @@ typedef struct {
/// UE FAPI indication for DCI reception
//fapi_nr_dci_indication_t dci_ind;
- // point to the current rxTx thread index
- uint8_t current_thread_id[NR_MAX_SLOTS_PER_FRAME];
-
t_nrPolar_params *polarList;
NR_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads
NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX];
@@ -892,7 +903,7 @@ typedef struct {
uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
/// PDSCH DMRS
- uint32_t nr_gold_pdsch[2][20][2][NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD];
+ uint32_t nr_gold_pdsch[2][20][14][NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD];
/// PDCCH DMRS
uint32_t nr_gold_pdcch[7][20][3][52];
diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h
index 3e09f3f593..9d6f1703e5 100644
--- a/openair1/PHY/impl_defs_nr.h
+++ b/openair1/PHY/impl_defs_nr.h
@@ -496,8 +496,8 @@ typedef struct{ // CSI-MeasConfig IE is used to configure CSI-RS (reference sign
uint8_t reportTriggerSize;
} csi_MeasConfig_t;
typedef enum {
- pdsch_dmrs_type1 = 1,
- pdsch_dmrs_type2 = 2
+ pdsch_dmrs_type1 = 0,
+ pdsch_dmrs_type2 = 1
} pdsch_dmrs_type_t;
typedef enum {
pusch_dmrs_type1 = 0,
diff --git a/openair1/PHY/thread_NR_UE.h b/openair1/PHY/thread_NR_UE.h
index 487f6f3d1f..901d8faec9 100644
--- a/openair1/PHY/thread_NR_UE.h
+++ b/openair1/PHY/thread_NR_UE.h
@@ -4,26 +4,18 @@
#include
/// Context data structure for RX/TX portion of subframe processing
typedef struct {
- /// index of the current UE RX/TX proc
- int proc_id;
+ /// index of the current UE RX/TX thread
+ int thread_id;
/// Component Carrier index
uint8_t CC_id;
/// timestamp transmitted to HW
openair0_timestamp timestamp_tx;
//#ifdef UE_NR_PHY_DEMO
- /// NR TTI index within subframe_tx [0 .. slots_per_subframe - 1] to act upon for transmission
- int nr_tti_tx;
- /// NR TTI index within subframe_rx [0 .. slots_per_subframe - 1] to act upon for reception
- int nr_tti_rx;
/// NR slot index within frame_tx [0 .. slots_per_frame - 1] to act upon for transmission
int nr_slot_tx;
/// NR slot index within frame_rx [0 .. slots_per_frame - 1] to act upon for transmission
int nr_slot_rx;
//#endif
- /// subframe to act upon for transmission
- int subframe_tx;
- /// subframe to act upon for reception
- int subframe_rx;
/// frame to act upon for transmission
int frame_tx;
/// frame to act upon for reception
diff --git a/openair1/SCHED_NR/phy_frame_config_nr.c b/openair1/SCHED_NR/phy_frame_config_nr.c
index f91ec73e5d..3864b2fcb2 100644
--- a/openair1/SCHED_NR/phy_frame_config_nr.c
+++ b/openair1/SCHED_NR/phy_frame_config_nr.c
@@ -308,7 +308,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms) {
*
*********************************************************************/
-int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti) {
+int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot) {
/* for FFD all slot can be considered as an uplink */
int mu = cfg->ssb_config.scs_common.value,check_slot=0;
@@ -318,7 +318,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
if (nr_frame%2 == 0) {
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
+ if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
check_slot++;
}
}
@@ -330,7 +330,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
check_slot = 0;
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
+ if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
check_slot++;
}
}
@@ -342,7 +342,7 @@ int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti)
}
} else {
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<nbSegments == ulsch_harq->processedSegments) {
if (decodeSuccess) {
- LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d TBS %d\n",
+ LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
gNB->Mod_id,ulsch_harq->slot,ulsch_harq->TBS);
ulsch_harq->status = SCH_IDLE;
ulsch_harq->round = 0;
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index 94189f96c4..b74494a404 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -103,14 +103,11 @@ void phy_procedures_UE_lte(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type);
/*! \brief Scheduling for UE TX procedures in normal subframes.
- @param phy_vars_ue Pointer to UE variables on which to act
+ @param ue Pointer to UE variables on which to act
@param proc Pointer to RXn-TXnp4 proc information
@param eNB_id Local id of eNB on which to act
- @param abstraction_flag Indicator of PHY abstraction
- @param mode calib/normal mode
- @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
*/
-void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id, uint8_t thread_id);
+void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_id);
/*! \brief Scheduling for UE RX procedures in normal subframes.
@param ue Pointer to UE variables on which to act
@@ -306,7 +303,7 @@ int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
@param mu numerology index (0,1,2..)
*/
void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB);
-void nr_process_timing_advance_rar(PHY_VARS_NR_UE *phy_vars_ue,UE_nr_rxtx_proc_t *proc,uint16_t timing_advance);
+void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, int frame_rx, int nr_slot_rx, uint16_t ta_command);
unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 25bff31fcc..c600343ed0 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -52,7 +52,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
int slot = scheduled_response->slot;
// Note: we have to handle the thread IDs for this. To be revisited completely.
- thread_id = PHY_vars_UE_g[module_id][cc_id]->current_thread_id[slot];
+ thread_id = scheduled_response->thread_id;
NR_UE_DLSCH_t *dlsch0 = NULL;
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
@@ -108,9 +108,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0_harq->harq_ack.pucch_resource_indicator = dlsch_config_pdu->pucch_resource_id;
dlsch0_harq->harq_ack.slot_for_feedback_ack = (slot+dlsch_config_pdu->pdsch_to_harq_feedback_time_ind)%frame_parms.slots_per_frame;
dlsch0_harq->Nl=1;
- dlsch0_harq->mcs_table=0;
+ dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
dlsch0_harq->harq_ack.rx_status = downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
dlsch0_harq->harq_ack.vDAI_DL = dlsch_config_pdu->dai;
+ /* PTRS */
+ dlsch0_harq->PTRSFreqDensity = dlsch_config_pdu->PTRSFreqDensity;
+ dlsch0_harq->PTRSTimeDensity = dlsch_config_pdu->PTRSTimeDensity;
+ dlsch0_harq->PTRSPortIndex = dlsch_config_pdu->PTRSPortIndex;
+ dlsch0_harq->nEpreRatioOfPDSCHToPTRS = dlsch_config_pdu->nEpreRatioOfPDSCHToPTRS;
+ dlsch0_harq->PTRSReOffset = dlsch_config_pdu->PTRSReOffset;
+ dlsch0_harq->pduBitmap = dlsch_config_pdu->pduBitmap;
LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
}
diff --git a/openair1/SCHED_NR_UE/harq_nr.h b/openair1/SCHED_NR_UE/harq_nr.h
index ee6e8625b0..c6d47a91ef 100644
--- a/openair1/SCHED_NR_UE/harq_nr.h
+++ b/openair1/SCHED_NR_UE/harq_nr.h
@@ -73,12 +73,12 @@
@param nr_dci_info_extracted extracted information from dci
@param dlsch downlink context
@param ulsch uplink context
- @param nr_tti_rx rx slot
+ @param nr_slot_rx rx slot
@param tx_offset slot offset for tx
@returns none */
void get_dci_info_for_harq(PHY_VARS_NR_UE *ue, NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted,
- NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t nr_tti_rx, uint8_t tx_offset);
+ NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t nr_slot_rx, uint8_t tx_offset);
/** \brief This function configures uplink HARQ context
@param PHY_VARS_NR_UE ue context
diff --git a/openair1/SCHED_NR_UE/phy_frame_config_nr.h b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
index 3669239578..fcc2fa5838 100644
--- a/openair1/SCHED_NR_UE/phy_frame_config_nr.h
+++ b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
@@ -61,18 +61,18 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
/** \brief This function checks nr slot direction : downlink or uplink
* @param frame_parms NR DL Frame parameters
* @param nr_frame : frame number
- * @param nr_tti : slot number
+ * @param nr_slot : slot number
@returns int : downlink or uplink */
-int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti);
+int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_slot);
/** \brief This function checks nr UE slot direction : downlink or uplink
* @param cfg : FAPI Config Request
* @param nr_frame : frame number
- * @param nr_tti : slot number
+ * @param nr_slot : slot number
@returns int : downlink, uplink or mixed slot type */
-int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti);
+int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_slot);
/** \brief This function frees tdd configuration for nr
* @param frame_parms NR DL Frame parameters
diff --git a/openair1/SCHED_NR_UE/phy_frame_config_nr_ue.c b/openair1/SCHED_NR_UE/phy_frame_config_nr_ue.c
index 640ffb4ac3..6254f6a2d2 100644
--- a/openair1/SCHED_NR_UE/phy_frame_config_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_frame_config_nr_ue.c
@@ -39,7 +39,7 @@
*
*********************************************************************/
-int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
+int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_slot) {
/* for FFD all slot can be considered as an uplink */
int mu = cfg->ssb_config.scs_common, check_slot = 0;
@@ -49,7 +49,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
if (nr_frame%2 == 0) {
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
+ if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 1) {
check_slot++;
}
}
@@ -61,7 +61,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
check_slot = 0;
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[nr_tti].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
+ if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config == 0) {
check_slot++;
}
}
@@ -73,7 +73,7 @@ int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti) {
}
} else {
for(int symbol_count=0; symbol_counttdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<tdd_table.max_tdd_periodicity_list[((1<frame_parms.numerology_index;
uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
@@ -172,15 +172,14 @@ void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc,
// Transmission timing adjustment (TS 38.213 p4.2)
ue->timing_advance = bw_scaling / factor_mu;
- LOG_D(PHY, "[UE %d] Frame %d Slot %d, Received (RAR) timing advance command %d new value is %u \n", ue->Mod_id, proc->frame_rx, proc->nr_tti_rx, ta_command, ue->timing_advance);
+ LOG_D(PHY, "[UE %d] Frame %d Slot %d, Received (RAR) timing advance command %d new value is %u \n", ue->Mod_id, frame_rx, nr_slot_rx, ta_command, ue->timing_advance);
}
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
- uint8_t gNB_id,
- uint8_t thread_id){
+ uint8_t gNB_id) {
//int32_t ulsch_start=0;
- int slot_tx = proc->nr_tti_tx;
+ int slot_tx = proc->nr_slot_tx;
int frame_tx = proc->frame_tx;
uint8_t harq_pid = 0;
runmode_t mode = normal_txrx;
@@ -197,8 +196,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
if (ue->UE_mode[gNB_id] <= PUSCH || get_softmodem_params()->phy_test == 1){
- if (ue->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE)
- nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, thread_id, gNB_id);
+ if (ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE)
+ nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id);
if (get_softmodem_params()->usim_test==0) {
LOG_D(PHY, "Generating PUCCH\n");
@@ -212,7 +211,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
nr_ue_pusch_common_procedures(ue,
slot_tx,
&ue->frame_parms,1);
- //ue->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->pusch_pdu.nrOfLayers);
+ //ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->pusch_pdu.nrOfLayers);
}
//LOG_M("txdata.m","txs",ue->common_vars.txdata[0],1228800,1,1);
@@ -241,25 +240,27 @@ void nr_ue_measurement_procedures(uint16_t l, // symbol index of each slot [0
LOG_D(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp);
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
- int nr_tti_rx = proc->nr_tti_rx;
+ int frame_rx = proc->frame_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN);
if (l==2) {
// UE measurements on symbol 0
- LOG_D(PHY,"Calling measurements nr_tti_rx %d, rxdata %p\n",nr_tti_rx,ue->common_vars.rxdata);
+ LOG_D(PHY,"Calling measurements nr_slot_rx %d, rxdata %p\n",nr_slot_rx,ue->common_vars.rxdata);
/*
- nr_ue_measurements(ue,
- 0,
- 0,
- 0,
- 0,
- nr_tti_rx);
-*/
- //(nr_tti_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)
+ nr_ue_measurements(ue,
+ proc,
+ 0,
+ 0,
+ 0,
+ 0,
+ nr_slot_rx);
+*/
+ //(nr_slot_rx*frame_parms->samples_per_slot+ue->rx_offset) % frame_parms->samples_per_frame
#if T_TRACER
if(slot == 0)
- T(T_UE_PHY_MEAS, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(proc->frame_rx%1024), T_INT(proc->nr_tti_rx),
+ T(T_UE_PHY_MEAS, T_INT(eNB_id), T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(nr_slot_rx),
T_INT((int)(10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB)),
T_INT((int)ue->measurements.rx_rssi_dBm[0]),
T_INT((int)(ue->measurements.rx_power_avg_dB[0] - ue->measurements.n0_power_avg_dB)),
@@ -318,7 +319,7 @@ void nr_ue_pbch_procedures(uint8_t gNB_id,
DevAssert(ue);
int frame_rx = proc->frame_rx;
- int nr_tti_rx = proc->nr_tti_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN);
@@ -345,17 +346,17 @@ void nr_ue_pbch_procedures(uint8_t gNB_id,
#ifdef DEBUG_PHY_PROC
uint16_t frame_tx;
- LOG_D(PHY,"[UE %d] frame %d, nr_tti_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n",
+ LOG_D(PHY,"[UE %d] frame %d, nr_slot_rx %d, Received PBCH (MIB): frame_tx %d. N_RB_DL %d\n",
ue->Mod_id,
frame_rx,
- nr_tti_rx,
+ nr_slot_rx,
frame_tx,
ue->frame_parms.N_RB_DL);
#endif
} else {
- LOG_E(PHY,"[UE %d] frame %d, nr_tti_rx %d, Error decoding PBCH!\n",
- ue->Mod_id,frame_rx, nr_tti_rx);
+ LOG_E(PHY,"[UE %d] frame %d, nr_slot_rx %d, Error decoding PBCH!\n",
+ ue->Mod_id,frame_rx, nr_slot_rx);
/*FILE *fd;
if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) {
fwrite((void *)&ue->common_vars.rxdata[0][0],
@@ -397,7 +398,7 @@ void nr_ue_pbch_procedures(uint8_t gNB_id,
#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n",
- ue->Mod_id,frame_rx, nr_tti_rx,
+ ue->Mod_id,frame_rx, nr_slot_rx,
ue->pbch_vars[gNB_id]->pdu_errors,
ue->pbch_vars[gNB_id]->pdu_errors_conseq);
#endif
@@ -430,7 +431,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
UE_nr_rxtx_proc_t *proc)
{
int frame_rx = proc->frame_rx;
- int nr_tti_rx = proc->nr_tti_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
unsigned int dci_cnt=0;
/*
@@ -440,10 +441,10 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
#endif
int frame_rx = proc->frame_rx;
- int nr_tti_rx = proc->nr_tti_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
NR_DCI_ALLOC_t dci_alloc_rx[8];
- //uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
+ //uint8_t next1_thread_id = proc->thread_id== (RX_NB_TH-1) ? 0:(proc->thread_id+1);
//uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
@@ -454,8 +455,8 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
int nb_searchspace_active=0;
- NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]];
- NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id];
+ NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[proc->thread_id];
+ NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[proc->thread_id][gNB_id];
// s in TS 38.212 Subclause 10.1, for each active BWP the UE can deal with 10 different search spaces
// Higher layers have updated the number of searchSpaces with are active in the current slot and this value is stored in variable nb_searchspace_total
int nb_searchspace_total = pdcch_vars2->nb_search_space;
@@ -477,7 +478,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
#ifdef NR_PDCCH_SCHED_DEBUG
printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total so we set it to 1...\n");
printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> the number of searchSpaces active in the current slot(%d) is %d) \n",
- nr_tti_rx,nb_searchspace_total);
+ nr_slot_rx,nb_searchspace_total);
#endif
//FK: we define dci_ind and dl_indication as local variables, this way the call to the mac should be thread safe
@@ -501,12 +502,12 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
// The following code has been removed as it is handled by higher layers (fapi)
//
- // Verify that monitoring is required at the slot nr_tti_rx. We will run pdcch procedure only if do_pdcch_monitoring_current_slot=1
+ // Verify that monitoring is required at the slot nr_slot_rx. We will run pdcch procedure only if do_pdcch_monitoring_current_slot=1
// For Type0-PDCCH searchspace, we need to calculate the monitoring slot from Tables 13-1 .. 13-15 in TS 38.213 Subsection 13
//NR_UE_SLOT_PERIOD_OFFSET_t sl_period_offset_mon = pdcch_vars2->searchSpace[nb_searchspace_active].monitoringSlotPeriodicityAndOffset;
//if (sl_period_offset_mon == nr_sl1) {
//do_pdcch_monitoring_current_slot=1; // PDCCH monitoring in every slot
- //} else if (nr_tti_rx%(uint16_t)sl_period_offset_mon == pdcch_vars2->searchSpace[nb_searchspace_active].monitoringSlotPeriodicityAndOffset_offset) {
+ //} else if (nr_slot_rx%(uint16_t)sl_period_offset_mon == pdcch_vars2->searchSpace[nb_searchspace_active].monitoringSlotPeriodicityAndOffset_offset) {
//do_pdcch_monitoring_current_slot=1; // PDCCH monitoring in every monitoringSlotPeriodicityAndOffset slot with offset
//}
@@ -525,7 +526,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
#endif
// if (do_pdcch_monitoring_current_slot) {
- // the searchSpace indicates that we need to monitor PDCCH in current nr_tti_rx
+ // the searchSpace indicates that we need to monitor PDCCH in current nr_slot_rx
// get the parameters describing the current SEARCHSPACE
// the CORESET id applicable to the current SearchSpace
//int searchSpace_coreset_id = pdcch_vars2->searchSpace[nb_searchspace_active].controlResourceSetId;
@@ -598,8 +599,8 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
searchSpaceType);
#endif
nr_rx_pdcch(ue,
- proc->frame_rx,
- nr_tti_rx,
+ frame_rx,
+ nr_slot_rx,
gNB_id,
//(ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
SISO,
@@ -617,9 +618,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
*/
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN);
- nr_rx_pdcch(ue,
- proc->frame_rx,
- nr_tti_rx);
+ nr_rx_pdcch(ue, proc);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
@@ -632,27 +631,24 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
fapi_nr_dci_indication_t dci_ind={0};
nr_downlink_indication_t dl_indication={0};
- dci_cnt = nr_dci_decoding_procedure(ue,
- proc->frame_rx,
- nr_tti_rx,
- &dci_ind);
+ dci_cnt = nr_dci_decoding_procedure(ue, proc, &dci_ind);
#ifdef NR_PDCCH_SCHED_DEBUG
LOG_I(PHY,"<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%u\n",dci_cnt);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT);
- //LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_tti_rx %d PHICH RX\n",ue->Mod_id,frame_rx,nr_tti_rx);
+ //LOG_D(PHY,"[UE %d][PUSCH] Frame %d nr_slot_rx %d PHICH RX\n",ue->Mod_id,frame_rx,nr_slot_rx);
for (int i=0; i rnti %x : format %d\n",
- ue->Mod_id,frame_rx%1024,nr_tti_rx,nr_mode_string[ue->UE_mode[gNB_id]],
+ ue->Mod_id,frame_rx%1024,nr_slot_rx,nr_mode_string[ue->UE_mode[gNB_id]],
i + 1,
dci_cnt,
dci_ind.dci_list[i].rnti,
dci_ind.dci_list[i].dci_format);
}
- ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->dci_received += dci_cnt;
+ ue->pdcch_vars[proc->thread_id][gNB_id]->dci_received += dci_cnt;
dci_ind.number_of_dcis = dci_cnt;
/*
@@ -674,7 +670,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
&dci_ind.dci_list[i].dci,
dci_fields_sizes_cnt[i],
dci_alloc_rx[i].format,
- nr_tti_rx,
+ nr_slot_rx,
pdcch_vars2->n_RB_BWP[nb_searchspace_active],
pdcch_vars2->n_RB_BWP[nb_searchspace_active],
crc_scrambled_values);
@@ -696,7 +692,8 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
dl_indication.cc_id = ue->CC_id;
dl_indication.gNB_index = gNB_id;
dl_indication.frame = frame_rx;
- dl_indication.slot = nr_tti_rx;
+ dl_indication.slot = nr_slot_rx;
+ dl_indication.thread_id = proc->thread_id;
dl_indication.rx_ind = NULL; //no data, only dci for now
dl_indication.dci_ind = &dci_ind;
@@ -714,7 +711,8 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1) {
- int nr_tti_rx = proc->nr_tti_rx;
+ int frame_rx = proc->frame_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
int m;
int i_mod,eNB_id_i,dual_stream_UE;
int first_symbol_flag=0;
@@ -733,20 +731,33 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
uint16_t s0 = dlsch0->harq_processes[harq_pid]->start_symbol;
uint16_t s1 = dlsch0->harq_processes[harq_pid]->nb_symbols;
- LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_tti_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_tti_rx,harq_pid,dlsch0->harq_processes[harq_pid]->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos);
+ LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0->harq_processes[harq_pid]->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos);
- // do channel estimation for first DMRS only
- for (m = s0; m < 3; m++) {
+ for (m = s0; m < (s0 +s1); m++) {
if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) > 0) {
- nr_pdsch_channel_estimation(ue,
- 0 /*eNB_id*/,
- nr_tti_rx,
- 0 /*p*/,
- m,
- ue->frame_parms.first_carrier_offset+(BWPStart + pdsch_start_rb)*12,
- pdsch_nb_rb);
- LOG_D(PHY,"Channel Estimation in symbol %d\n",m);
- break;
+ for (uint8_t aatx=0; aatx<1; aatx++) {//for MIMO Config: it shall loop over no_layers
+ nr_pdsch_channel_estimation(ue,
+ proc,
+ 0 /*eNB_id*/,
+ nr_slot_rx,
+ aatx /*p*/,
+ m,
+ ue->frame_parms.first_carrier_offset+(BWPStart + pdsch_start_rb)*12,
+ pdsch_nb_rb);
+ LOG_D(PHY,"PDSCH Channel estimation gNB id %d, PDSCH antenna port %d, slot %d, symbol %d\n",0,aatx,nr_slot_rx,m);
+#if 0
+ ///LOG_M: the channel estimation
+ int nr_frame_rx = proc->frame_rx;
+ char filename[100];
+ for (uint8_t aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+ sprintf(filename,"PDSCH_CHANNEL_frame%d_slot%d_sym%d_port%d_rx%d.m", nr_frame_rx, nr_slot_rx, m, aatx,aarx);
+ int **dl_ch_estimates = ue->pdsch_vars[proc->thread_id][eNB_id]->dl_ch_estimates;
+ LOG_M(filename,"channel_F",&dl_ch_estimates[aatx*ue->frame_parms.nb_antennas_rx+aarx][ue->frame_parms.ofdm_symbol_size*m],ue->frame_parms.ofdm_symbol_size, 1, 1);
+ }
+#endif
+ }
+ if ( ue->high_speed_flag == 0 ) //for slow speed case only estimate the channel once per slot
+ break;
}
}
for (m = s0; m < (s1 + s0); m++) {
@@ -763,33 +774,35 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
uint8_t slot = 0;
if(m >= ue->frame_parms.symbols_per_slot>>1)
slot = 1;
- start_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[nr_tti_rx]][slot]);
+ start_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#endif
// process DLSCH received in first slot
// skip DMRS symbols (will have to check later if PDSCH/DMRS are multiplexed
if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) == 0) {
if (nr_rx_pdsch(ue,
- pdsch,
- eNB_id,
- eNB_id_i,
- proc->frame_rx,
- nr_tti_rx, // nr_tti_rx,
- m,
- first_symbol_flag,
- dual_stream_UE,
- i_mod,
- dlsch0->current_harq_pid) < 0)
- return -1;
- }
- else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
- if (pdsch == RA_PDSCH) ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m]=ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m-1];
- else if (pdsch == PDSCH) {
- if (nr_rx_pdsch(ue,
+ proc,
pdsch,
eNB_id,
eNB_id_i,
- proc->frame_rx,
- nr_tti_rx, // nr_tti_rx,
+ frame_rx,
+ nr_slot_rx,
+ m,
+ first_symbol_flag,
+ dual_stream_UE,
+ i_mod,
+ dlsch0->current_harq_pid) < 0)
+ return -1;
+ }
+ else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
+ if (pdsch == RA_PDSCH) ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]=ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m-1];
+ else if (pdsch == PDSCH) {
+ if (nr_rx_pdsch(ue,
+ proc,
+ pdsch,
+ eNB_id,
+ eNB_id_i,
+ frame_rx,
+ nr_slot_rx,
m,
first_symbol_flag,
dual_stream_UE,
@@ -799,13 +812,13 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
}
else AssertFatal(1==0,"not RA_PDSCH or PDSCH\n");
}
- if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->llr_offset[m]);
+ if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]);
#if UE_TIMING_TRACE
- stop_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[nr_tti_rx]][slot]);
+ stop_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,nr_tti_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",frame_rx,nr_slot_rx,m,ue->dlsch_llr_stats_parallelization[proc->thread_id][slot].p_time/(cpuf*1000.0));
#else
- LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,nr_tti_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[nr_tti_rx]][slot].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",frame_rx,nr_slot_rx,m,ue->dlsch_llr_stats_parallelization[proc->thread_id][slot].p_time/(cpuf*1000.0));
#endif
#endif
@@ -829,38 +842,38 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
void nr_process_rar(nr_downlink_indication_t *dl_info) {
module_id_t module_id = dl_info->module_id;
- int cc_id = dl_info->cc_id, frame_rx = dl_info->proc->frame_rx, nr_tti_rx = dl_info->proc->nr_tti_rx, ta_command;
+ int cc_id = dl_info->cc_id, frame_rx = dl_info->frame, nr_slot_rx = dl_info->slot, ta_command;
uint8_t gNB_index = dl_info->gNB_index; // *rar;
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[module_id][cc_id];
NR_UE_DLSCH_t *dlsch0 = ue->dlsch_ra[gNB_index];
UE_MODE_t UE_mode = ue->UE_mode[gNB_index];
NR_PRACH_RESOURCES_t *prach_resources = ue->prach_resources[gNB_index];
- LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", module_id, frame_rx, nr_tti_rx, UE_mode);
+ LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Received RAR mode %d\n", module_id, frame_rx, nr_slot_rx, UE_mode);
if (ue->mac_enabled == 1) {
if ((UE_mode != PUSCH) && (prach_resources->Msg3 != NULL)) {
- LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", module_id, frame_rx, nr_tti_rx, prach_resources->ra_PreambleIndex);
+ LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Invoking MAC for RAR (current preamble %d)\n", module_id, frame_rx, nr_slot_rx, prach_resources->ra_PreambleIndex);
ta_command = nr_ue_process_rar(ue->Mod_id,
cc_id,
frame_rx,
- nr_tti_rx,
+ nr_slot_rx,
dlsch0->harq_processes[0]->b,
- &ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][gNB_index]->pdcch_config[0].rnti,
+ &ue->pdcch_vars[dl_info->thread_id][gNB_index]->pdcch_config[0].rnti,
prach_resources->ra_PreambleIndex,
dlsch0->harq_processes[0]->b); // alter the 'b' buffer so it contains only the selected RAR header and RAR payload
if (ta_command != 0xffff) {
- LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got Temporary C-RNTI %x and timing advance %d from RAR\n",
+ LOG_D(PHY,"[UE %d][RAPROC] Frame %d slot %d Got Temporary C-RNTI %x and timing advance %d from RAR\n",
ue->Mod_id,
frame_rx,
- nr_tti_rx,
- ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][gNB_index]->pdcch_config[0].rnti,
+ nr_slot_rx,
+ ue->pdcch_vars[dl_info->thread_id][gNB_index]->pdcch_config[0].rnti,
ta_command);
- nr_process_timing_advance_rar(ue, dl_info->proc, ta_command);
+ nr_process_timing_advance_rar(ue, frame_rx, nr_slot_rx, ta_command);
if (ue->mode != debug_prach)
ue->UE_mode[gNB_index] = RA_RESPONSE;
@@ -872,7 +885,7 @@ void nr_process_rar(nr_downlink_indication_t *dl_info) {
} else {
// rar = dlsch0->harq_processes[0]->b+1;
// ta_command = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
- // nr_process_timing_advance_rar(ue, dl_info->proc, ta_command);
+ // nr_process_timing_advance_rar(ue, frame_rx, nr_slot_rx, ta_command);
}
}
@@ -911,13 +924,13 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
int harq_pid = dlsch0->current_harq_pid;
int frame_rx = proc->frame_rx;
- int nr_tti_rx = proc->nr_tti_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
int ret=0, ret1=0;
NR_UE_PDSCH *pdsch_vars;
uint8_t is_cw0_active = 0;
uint8_t is_cw1_active = 0;
uint8_t dmrs_type, nb_re_dmrs;
- uint16_t length_dmrs = 1;
+ uint16_t dmrs_len = get_num_dmrs(dlsch0->harq_processes[dlsch0->current_harq_pid]->dlDmrsSymbPos);
uint16_t nb_symb_sch = 9;
nr_downlink_indication_t dl_indication;
fapi_nr_rx_indication_t rx_ind;
@@ -950,8 +963,8 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
if(dlsch1)
is_cw1_active = dlsch1->harq_processes[harq_pid]->status;
- LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw0_active);
- LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, nr_tti_rx, harq_pid, is_cw1_active);
+ LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, nr_slot_rx, harq_pid, is_cw0_active);
+ LOG_D(PHY,"AbsSubframe %d.%d Start LDPC Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, nr_slot_rx, harq_pid, is_cw1_active);
if(is_cw0_active && is_cw1_active)
{
@@ -968,7 +981,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
case RA_PDSCH:
case P_PDSCH:
case PDSCH:
- pdsch_vars = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
+ pdsch_vars = ue->pdsch_vars[proc->thread_id][eNB_id];
break;
case PMCH:
case PDSCH1:
@@ -989,7 +1002,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
if (ue->prach_resources[eNB_id]!=NULL)
dlsch0->rnti = ue->prach_resources[eNB_id]->ra_RNTI;
else {
- LOG_E(PHY,"[UE %d] Frame %d, nr_tti_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_tti_rx);
+ LOG_E(PHY,"[UE %d] Frame %d, nr_slot_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_slot_rx);
//mac_xface->macphy_exit("prach_resources is NULL");
return;
}
@@ -1003,7 +1016,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb,
nb_symb_sch,
nb_re_dmrs,
- length_dmrs,
+ dmrs_len,
dlsch0->harq_processes[harq_pid]->Qm,
dlsch0->harq_processes[harq_pid]->Nl);
#if UE_TIMING_TRACE
@@ -1021,18 +1034,18 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#if 0
- LOG_I(PHY," ------ start ldpc decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, nr_tti_rx, harq_pid);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->rb_alloc_even);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Qm);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Nl);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->harq_processes[harq_pid]->G);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch0->Kmimo);
- LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols);
+ LOG_I(PHY," ------ start ldpc decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, nr_slot_rx, harq_pid);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->harq_processes[harq_pid]->rb_alloc_even);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Qm);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Nl);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->harq_processes[harq_pid]->G);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch0->Kmimo);
+ LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_slot_rx, harq_pid, ue->pdcch_vars[proc->thread_id][eNB_id]->num_pdcch_symbols);
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]]);
+ start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
#endif
#ifdef UE_DLSCH_PARALLELISATION
@@ -1045,20 +1058,22 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch0->harq_processes[harq_pid],
frame_rx,
nb_symb_sch,
- nr_tti_rx,
+ nr_slot_rx,
harq_pid,
pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret = %d\n", ret);
#else
ret = nr_dlsch_decoding(ue,
+ proc,
+ eNB_id,
pdsch_vars->llr[0],
&ue->frame_parms,
dlsch0,
dlsch0->harq_processes[harq_pid],
frame_rx,
nb_symb_sch,
- nr_tti_rx,
+ nr_slot_rx,
harq_pid,
pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
@@ -1067,28 +1082,28 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#if UE_TIMING_TRACE
- stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]]);
+ stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
#if DISABLE_LOG_X
printf(" --> Unscrambling for CW0 %5.3f\n",
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
printf("AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
- frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
+ frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
#else
LOG_I(PHY, " --> Unscrambling for CW0 %5.3f\n",
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
LOG_I(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
- frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
+ frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
#endif
#endif
if(is_cw1_active)
{
// start ldpc decode for CW 1
- dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
- nb_symb_sch,
- nb_re_dmrs,
- length_dmrs,
- dlsch1->harq_processes[harq_pid]->Qm,
+ dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
+ nb_symb_sch,
+ nb_re_dmrs,
+ dmrs_len,
+ dlsch1->harq_processes[harq_pid]->Qm,
dlsch1->harq_processes[harq_pid]->Nl);
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_unscrambling_stats);
@@ -1103,17 +1118,17 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#if 0
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->rb_alloc_even);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Qm);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Nl);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->harq_processes[harq_pid]->G);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_tti_rx, harq_pid, dlsch1->Kmimo);
- LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_tti_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->rb_alloc_even);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Qm);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Nl);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->G);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->Kmimo);
+ LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_slot_rx, harq_pid, ue->pdcch_vars[proc->thread_id][eNB_id]->num_pdcch_symbols);
#endif
#if UE_TIMING_TRACE
- start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]]);
+ start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
#endif
#ifdef UE_DLSCH_PARALLELISATION
@@ -1126,20 +1141,22 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch1->harq_processes[harq_pid],
frame_rx,
nb_symb_sch,
- nr_tti_rx,
+ nr_slot_rx,
harq_pid,
pdsch==PDSCH?1:0,
dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret1 = %d\n", ret1);
#else
ret1 = nr_dlsch_decoding(ue,
+ proc,
+ eNB_id,
pdsch_vars->llr[1],
&ue->frame_parms,
dlsch1,
dlsch1->harq_processes[harq_pid],
frame_rx,
nb_symb_sch,
- nr_tti_rx,
+ nr_slot_rx,
harq_pid,
pdsch==PDSCH?1:0,//proc->decoder_switch,
dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
@@ -1148,27 +1165,27 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
#endif
#if UE_TIMING_TRACE
- stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]]);
+ stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
#if DISABLE_LOG_X
printf(" --> Unscrambling for CW1 %5.3f\n",
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
printf("AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
- frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
+ frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
#else
LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
(ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
- frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
+ frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
#endif
#endif
LOG_I(PHY,"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
- frame_rx%1024, nr_tti_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
+ frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS);
}
- LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_tti_rx);
+ LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ \n", frame_rx, nr_slot_rx);
LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS);
if(retmax_ldpc_iterations+1){
@@ -1178,9 +1195,10 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dl_indication.cc_id = ue->CC_id;
dl_indication.gNB_index = eNB_id;
dl_indication.frame = frame_rx;
- dl_indication.slot = nr_tti_rx;
+ dl_indication.slot = nr_slot_rx;
+ dl_indication.thread_id = proc->thread_id;
dl_indication.rx_ind = &rx_ind; // hang on rx_ind instance
- dl_indication.proc=proc;
+ dl_indication.dci_ind = NULL;
//dl_indication.rx_ind->number_pdus
switch (pdsch) {
@@ -1199,8 +1217,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_D(PHY, "PDU length in bits: %d, in bytes: %d \n", dlsch0->harq_processes[harq_pid]->TBS, rx_ind.rx_indication_body[0].pdsch_pdu.pdu_length);
rx_ind.number_pdus = 1;
- //ue->dl_indication.rx_ind = &dlsch1->harq_processes[harq_pid]->b; //no data, only dci for now
- dl_indication.dci_ind = NULL; //&ue->dci_ind;
// send to mac
if (ue->if_inst && ue->if_inst->dl_indication)
ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
@@ -1214,7 +1230,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
if(dlsch0->rnti != 0xffff){
LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,subframe_rx,
+ harq_pid,frame_rx,nr_slot_rx,
dlsch0->harq_processes[harq_pid]->rvidx,
dlsch0->harq_processes[harq_pid]->round,
dlsch0->harq_processes[harq_pid]->mcs,
@@ -1224,7 +1240,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
if(dlsch0->rnti != 0xffff){
LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)\n",
ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,subframe_rx,
+ harq_pid,frame_rx,nr_slot_rx,
dlsch0->harq_processes[harq_pid]->rvidx,
dlsch0->harq_processes[harq_pid]->round,
dlsch0->harq_processes[harq_pid]->mcs,
@@ -1308,15 +1324,15 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
ul_tx_timing_adjustment = 1 + ceil(slots_per_subframe*((N_t_1 + N_t_2 + N_TA_max)*tc_factor + 0.5)/t_subframe);
if (ul_time_alignment->apply_ta == 1){
- ul_time_alignment->ta_slot = (nr_tti_rx + ul_tx_timing_adjustment) % slots_per_frame;
- if (nr_tti_rx + ul_tx_timing_adjustment > slots_per_frame){
+ ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
+ if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){
ul_time_alignment->ta_frame = (frame_rx + 1) % 1024;
} else {
ul_time_alignment->ta_frame = frame_rx;
}
// reset TA flag
ul_time_alignment->apply_ta = 0;
- LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_tti_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
+ LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
}
}
@@ -1345,17 +1361,10 @@ void *UE_thread_slot1_dl_processing(void *arg) {
UE_nr_rxtx_proc_t *proc = rtd->proc;
PHY_VARS_NR_UE *ue = rtd->UE;
- int frame_rx;
- uint8_t nr_tti_rx;
- uint8_t pilot0;
uint8_t pilot1;
- uint8_t slot1;
-
- uint8_t next_nr_tti_rx;
- uint8_t next_subframe_slot0;
proc->instance_cnt_slot1_dl_processing=-1;
- proc->nr_tti_rx=proc->sub_frame_start;
+ proc->nr_slot_rx = proc->sub_frame_start * ue->frame_parms.slots_per_subframe;
char threadname[256];
sprintf(threadname,"UE_thread_slot1_dl_processing_%d", proc->sub_frame_start);
@@ -1386,21 +1395,15 @@ void *UE_thread_slot1_dl_processing(void *arg) {
exit_fun("nothing to add");
}
- /*for(int th_idx=0; th_idx< RX_NB_TH; th_idx++)
- {
- frame_rx = ue->proc.proc_rxtx[0].frame_rx;
- nr_tti_rx = ue->proc.proc_rxtx[0].nr_tti_rx;
- printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, nr_tti_rx);
- }*/
- frame_rx = proc->frame_rx;
- nr_tti_rx = proc->nr_tti_rx;
- next_nr_tti_rx = (1+nr_tti_rx)%10;
- next_subframe_slot0 = next_nr_tti_rx<<1;
+ int frame_rx = proc->frame_rx;
+ uint8_t subframe_rx = proc->nr_slot_rx / ue->frame_parms.slots_per_subframe;
+ uint8_t next_subframe_rx = (1 + subframe_rx) % NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+ uint8_t next_subframe_slot0 = next_subframe_rx * ue->frame_parms.slots_per_subframe;
- slot1 = (nr_tti_rx<<1) + 1;
- pilot0 = 0;
+ uint8_t slot1 = proc->nr_slot_rx + 1;
+ uint8_t pilot0 = 0;
- //printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, nr_tti_rx);
+ //printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, nr_slot_rx);
if (ue->frame_parms.Ncp == 0) { // normal prefix
pilot1 = 4;
@@ -1410,13 +1413,13 @@ void *UE_thread_slot1_dl_processing(void *arg) {
/**** Slot1 FE Processing ****/
#if UE_TIMING_TRACE
- start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1]);
+ start_meas(&ue->ue_front_end_per_slot_stat[proc->thread_id][1]);
#endif
// I- start dl slot1 processing
- // do first symbol of next downlink nr_tti_rx for channel estimation
+ // do first symbol of next downlink nr_slot_rx for channel estimation
/*
- // 1- perform FFT for pilot ofdm symbols first (ofdmSym0 next nr_tti_rx ofdmSym11)
- if (nr_subframe_select(&ue->frame_parms,next_nr_tti_rx) != SF_UL)
+ // 1- perform FFT for pilot ofdm symbols first (ofdmSym0 next nr_slot_rx ofdmSym11)
+ if (nr_subframe_select(&ue->frame_parms,next_nr_slot_rx) != SF_UL)
{
front_end_fft(ue,
pilot0,
@@ -1440,7 +1443,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
start_meas(&ue->ofdm_demod_stats);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
- //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot1,l);
+ //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_slot_rx,slot1,l);
front_end_fft(ue,
l,
slot1,
@@ -1453,9 +1456,9 @@ void *UE_thread_slot1_dl_processing(void *arg) {
}
} // for l=1..l2
- if (nr_subframe_select(&ue->frame_parms,next_nr_tti_rx) != SF_UL)
+ if (nr_subframe_select(&ue->frame_parms,next_nr_slot_rx) != SF_UL)
{
- //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_tti_rx,next_subframe_slot0,pilot0);
+ //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_slot_rx,next_subframe_slot0,pilot0);
front_end_fft(ue,
pilot0,
next_subframe_slot0,
@@ -1477,37 +1480,37 @@ void *UE_thread_slot1_dl_processing(void *arg) {
}
//printf("[slot1 dl processing] ChanEst symbol %d slot %d wait%d\n",l,slot1,wait);
}
- //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot1,l);
+ //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_slot_rx,slot1,l);
front_end_chanEst(ue,
l,
slot1,
0);
- ue_measurement_procedures(l-1,ue,proc,0,1+(nr_tti_rx<<1),0,ue->mode);
+ ue_measurement_procedures(l-1,ue,proc,0,slot1,0,ue->mode);
}
- //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_tti_rx,next_subframe_slot0,pilot0);
+ //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_slot_rx,next_subframe_slot0,pilot0);
front_end_chanEst(ue,
pilot0,
next_subframe_slot0,
0);
- if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1))
+ if ( (nr_slot_rx == 0) && (ue->decode_MIB == 1))
{
ue_pbch_procedures(0,ue,proc,0);
}
proc->chan_est_slot1_available = 1;
- //printf("Set available slot 1channelEst to 1 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
- //printf(" [slot1 dl processing] ==> FFT/CHanEst Done for AbsSubframe %d.%d \n", proc->frame_rx, proc->nr_tti_rx);
+ //printf("Set available slot 1channelEst to 1 AbsSubframe %d.%d \n",frame_rx,nr_slot_rx);
+ //printf(" [slot1 dl processing] ==> FFT/CHanEst Done for AbsSubframe %d.%d \n", proc->frame_rx, proc->nr_slot_rx);
- //printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->nr_tti_rx);
+ //printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->nr_slot_rx);
#if UE_TIMING_TRACE
- stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1]);
+ stop_meas(&ue->ue_front_end_per_slot_stat[proc->thread_id][1]);
#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_tti_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_slot_rx,ue->ue_front_end_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
#else
- LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_tti_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,nr_slot_rx,ue->ue_front_end_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
#endif
#endif
@@ -1519,22 +1522,22 @@ void *UE_thread_slot1_dl_processing(void *arg) {
usleep(1);
wait++;
}
- //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait DCI %d\n",frame_rx,nr_tti_rx,wait);
+ //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait DCI %d\n",frame_rx,nr_slot_rx,wait);
/**** Pdsch Procedure Slot1 ****/
// start slot1 thread for Pdsch Procedure (slot1)
// do procedures for C-RNTI
- //printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,nr_tti_rx);
+ //printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,nr_slot_rx);
#if UE_TIMING_TRACE
- start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1]);
+ start_meas(&ue->pdsch_procedures_per_slot_stat[proc->thread_id][1]);
#endif
// start slave thread for Pdsch Procedure (slot1)
// do procedures for C-RNTI
uint8_t eNB_id = 0;
- if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1) {
+ if (ue->dlsch[proc->thread_id][eNB_id][0]->active == 1) {
//wait until first ofdm symbol is processed
//wait = 0;
//while(proc->first_symbol_available == 0)
@@ -1542,20 +1545,20 @@ void *UE_thread_slot1_dl_processing(void *arg) {
// usleep(1);
// wait++;
//}
- //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait First Ofdm Sym %d\n",frame_rx,nr_tti_rx,wait);
+ //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait First Ofdm Sym %d\n",frame_rx,nr_slot_rx,wait);
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
ue_pdsch_procedures(ue,
proc,
eNB_id,
PDSCH,
- ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0],
+ ue->dlsch[proc->thread_id][eNB_id][0],
NULL,
(ue->frame_parms.symbols_per_slot>>1),
ue->frame_parms.symbols_per_slot-1,
abstraction_flag);
- LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
- LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
+ LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
+ LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
}
// do procedures for SI-RNTI
@@ -1597,14 +1600,14 @@ void *UE_thread_slot1_dl_processing(void *arg) {
}
proc->llr_slot1_available=1;
- //printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
+ //printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,nr_slot_rx);
#if UE_TIMING_TRACE
- stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1]);
+ stop_meas(&ue->pdsch_procedures_per_slot_stat[proc->thread_id][1]);
#if DISABLE_LOG_X
- printf("[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_tti_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1].p_time/(cpuf*1000.0));
+ printf("[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_slot_rx,ue->pdsch_procedures_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
#else
- LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_tti_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[nr_tti_rx]][1].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,nr_slot_rx,ue->pdsch_procedures_per_slot_stat[proc->thread_id][1].p_time/(cpuf*1000.0));
#endif
#endif
@@ -1705,10 +1708,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
runmode_t mode)
{
int frame_rx = proc->frame_rx;
- int nr_tti_rx = proc->nr_tti_rx;
+ int nr_slot_rx = proc->nr_slot_rx;
int slot_pbch;
int slot_ssb;
- NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][0];
+ NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
fapi_nr_config_request_t *cfg = &ue->nrUE_config;
uint8_t nb_symb_pdcch = pdcch_vars->nb_search_space > 0 ? pdcch_vars->pdcch_config[0].coreset.duration : 0;
@@ -1719,10 +1722,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
- LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
+ LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_slot_rx);
/*
- uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
+ uint8_t next1_thread_id = proc->thread_id== (RX_NB_TH-1) ? 0:(proc->thread_id+1);
uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
*/
@@ -1731,53 +1734,54 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
if (pdcch_vars->nb_search_space > 0)
get_coreset_rballoc(pdcch_vars->pdcch_config[0].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
-
- slot_pbch = is_pbch_in_slot(cfg, frame_rx, nr_tti_rx, fp);
- slot_ssb = is_ssb_in_slot(cfg, frame_rx, nr_tti_rx, fp);
+
+ slot_pbch = is_pbch_in_slot(cfg, frame_rx, nr_slot_rx, fp);
+ slot_ssb = is_ssb_in_slot(cfg, frame_rx, nr_slot_rx, fp);
// looking for pbch only in slot where it is supposed to be
if (slot_ssb) {
- LOG_I(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
+ LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
for (int i=1; i<4; i++) {
nr_slot_fep(ue,
+ proc,
(ue->symbol_offset+i)%(fp->symbols_per_slot),
- nr_tti_rx,
+ nr_slot_rx,
0,
0);
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_channel_estimation_stats);
#endif
- nr_pbch_channel_estimation(ue,0,nr_tti_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit);
+ nr_pbch_channel_estimation(ue,proc,0,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit);
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_channel_estimation_stats);
#endif
-
}
-
+
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
- nr_ue_rsrp_measurements(ue,nr_tti_rx,0);
+ nr_ue_rsrp_measurements(ue,proc,nr_slot_rx,0);
//}
-
+
if ((ue->decode_MIB == 1) && slot_pbch) {
+
+ LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
nr_ue_pbch_procedures(gNB_id, ue, proc, 0);
if (ue->no_timing_correction==0) {
- LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_tti_rx, ue->no_timing_correction);
+ LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction);
nr_adjust_synch_ue(fp,
ue,
gNB_id,
frame_rx,
- nr_tti_rx,
+ nr_slot_rx,
0,
16384);
}
}
-
}
- if ((frame_rx%64 == 0) && (nr_tti_rx==0)) {
+ if ((frame_rx%64 == 0) && (nr_slot_rx==0)) {
printf("============================================\n");
LOG_I(PHY,"Harq round stats for Downlink: %d/%d/%d/%d DLSCH errors: %d\n",ue->dl_stats[0],ue->dl_stats[1],ue->dl_stats[2],ue->dl_stats[3],ue->dl_stats[4]);
printf("============================================\n");
@@ -1786,7 +1790,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
#ifdef NR_PDCCH_SCHED
nr_gold_pdcch(ue, 0, 2);
- LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
+ LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
for (uint16_t l=0; lfirst_carrier_offset,pdcch_vars->pdcch_config[0].BWPStart,coreset_start_rb);
if (coreset_nb_rb > 0)
nr_pdcch_channel_estimation(ue,
- 0,
- nr_tti_rx,
- l,
- fp->first_carrier_offset+(pdcch_vars->pdcch_config[0].BWPStart + coreset_start_rb)*12,
- coreset_nb_rb);
-
+ proc,
+ 0,
+ nr_slot_rx,
+ l,
+ fp->first_carrier_offset+(pdcch_vars->pdcch_config[0].BWPStart + coreset_start_rb)*12,
+ coreset_nb_rb);
+
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
stop_meas(&ue->ofdm_demod_stats);
#endif
//printf("phy procedure pdcch start measurement l =%d\n",l);
- //nr_ue_measurement_procedures(l,ue,proc,gNB_id,(nr_tti_rx),mode);
+ //nr_ue_measurement_procedures(l,ue,proc,gNB_id,(nr_slot_rx),mode);
}
@@ -1824,11 +1830,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
if (dci_cnt > 0) {
- LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: found %d DCIs\n", ue->Mod_id, frame_rx, nr_tti_rx, dci_cnt);
+ LOG_D(PHY,"[UE %d] Frame %d, nr_slot_rx %d: found %d DCIs\n", ue->Mod_id, frame_rx, nr_slot_rx, dci_cnt);
NR_UE_DLSCH_t *dlsch = NULL;
- if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->active == 1){
- dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0];
+ if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1){
+ dlsch = ue->dlsch[proc->thread_id][gNB_id][0];
} else if (ue->dlsch_ra[0]->active == 1){
dlsch = ue->dlsch_ra[0];
}
@@ -1840,24 +1846,25 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
uint16_t start_symb_sch = dlsch0_harq->start_symbol;
int symb_dmrs = -1;
- LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx);
+ LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
//to update from pdsch config
for (int i=0;i<4;i++) if (((1<dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
LOG_D(PHY,"Initializing dmrs for symb %d DMRS mask %x\n",symb_dmrs,dlsch0_harq->dlDmrsSymbPos);
- nr_gold_pdsch(ue,symb_dmrs,0, 1);
+ nr_gold_pdsch(ue,0);
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
nr_slot_fep(ue,
- m, //to be updated from higher layer
- nr_tti_rx,
- 0,
- 0);
+ proc,
+ m, //to be updated from higher layer
+ nr_slot_rx,
+ 0,
+ 0);
}
}
} else {
- LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_tti_rx);
+ LOG_D(PHY,"[UE %d] Frame %d, nr_slot_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_slot_rx);
}
#endif //NR_PDCCH_SCHED
@@ -1867,25 +1874,25 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
#endif
// do procedures for C-RNTI
int ret_pdsch = 0;
- if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->active == 1) {
+ if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
ret_pdsch = nr_ue_pdsch_procedures(ue,
proc,
gNB_id,
PDSCH,
- ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0],
+ ue->dlsch[proc->thread_id][gNB_id][0],
NULL);
//printf("phy procedure pdsch start measurement\n");
- nr_ue_measurement_procedures(2,ue,proc,gNB_id,nr_tti_rx,mode);
+ nr_ue_measurement_procedures(2,ue,proc,gNB_id,nr_slot_rx,mode);
/*
- write_output("rxF.m","rxF",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF[0][0],fp->ofdm_symbol_size*14,1,1);
- write_output("rxF_ch.m","rxFch",&ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->dl_ch_estimates[0][0],fp->ofdm_symbol_size*14,1,1);
- write_output("rxF_ch_ext.m","rxFche",&ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->dl_ch_estimates_ext[0][2*50*12],50*12,1,1);
- write_output("rxF_ext.m","rxFe",&ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->rxdataF_ext[0][0],50*12*14,1,1);
- write_output("rxF_comp.m","rxFc",&ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->rxdataF_comp0[0][0],fp->N_RB_DL*12*14,1,1);
- write_output("rxF_llr.m","rxFllr",ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][gNB_id]->llr[0],(nb_symb_sch-1)*50*12+50*6,1,0);
+ write_output("rxF.m","rxF",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],fp->ofdm_symbol_size*14,1,1);
+ write_output("rxF_ch.m","rxFch",&ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates[0][0],fp->ofdm_symbol_size*14,1,1);
+ write_output("rxF_ch_ext.m","rxFche",&ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates_ext[0][2*50*12],50*12,1,1);
+ write_output("rxF_ext.m","rxFe",&ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_ext[0][0],50*12*14,1,1);
+ write_output("rxF_comp.m","rxFc",&ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_comp0[0][0],fp->N_RB_DL*12*14,1,1);
+ write_output("rxF_llr.m","rxFllr",ue->pdsch_vars[proc->thread_id][gNB_id]->llr[0],(nb_symb_sch-1)*50*12+50*6,1,0);
*/
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
@@ -1967,13 +1974,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
// do procedures for C-RNTI
- if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->active == 1) {
+ if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
- LOG_D(PHY, "DLSCH data reception at nr_tti_rx: %d \n \n", nr_tti_rx);
+ LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d \n \n", nr_slot_rx);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
#if UE_TIMING_TRACE
- start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
+ start_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
#endif
if (ret_pdsch >= 0)
@@ -1981,26 +1988,26 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
proc,
gNB_id,
PDSCH,
- ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0],
- ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][1],
+ ue->dlsch[proc->thread_id][gNB_id][0],
+ ue->dlsch[proc->thread_id][gNB_id][1],
&ue->dlsch_errors[gNB_id],
mode);
#if UE_TIMING_TRACE
- stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
+ stop_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
#if DISABLE_LOG_X
- printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_tti_rx,ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
- printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_tti_rx,ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
+ printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
+ printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
#else
- LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_tti_rx,ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
- LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_tti_rx,ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
#endif
#endif
// deactivate dlsch once dlsch proc is done
- ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->active = 0;
+ ue->dlsch[proc->thread_id][gNB_id][0]->active = 0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
@@ -2011,20 +2018,20 @@ start_meas(&ue->generic_stat);
#if 0
- if(nr_tti_rx==5 && ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->current_harq_pid]->nb_rb > 20){
+ if(nr_slot_rx==5 && ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid]->nb_rb > 20){
//write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
- //write_output("llr.m","llr", &ue->pdsch_vars[gNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
+ //write_output("llr.m","llr", &ue->pdsch_vars[proc->thread_id][gNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
- write_output("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
+ write_output("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
//write_output("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
//write_output("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
- write_output("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[0][0][0],14*fp->ofdm_symbol_size,1,1);
- write_output("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->dl_ch_estimates_ext[0][0],14*fp->N_RB_DL*12,1,1);
- write_output("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->rxdataF_comp0[0][0],14*fp->N_RB_DL*12,1,1);
- //write_output("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->dl_ch_mag0[0][0],14*fp->N_RB_DL*12,1,1);
- //write_output("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->dl_ch_magb0[0][0],14*fp->N_RB_DL*12,1,1);
+ write_output("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].dl_ch_estimates[0][0][0],14*fp->ofdm_symbol_size,1,1);
+ write_output("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates_ext[0][0],14*fp->N_RB_DL*12,1,1);
+ write_output("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_comp0[0][0],14*fp->N_RB_DL*12,1,1);
+ //write_output("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_mag0[0][0],14*fp->N_RB_DL*12,1,1);
+ //write_output("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_magb0[0][0],14*fp->N_RB_DL*12,1,1);
AssertFatal (0,"");
}
@@ -2032,14 +2039,14 @@ start_meas(&ue->generic_stat);
// duplicate harq structure
/*
- uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->current_harq_pid;
- NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->harq_processes[current_harq_pid];
+ uint8_t current_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
+ NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[current_harq_pid];
NR_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
NR_DL_UE_HARQ_t *harq_processes_dest1 = ue->dlsch[next2_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
*/
- /*nr_harq_status_t *current_harq_ack = &ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->harq_ack[nr_tti_rx];
- nr_harq_status_t *harq_ack_dest = &ue->dlsch[next1_thread_id][gNB_id][0]->harq_ack[nr_tti_rx];
- nr_harq_status_t *harq_ack_dest1 = &ue->dlsch[next2_thread_id][gNB_id][0]->harq_ack[nr_tti_rx];
+ /*nr_harq_status_t *current_harq_ack = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
+ nr_harq_status_t *harq_ack_dest = &ue->dlsch[next1_thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
+ nr_harq_status_t *harq_ack_dest1 = &ue->dlsch[next2_thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
*/
//copy_harq_proc_struct(harq_processes_dest, current_harq_processes);
@@ -2048,7 +2055,7 @@ start_meas(&ue->generic_stat);
//copy_harq_proc_struct(harq_processes_dest1, current_harq_processes);
//copy_ack_struct(harq_ack_dest1, current_harq_ack);
-if (nr_tti_rx==9) {
+if (nr_slot_rx==9) {
if (frame_rx % 10 == 0) {
if ((ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]) != 0)
ue->dlsch_fer[gNB_id] = (100*(ue->dlsch_errors[gNB_id] - ue->dlsch_errors_last[gNB_id]))/(ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]);
@@ -2085,17 +2092,17 @@ phy_procedures_emos_UE_RX(ue,slot,gNB_id);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
-stop_meas(&ue->phy_proc_rx[ue->current_thread_id[nr_tti_rx]]);
+stop_meas(&ue->phy_proc_rx[proc->thread_id]);
#if DISABLE_LOG_X
-printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_tti_rx,ue->phy_proc_rx[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
+printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
#else
-LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_tti_rx,ue->phy_proc_rx[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
+LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
#endif
#endif
//#endif //pdsch
-LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
+LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_slot_rx);
return (0);
}
@@ -2104,7 +2111,7 @@ uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
uint8_t gNB_id)
{
- int subframe = proc->subframe_tx;
+ int subframe = proc->nr_slot_tx / ue->frame_parms.slots_per_subframe;
int frame = proc->frame_tx;
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[gNB_id].CQI_ReportPeriodic;
@@ -2126,7 +2133,7 @@ uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
uint8_t gNB_id)
{
- int subframe = proc->subframe_tx;
+ int subframe = proc->nr_slot_tx / ue->frame_parms.slots_per_subframe;
int frame = proc->frame_tx;
CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[gNB_id].CQI_ReportPeriodic;
int log2Mri = cqirep->ri_ConfigIndex/161;
@@ -2150,7 +2157,7 @@ uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,
// - power control as per 38.213 ch 7.4
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, runmode_t runmode) {
- int frame_tx = proc->frame_tx, nr_tti_tx = proc->nr_tti_tx, prach_power; // tx_amp
+ int frame_tx = proc->frame_tx, nr_slot_tx = proc->nr_slot_tx, prach_power; // tx_amp
uint16_t /*preamble_tx = 50,*/ pathloss;
uint8_t mod_id = ue->Mod_id;
UE_MODE_t UE_mode = get_nrUE_mode(mod_id, ue->CC_id, gNB_id);
@@ -2173,14 +2180,14 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
} else {
// ask L2 for RACH transport
if ((runmode != rx_calib_ue) && (runmode != rx_calib_ue_med) && (runmode != rx_calib_ue_byp) && (runmode != no_L2_connect) ) {
- LOG_D(PHY, "Getting PRACH resources. Frame %d Slot %d \n", frame_tx, nr_tti_tx);
+ LOG_D(PHY, "Getting PRACH resources. Frame %d Slot %d \n", frame_tx, nr_slot_tx);
// flush Msg3 Buffer
if (prach_resources->Msg3 == NULL){
for(int i = 0; iulsch_Msg3_active[i] = 0;
}
}
- nr_prach = nr_ue_get_rach(ue->prach_resources[gNB_id], &ue->prach_vars[0]->prach_pdu, mod_id, ue->CC_id, UE_mode, frame_tx, gNB_id, nr_tti_tx);
+ nr_prach = nr_ue_get_rach(ue->prach_resources[gNB_id], &ue->prach_vars[0]->prach_pdu, mod_id, ue->CC_id, UE_mode, frame_tx, gNB_id, nr_slot_tx);
}
}
@@ -2190,24 +2197,24 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
LOG_D(PHY,"runmode %d\n",runmode);
if ((ue->mac_enabled == 1) && (runmode != calib_prach_tx)) {
- ue->tx_power_dBm[nr_tti_tx] = prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER + pathloss;
+ ue->tx_power_dBm[nr_slot_tx] = prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER + pathloss;
}
- LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_tx %d : Generating PRACH, preamble %d, PL %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x\n",
+ LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_slot_tx %d : Generating PRACH, preamble %d, PL %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x\n",
ue->Mod_id,
frame_tx,
- nr_tti_tx,
+ nr_slot_tx,
prach_resources->ra_PreambleIndex,
pathloss,
- ue->tx_power_dBm[nr_tti_tx],
+ ue->tx_power_dBm[nr_slot_tx],
prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER,
prach_resources->ra_RNTI);
- //ue->tx_total_RE[nr_tti_tx] = 96; // todo
+ //ue->tx_total_RE[nr_slot_tx] = 96; // todo
ue->prach_vars[gNB_id]->amp = AMP;
/* #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
- tx_amp = get_tx_amp_prach(ue->tx_power_dBm[nr_tti_tx], ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL);
+ tx_amp = get_tx_amp_prach(ue->tx_power_dBm[nr_slot_tx], ue->tx_power_max_dBm, ue->frame_parms.N_RB_UL);
if (tx_amp != -1)
ue->prach_vars[gNB_id]->amp = tx_amp;
#else
@@ -2215,38 +2222,38 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
#endif */
if ((runmode == calib_prach_tx) && (((proc->frame_tx&0xfffe)%100)==0))
- LOG_D(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_tx %d : PRACH TX power %d dBm, amp %d\n", ue->Mod_id,
+ LOG_D(PHY,"[UE %d][RAPROC] Frame %d, nr_slot_tx %d : PRACH TX power %d dBm, amp %d\n", ue->Mod_id,
proc->frame_rx,
- proc->nr_tti_tx,
- ue->tx_power_dBm[nr_tti_tx],
+ proc->nr_slot_tx,
+ ue->tx_power_dBm[nr_slot_tx],
ue->prach_vars[gNB_id]->amp);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
- prach_power = generate_nr_prach(ue, gNB_id, nr_tti_tx);
+ prach_power = generate_nr_prach(ue, gNB_id, nr_slot_tx);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
ue->Mod_id,
pathloss,
- ue->tx_power_dBm[nr_tti_tx],
+ ue->tx_power_dBm[nr_slot_tx],
dB_fixed(prach_power),
ue->prach_vars[gNB_id]->amp);
if (ue->mac_enabled == 1)
nr_Msg1_transmitted(ue->Mod_id, ue->CC_id, frame_tx, gNB_id);
- LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_tx %d: Generated PRACH Msg1 (gNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB) \n",
+ LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_slot_tx %d: Generated PRACH Msg1 (gNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB) \n",
ue->Mod_id,
frame_tx,
- nr_tti_tx,
+ nr_slot_tx,
gNB_id,
prach_resources->ra_PreambleIndex,
- ue->tx_power_dBm[nr_tti_tx],
+ ue->tx_power_dBm[nr_slot_tx],
pathloss);
- LOG_D(PHY,"[UE %d] frame %d nr_tti_tx %d : prach_cnt %d\n", ue->Mod_id, frame_tx, nr_tti_tx, ue->prach_cnt);
+ LOG_D(PHY,"[UE %d] frame %d nr_slot_tx %d : prach_cnt %d\n", ue->Mod_id, frame_tx, nr_slot_tx, ue->prach_cnt);
ue->prach_cnt++;
diff --git a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
index b1deb9191b..e2e2143287 100644
--- a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
@@ -97,7 +97,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
G_b_f_c = 0;
}
else {
- G_b_f_c = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][gNB_id][0]->g_pucch;
+ G_b_f_c = ue->dlsch[proc->thread_id][gNB_id][0]->g_pucch;
LOG_W(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
return (PUCCH_POWER_DEFAULT);
}
@@ -169,7 +169,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
//int K_PUCCH = 0;
if (O_ACK != 0) {
/* it assumes that PDCCH is in the first symbol of receive slot FFS TDDO NR */
- //int slots_gap = (proc->nr_tti_tx > proc->nr_tti_rx ? (proc->nr_tti_tx - proc->nr_tti_rx - 1) : ((proc->nr_tti_tx + ue->frame_parms.slots_per_subframe) - proc->nr_tti_rx - 1));
+ //int slots_gap = (proc->nr_slot_tx > proc->nr_slot_rx ? (proc->nr_slot_tx - proc->nr_slot_rx - 1) : ((proc->nr_slot_tx + ue->frame_parms.slots_per_subframe) - proc->nr_slot_rx - 1));
//K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
}
else {
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index a4ff68dd86..6b1e9f62de 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -99,7 +99,7 @@ void nr_generate_pucch0(int32_t **txdataF,
NR_DL_FRAME_PARMS *frame_parms,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t mcs,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
@@ -110,7 +110,7 @@ void nr_generate_pucch1(int32_t **txdataF,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint16_t startingPRB,
@@ -123,7 +123,7 @@ void nr_generate_pucch2(int32_t **txdataF,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint8_t nrofPRB,
@@ -136,7 +136,7 @@ void nr_generate_pucch3_4(int32_t **txdataF,
PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
uint64_t payload,
int16_t amp,
- int nr_tti_tx,
+ int nr_slot_tx,
uint8_t nrofSymbols,
uint8_t startingSymbolIndex,
uint8_t nrofPRB,
@@ -210,7 +210,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
uint64_t pucch_payload = 0;
uint32_t csi_payload = 0;
int frame_tx = proc->frame_tx;
- int nr_tti_tx = proc->nr_tti_tx;
+ int nr_slot_tx = proc->nr_slot_tx;
int Mod_id = ue->Mod_id;
int CC_id = ue->CC_id;
@@ -241,15 +241,15 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
int subframe_number = proc->nr_slot_rx / ue->frame_parms.slots_per_subframe;
nb_pucch_format_4_in_subframes[subframe_number] = 0; /* reset pucch format 4 counter at current rx position */
- int dl_harq_pid = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid;
+ int dl_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
- if (dl_harq_pid < ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->number_harq_processes_for_pdsch) {
+ if (dl_harq_pid < ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch) {
/* pucch indicator can be reseted in function get_downlink_ack so it should be get now */
- pucch_resource_indicator = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
+ pucch_resource_indicator = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
}
/* Part - I
- * Collect feedback that should be transmitted at this nr_tti_tx :
+ * Collect feedback that should be transmitted at this nr_slot_tx :
* - ACK/NACK, SR, CSI (CQI, RI, ...)
*/
@@ -261,11 +261,11 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
/* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
sr_payload = nr_ue_get_SR(Mod_id,
- CC_id,
- frame_tx,
- gNB_id,
- 0,//ue->pdcch_vars[ue->current_thread_id[proc->nr_tti_rx]][gNB_id]->crnti,
- nr_tti_tx); // nr_tti_rx used for meas gap
+ CC_id,
+ frame_tx,
+ gNB_id,
+ 0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
+ nr_slot_tx); // nr_slot_rx used for meas gap
}
else {
sr_payload = 1;
@@ -287,7 +287,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
uint16_t report_slot_csi =csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
- if (report_slot_csi == proc->nr_tti_tx)
+ if (report_slot_csi == proc->nr_slot_tx)
csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
else
csi_status = 0;
@@ -301,8 +301,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
if(O_ACK == 0) {
N_UCI = O_SR + O_CSI;
if ((N_UCI == 0) || ((O_CSI == 0) && (sr_payload == 0))) { /* TS 38.213 9.2.4 UE procedure for reporting SR */
- NR_TST_PHY_PRINTF("PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
- LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
+ NR_TST_PHY_PRINTF("PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
+ LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
return (FALSE);
}
else {
@@ -354,7 +354,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
int occ_length = 0;
int occ_Index = 0;
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack;
if (select_pucch_resource(ue, mac, gNB_id, N_UCI, pucch_resource_indicator, &initial_pucch_id, &pucch_resource_set,
&pucch_resource_id, harq_status) == TRUE) {
@@ -389,7 +389,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
if ((ue->UE_mode[gNB_id] != PUSCH) && (O_ACK > 1)) {
O_ACK = 1;
pucch_ack_payload &= 0x1; /* take only first ack */
- LOG_W(PHY,"PUCCH ue is not expected to generate more than one HARQ-ACK at AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
+ LOG_W(PHY,"PUCCH ue is not expected to generate more than one HARQ-ACK at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
}
NR_TST_PHY_PRINTF("PUCCH common configuration with index %d \n", initial_pucch_id);
}
@@ -442,7 +442,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
}
}
else {
- LOG_W(PHY,"PUCCH No PUCCH resource found at AbsSubframe %d.%d \n", frame_tx%1024, nr_tti_tx);
+ LOG_W(PHY,"PUCCH No PUCCH resource found at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
return (FALSE);
}
@@ -490,7 +490,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
//}
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
nb_of_prbs = 1;
- subframe_number = nr_tti_tx / ue->frame_parms.slots_per_subframe;
+ subframe_number = nr_slot_tx / ue->frame_parms.slots_per_subframe;
nb_pucch_format_4_in_subframes[subframe_number]++; /* increment number of transmit pucch 4 in current subframe */
NR_TST_PHY_PRINTF("PUCCH Number of pucch format 4 in subframe %d is %d \n", subframe_number, nb_pucch_format_4_in_subframes[subframe_number]);
N_sc_ctrl_RB = N_SC_RB/(nb_pucch_format_4_in_subframes[subframe_number]);
@@ -595,7 +595,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
pucch_payload = pucch_payload | (csi_payload << (O_ACK + O_SR)) | (sr_payload << O_ACK) | pucch_ack_payload;
NR_TST_PHY_PRINTF("PUCCH ( AbsSubframe : %d.%d ) ( total payload size %d data 0x%02x ) ( ack length %d data 0x%02x ) ( sr length %d value %d ) ( csi length %d data : 0x%02x ) \n",
- frame_tx%1024, nr_tti_tx, N_UCI, pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
+ frame_tx%1024, nr_slot_tx, N_UCI, pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols total: %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols_total, nb_symbols, max_code_rate, starting_symbol_index);
@@ -612,8 +612,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
O_CRC, n_HARQ_ACK);
/* set tx power */
- ue->tx_power_dBm[nr_tti_tx] = pucch_tx_power;
- ue->tx_total_RE[nr_tti_tx] = nb_of_prbs*N_SC_RB;
+ ue->tx_power_dBm[nr_slot_tx] = pucch_tx_power;
+ ue->tx_total_RE[nr_slot_tx] = nb_of_prbs*N_SC_RB;
int tx_amp;
@@ -635,7 +635,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->pucch_GroupHopping,
mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->hoppingId[0],
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
(uint8_t)m_0,
(uint8_t)m_CS,
nb_symbols_total,
@@ -650,7 +650,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
&ue->pucch_config_dedicated[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
(uint8_t)m_0,
nb_symbols_total,
starting_symbol_index,
@@ -671,7 +671,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
&ue->pucch_config_dedicated[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
nb_symbols_total,
starting_symbol_index,
nb_of_prbs,
@@ -683,14 +683,14 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
case pucch_format4_nr:
{
nr_generate_pucch3_4(ue,
- 0,//ue->pdcch_vars[ue->current_thread_id[proc->nr_tti_rx]][gNB_id]->crnti,
+ 0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
ue->common_vars.txdataF,
&ue->frame_parms,
format,
&ue->pucch_config_dedicated[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
nb_symbols_total,
starting_symbol_index,
nb_of_prbs,
@@ -743,7 +743,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t
int number_harq_feedback = 0;
uint32_t dai_current = 0;
uint32_t dai_max = 0;
- int number_pid_dl = ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->number_harq_processes_for_pdsch;
+ int number_pid_dl = ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch;
bool two_transport_blocks = FALSE;
int number_of_code_word = 1;
int U_DAI_c = 0;
@@ -776,7 +776,7 @@ uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t
harq_status = &ue->dlsch[thread_idx][gNB_id][code_word]->harq_processes[dl_harq_pid]->harq_ack;
/* check if current tx slot should transmit downlink acknowlegment */
- if (harq_status->slot_for_feedback_ack == proc->nr_tti_tx) {
+ if (harq_status->slot_for_feedback_ack == proc->nr_slot_tx) {
if (harq_status->ack == DL_ACKNACK_NO_SET) {
LOG_E(PHY,"PUCCH Downlink acknowledgment has not been set : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
@@ -1008,6 +1008,12 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
if (resource_set_found == TRUE) {
if (pucch_resource_indicator < MAX_PUCCH_RESOURCE_INDICATOR) {
+ // Verify that the value of pucch_resource_indicator is valid
+ if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.count <= pucch_resource_indicator)
+ {
+ LOG_E(PHY, "Value of pucch_resource_indicator is out of bounds! Possibly due to a false DCI. \n");
+ return (FALSE);
+ }
/* check if resource indexing by pucch_resource_indicator of this set is compatible */
if ((ready_pucch_resource_id == TRUE) || (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0] != MAX_NB_OF_PUCCH_RESOURCES)) {
@@ -1124,7 +1130,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
break;
}
else {
- pucch_resource_set_id = 1;
+ pucch_resource_set_id = 1;
return (pucch_resource_set_id);
break;
}
@@ -1278,7 +1284,7 @@ int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_n
}
int16_t N_slot_frame = ue->frame_parms.slots_per_frame;
- if (((proc->frame_tx * N_slot_frame) + proc->nr_tti_tx - SR_offset)%SR_periodicity == 0) {
+ if (((proc->frame_tx * N_slot_frame) + proc->nr_slot_tx - SR_offset)%SR_periodicity == 0) {
return (1);
}
else {
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 957495181a..c60bc8dd9f 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -52,6 +52,7 @@
PHY_VARS_gNB *gNB;
PHY_VARS_NR_UE *UE;
RAN_CONTEXT_t RC;
+UE_nr_rxtx_proc_t proc;
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
double cpuf;
@@ -559,7 +560,7 @@ int main(int argc, char **argv)
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_IN);
- ret = nr_dlsch_decoding(UE, channel_output_fixed, &UE->frame_parms,
+ ret = nr_dlsch_decoding(UE, &proc, 0, channel_output_fixed, &UE->frame_parms,
dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch,
slot,harq_pid, is_crnti, llr8_flag);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index f311e0eefa..2bd70021f7 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -61,7 +61,7 @@
#include "openair1/SIMULATION/TOOLS/sim.h"
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
//#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c"
-
+#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "NR_RRCReconfiguration.h"
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
#include "SIMULATION/LTE_PHY/common_sim.h"
@@ -148,7 +148,8 @@ int is_x2ap_enabled(void)
// needed for some functions
openair0_config_t openair0_cfg[MAX_CARDS];
-
+void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSize, uint8_t *mcsIndex,int8_t *ptrs_arg);
+void update_dmrs_config(NR_CellGroupConfig_t *scg,PHY_VARS_NR_UE *ue, int8_t* dmrs_arg);
/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs from command line of
dlsim, does not search for CCE/PUCCH occasion but simply sets to 0 */
@@ -255,6 +256,19 @@ int main(int argc, char **argv)
int css_flag=0;
cpuf = get_cpu_freq_GHz();
+ int8_t enable_ptrs = 0;
+ int8_t modify_dmrs = 0;
+
+ int8_t dmrs_arg[2] = {-1,-1};// Invalid values
+ /* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */
+ int8_t ptrs_arg[2] = {-1,-1};// Invalid values
+
+ uint16_t ptrsRePerSymb = 0;
+ uint16_t pdu_bit_map = 0x0;
+ uint16_t dlPtrsSymPos = 0;
+ uint16_t ptrsSymbPerSlot = 0;
+ uint16_t rbSize = 106;
+ uint8_t mcsIndex = 9;
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
@@ -266,7 +280,7 @@ int main(int argc, char **argv)
FILE *scg_fd=NULL;
- while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:e:m:w")) != -1) {
+ while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:e:m:w:T:U:")) != -1) {
switch (c) {
case 'f':
scg_fd = fopen(optarg,"r");
@@ -450,6 +464,20 @@ int main(int argc, char **argv)
output_fd = fopen("txdata.dat", "w+");
break;
+ case 'T':
+ enable_ptrs=1;
+ for(i=0; i < atoi(optarg); i++) {
+ ptrs_arg[i] = atoi(argv[optind++]);
+ }
+ break;
+
+ case 'U':
+ modify_dmrs = 1;
+ for(i=0; i < atoi(optarg); i++) {
+ dmrs_arg[i] = atoi(argv[optind++]);
+ }
+ break;
+
default:
case 'h':
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
@@ -480,6 +508,8 @@ int main(int argc, char **argv)
printf("-j Number of symbols for PDSCH (fixed for now)\n");
printf("-e MSC index\n");
printf("-t Acceptable effective throughput (in percentage)\n");
+ printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
+ printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2}, e.g. -U 2 0 2 \n");
printf("-P Print DLSCH performances\n");
printf("-w Write txdata to binary file (one frame)\n");
exit (-1);
@@ -490,6 +520,8 @@ int main(int argc, char **argv)
logInit();
set_glog(loglvl);
T_stdout = 1;
+ /* initialize the sin table */
+ InitSinLUT();
get_softmodem_params()->phy_test = 1;
@@ -578,7 +610,17 @@ int main(int argc, char **argv)
n_tx,
0);
- xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
+ /* -U option modify DMRS */
+ if(modify_dmrs) {
+ update_dmrs_config(secondaryCellGroup, NULL,dmrs_arg);
+ }
+ /* -T option enable PTRS */
+ if(enable_ptrs) {
+ update_ptrs_config(secondaryCellGroup, &rbSize, &mcsIndex, ptrs_arg);
+ }
+
+
+ //xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
@@ -686,7 +728,6 @@ int main(int argc, char **argv)
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
UE->perfect_ce = 0;
- for (i=0;i<10;i++) UE->current_thread_id[i] = 0;
if (init_nr_ue_signal(UE, 1, 0) != 0)
{
@@ -694,6 +735,9 @@ int main(int argc, char **argv)
exit(-1);
}
+ if(modify_dmrs) {
+ update_dmrs_config( NULL,UE,dmrs_arg);
+ }
init_nr_ue_transport(UE,0);
nr_gold_pbch(UE);
@@ -748,7 +792,7 @@ int main(int argc, char **argv)
scheduled_response.CC_id = 0;
scheduled_response.frame = frame;
scheduled_response.slot = slot;
-
+ scheduled_response.thread_id = UE_proc.thread_id;
nr_ue_phy_config_request(&UE_mac->phy_config);
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
@@ -787,14 +831,14 @@ int main(int argc, char **argv)
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
UE->rx_offset=0;
- UE_proc.frame_rx = frame;
- UE_proc.nr_tti_rx= slot;
- UE_proc.subframe_rx = slot;
+ UE_proc.thread_id = 0;
+ UE_proc.frame_rx = frame;
+ UE_proc.nr_slot_rx = slot;
dcireq.frame = frame;
dcireq.slot = slot;
- NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE->current_thread_id[UE_proc.nr_tti_rx]][0][0];
+ NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE_proc.thread_id][0][0];
int harq_pid = slot;
NR_DL_UE_HARQ_t *UE_harq_process = dlsch0->harq_processes[harq_pid];
@@ -838,7 +882,22 @@ int main(int argc, char **argv)
Sched_INFO.UL_dci_req = NULL;
Sched_INFO.TX_req = &gNB_mac->TX_req[0];
nr_schedule_response(&Sched_INFO);
-
+
+ /* PTRS values for DLSIM calculations */
+ nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[Sched_INFO.CC_id].dl_tti_request_body;
+ nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[1];
+ nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15;
+ pdu_bit_map = pdsch_pdu_rel15->pduBitmap;
+ if(pdu_bit_map & 0x1) {
+ set_ptrs_symb_idx(&dlPtrsSymPos,
+ pdsch_pdu_rel15->NrOfSymbols,
+ pdsch_pdu_rel15->StartSymbolIndex,
+ 1<PTRSTimeDensity,
+ pdsch_pdu_rel15->dlDmrsSymbPos);
+ ptrsSymbPerSlot = get_ptrs_symbols_in_slot(dlPtrsSymPos, pdsch_pdu_rel15->StartSymbolIndex, pdsch_pdu_rel15->NrOfSymbols);
+ ptrsRePerSymb = ((rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity);
+ printf("[DLSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
+ }
if (run_initial_sync)
nr_common_signal_procedures(gNB,frame,slot);
else
@@ -895,7 +954,7 @@ int main(int argc, char **argv)
r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
}
}
-
+ double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
//AWGN
sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
sigma2 = pow(10, sigma2_dB/10);
@@ -908,6 +967,11 @@ int main(int argc, char **argv)
for (aa=0; aanb_antennas_rx; aa++) {
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+ /* Add phase noise if enabled */
+ if (pdu_bit_map & 0x1) {
+ phase_noise(ts, &((short*) UE->common_vars.rxdata[aa])[2*i],
+ &((short*) UE->common_vars.rxdata[aa])[2*i+1]);
+ }
}
}
@@ -926,22 +990,26 @@ int main(int argc, char **argv)
//----------------------------------------------------------
//---------------------- count errors ----------------------
//----------------------------------------------------------
-
- if (UE->dlsch[UE->current_thread_id[slot]][0][0]->last_iteration_cnt >=
- UE->dlsch[UE->current_thread_id[slot]][0][0]->max_ldpc_iterations+1)
+
+ if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >=
+ UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1)
n_errors++;
-
- NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]];
+
+ NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id];
int16_t *UE_llr = pdsch_vars[0]->llr[0];
-
+
TBS = UE_harq_process->TBS;//rel15->TBSize[0];
- uint16_t length_dmrs = 1;
+ uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos);
uint16_t nb_rb = rel15->rbSize;
uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
uint8_t mod_order = rel15->qamModOrder[0];
uint8_t nb_symb_sch = rel15->NrOfSymbols;
-
+
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
+ if(pdu_bit_map & 0x1) {
+ available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
+ printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
+ }
for (i = 0; i < available_bits; i++) {
@@ -993,7 +1061,7 @@ int main(int argc, char **argv)
printf("*****************************************\n");
printf("\n");
dump_pdsch_stats(gNB);
- printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %d bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],(double)errors_scrambling/available_bits/n_trials,effRate,effRate/TBS*100,TBS);
+ printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],(double)errors_scrambling/available_bits/n_trials,effRate,effRate/TBS*100,TBS);
printf("\n");
if (print_perf==1) {
@@ -1030,9 +1098,9 @@ int main(int argc, char **argv)
printStatIndent(&UE->dlsch_unscrambling_stats,"DLSCH unscrambling time");
printStatIndent(&UE->dlsch_rate_unmatching_stats,"DLSCH Rate Unmatching");
printf("|__ DLSCH Turbo Decoding(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)\n",
- UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus ?
- UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus :
- UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus,
+ UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Cminus ?
+ UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Kminus :
+ UE->dlsch[UE_proc.thread_id][0][0]->harq_processes[0]->Kplus,
UE->dlsch_tc_intl1_stats.trials/(double)UE->dlsch_tc_init_stats.trials,
(double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials*timeBase,
(int)((double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials),
@@ -1054,7 +1122,7 @@ int main(int argc, char **argv)
LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
- LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]][0]->llr[0],available_bits,1,0);
+ LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
break;
}
@@ -1103,3 +1171,79 @@ int main(int argc, char **argv)
return(n_errors);
}
+
+
+void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSize, uint8_t *mcsIndex, int8_t *ptrs_arg)
+{
+ NR_BWP_Downlink_t *bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0];
+ int *ptrsFreqDenst = calloc(2, sizeof(long));
+ ptrsFreqDenst[0]= 25;
+ ptrsFreqDenst[1]= 115;
+ int *ptrsTimeDenst = calloc(3, sizeof(long));
+ ptrsTimeDenst[0]= 2;
+ ptrsTimeDenst[1]= 4;
+ ptrsTimeDenst[2]= 10;
+
+ int epre_Ratio = 0;
+ int reOffset = 0;
+
+ if(ptrs_arg[0] ==0) {
+ ptrsTimeDenst[2]= *mcsIndex -1;
+ }
+ else if(ptrs_arg[0] == 1) {
+ ptrsTimeDenst[1]= *mcsIndex - 1;
+ ptrsTimeDenst[2]= *mcsIndex + 1;
+ }
+ else if(ptrs_arg[0] ==2) {
+ ptrsTimeDenst[0]= *mcsIndex - 1;
+ ptrsTimeDenst[1]= *mcsIndex + 1;
+ }
+ else {
+ printf("[DLSIM] Wrong L_PTRS value, using default values 1\n");
+ }
+ /* L = 4 if Imcs < MCS4 */
+ if(ptrs_arg[1] ==2) {
+ ptrsFreqDenst[0]= *rbSize - 1;
+ ptrsFreqDenst[1]= *rbSize + 1;
+ }
+ else if(ptrs_arg[1] == 4) {
+ ptrsFreqDenst[1]= *rbSize - 1;
+ }
+ else {
+ printf("[DLSIM] Wrong K_PTRS value, using default values 2\n");
+ }
+ printf("[DLSIM] PTRS Enabled with L %d, K %d \n", 1<= 0 && dmrs_arg[1] <3 ) {
+ add_pos = dmrs_arg[1];
+ }
+
+ if(scg != NULL) {
+ NR_BWP_Downlink_t *bwp = scg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0];
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = add_pos;
+ for (int i=0;ibwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count;i++) {
+ bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->mappingType = mapping_type;
+ }
+ }
+ if(ue != NULL) {
+ for (int i=0;iPDSCH_Config.pdsch_TimeDomainResourceAllocation[i]->mappingType = mapping_type;
+ }
+ ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition = add_pos;
+ }
+ printf("[DLSIM] DMRS Config is modified with Mapping Type %d, Additional Positions %d \n", dmrs_arg[0], dmrs_arg[1] );
+}
diff --git a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
index 7a465e0ea3..a7150fb2f9 100644
--- a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
+++ b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
@@ -235,8 +235,8 @@ void fill_scc(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_RB_DL
void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap);
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
-s1ap_eNB_config_t s1ap_config;
-uint32_t s1ap_generate_eNB_id(void) {return 0;}
+ngap_gNB_config_t ngap_config;
+uint32_t ngap_generate_gNB_id(void) {return 0;}
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { return;}
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) { return;}
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 0166add2cd..2a7c51a582 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -680,6 +680,7 @@ int main(int argc, char **argv)
if (ret<0) n_errors++;
}
else {
+ UE_nr_rxtx_proc_t proc={0};
UE->rx_offset=0;
uint8_t ssb_index = 0;
while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb
@@ -688,16 +689,16 @@ int main(int argc, char **argv)
int ssb_slot = (ssb_index>>1)+(n_hf*frame_parms->slots_per_frame);
for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) {
- nr_slot_fep(UE,
- i%frame_parms->symbols_per_slot,
- ssb_slot,
- 0,
- 0);
+ nr_slot_fep(UE,
+ &proc,
+ i%frame_parms->symbols_per_slot,
+ ssb_slot,
+ 0,
+ 0);
- nr_pbch_channel_estimation(UE,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
+ nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
}
- UE_nr_rxtx_proc_t proc={0};
ret = nr_rx_pbch(UE,
&proc,
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index e91c0425ae..1f4db3138a 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -116,10 +116,10 @@ int main(int argc, char **argv){
int i, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
- uint8_t frame = 1, subframe = 9, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
+ uint8_t frame = 1, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
uint32_t tx_lev = 10000, prach_errors = 0; //,tx_lev_dB;
- uint64_t SSB_positions = 0x01, absoluteFrequencyPointA = 640000;
+ uint64_t SSB_positions = 0x01;
uint16_t RA_sfn_index;
uint8_t N_RA_slot;
uint8_t config_period;
@@ -408,17 +408,14 @@ int main(int argc, char **argv){
frame_parms->N_RB_UL = N_RB_UL;
frame_parms->threequarter_fs = threequarter_fs;
frame_parms->frame_type = TDD;
- frame_parms->freq_range = nr_FR1;
+ frame_parms->freq_range = (mu==1 ? nr_FR1 : nr_FR2);
frame_parms->numerology_index = mu;
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
- absoluteFrequencyPointA = to_nrarfcn(frame_parms->nr_band,
- frame_parms->dl_CarrierFreq,
- frame_parms->numerology_index,
- frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
+ uint64_t absoluteFrequencyPointA = (mu==1 ? 640000 : 2070833);
- subframe = slot/frame_parms->slots_per_subframe;
+ uint8_t subframe = slot/frame_parms->slots_per_subframe;
if (config_index<67 && mu==1) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139;
@@ -642,8 +639,8 @@ int main(int argc, char **argv){
subframe); */ //commented for testing purpose
UE_nr_rxtx_proc_t proc={0};
- proc.frame_tx = frame;
- proc.nr_tti_tx = slot;
+ proc.frame_tx = frame;
+ proc.nr_slot_tx = slot;
nr_ue_prach_procedures(UE,&proc,0,0);
/* tx_lev_dB not used later, no need to set */
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index c14a3d7198..a96a62f656 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -90,7 +90,7 @@ int main(int argc, char **argv)
FILE *input_fd=NULL;
//uint8_t nacktoack_flag=0;
int16_t amp=0x7FFF;
- int nr_tti_tx=0;
+ int nr_slot_tx=0;
uint64_t actual_payload=0,payload_received;
int nr_bit=1; // maximum value possible is 2
uint8_t m0=0;// higher layer paramater initial cyclic shift
@@ -501,13 +501,13 @@ int main(int argc, char **argv)
for (trial=0; trialofdm_symbol_size*sizeof(int));
if(format==0){
- nr_generate_pucch0(UE,txdataF,frame_parms,PUCCH_GroupHopping,hopping_id,amp,nr_tti_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB);
+ nr_generate_pucch0(UE,txdataF,frame_parms,PUCCH_GroupHopping,hopping_id,amp,nr_slot_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB);
}
else if (format == 1){
- nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
+ nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
}
else {
- nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
+ nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
}
int txlev = signal_energy(&txdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
@@ -536,21 +536,21 @@ int main(int argc, char **argv)
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
if(format==0){
- nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
- nfapi_nr_pucch_pdu_t pucch_pdu;
- pucch_pdu.subcarrier_spacing = 1;
- pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
- pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
- pucch_pdu.bit_len_harq = nr_bit;
- pucch_pdu.bit_len_csi_part1 = 0;
- pucch_pdu.bit_len_csi_part2 = 0;
- pucch_pdu.sr_flag = sr_flag;
- pucch_pdu.nr_of_symbols = nrofSymbols;
- pucch_pdu.hopping_id = hopping_id;
- pucch_pdu.initial_cyclic_shift = 0;
- pucch_pdu.start_symbol_index = startingSymbolIndex;
- pucch_pdu.prb_start = startingPRB;
- nr_decode_pucch0(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
+ nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
+ nfapi_nr_pucch_pdu_t pucch_pdu;
+ pucch_pdu.subcarrier_spacing = 1;
+ pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
+ pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
+ pucch_pdu.bit_len_harq = nr_bit;
+ pucch_pdu.bit_len_csi_part1 = 0;
+ pucch_pdu.bit_len_csi_part2 = 0;
+ pucch_pdu.sr_flag = sr_flag;
+ pucch_pdu.nr_of_symbols = nrofSymbols;
+ pucch_pdu.hopping_id = hopping_id;
+ pucch_pdu.initial_cyclic_shift = 0;
+ pucch_pdu.start_symbol_index = startingSymbolIndex;
+ pucch_pdu.prb_start = startingPRB;
+ nr_decode_pucch0(gNB,nr_slot_tx,&uci_pdu,&pucch_pdu);
if(sr_flag==1){
if (uci_pdu.sr->sr_indication == 0 || uci_pdu.sr->sr_confidence_level == 1)
sr_errors+=1;
@@ -565,7 +565,7 @@ int main(int argc, char **argv)
}
else if (format==1) {
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,
- &(payload_received),frame_parms,amp,nr_tti_tx,
+ &(payload_received),frame_parms,amp,nr_slot_tx,
m0,nrofSymbols,startingSymbolIndex,startingPRB,
startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
if(nr_bit==1)
@@ -574,34 +574,34 @@ int main(int argc, char **argv)
ack_nack_errors+=((actual_payload^payload_received)&1) + (((actual_payload^payload_received)&2)>>1);
}
else if (format==2) {
- nfapi_nr_uci_pucch_pdu_format_2_3_4_t uci_pdu;
- nfapi_nr_pucch_pdu_t pucch_pdu;
- pucch_pdu.rnti = 0x1234;
- pucch_pdu.subcarrier_spacing = 1;
- pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
- pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
- pucch_pdu.bit_len_csi_part1 = nr_bit;
- pucch_pdu.bit_len_harq = 0;
- pucch_pdu.bit_len_csi_part2 = 0;
- pucch_pdu.sr_flag = 0;
- pucch_pdu.nr_of_symbols = nrofSymbols;
- pucch_pdu.hopping_id = hopping_id;
- pucch_pdu.initial_cyclic_shift = 0;
- pucch_pdu.start_symbol_index = startingSymbolIndex;
- pucch_pdu.prb_size = nrofPRB;
- pucch_pdu.prb_start = startingPRB;
- pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
- pucch_pdu.data_scrambling_id = data_scrambling_id;
- nr_decode_pucch2(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
- int csi_part1_bytes=pucch_pdu.bit_len_csi_part1>>3;
- if ((pucch_pdu.bit_len_csi_part1&7) > 0) csi_part1_bytes++;
- for (int i=0;i>1)&1;
+ pucch_pdu.bit_len_csi_part1 = nr_bit;
+ pucch_pdu.bit_len_harq = 0;
+ pucch_pdu.bit_len_csi_part2 = 0;
+ pucch_pdu.sr_flag = 0;
+ pucch_pdu.nr_of_symbols = nrofSymbols;
+ pucch_pdu.hopping_id = hopping_id;
+ pucch_pdu.initial_cyclic_shift = 0;
+ pucch_pdu.start_symbol_index = startingSymbolIndex;
+ pucch_pdu.prb_size = nrofPRB;
+ pucch_pdu.prb_start = startingPRB;
+ pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
+ pucch_pdu.data_scrambling_id = data_scrambling_id;
+ nr_decode_pucch2(gNB,nr_slot_tx,&uci_pdu,&pucch_pdu);
+ int csi_part1_bytes=pucch_pdu.bit_len_csi_part1>>3;
+ if ((pucch_pdu.bit_len_csi_part1&7) > 0) csi_part1_bytes++;
+ for (int i=0;i>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index d924f7ef34..821ac75a64 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -56,7 +56,7 @@
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "common/utils/threadPool/thread-pool.h"
-
+#include "PHY/NR_REFSIG/ptrs_nr.h"
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
#include "SIMULATION/LTE_PHY/common_sim.h"
@@ -163,8 +163,7 @@ int main(int argc, char **argv)
FILE *input_fd = NULL;
SCM_t channel_model = AWGN; //Rayleigh1_anticorr;
uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
- double tx_gain=1.0;
- double N0=30;
+
NB_UE_INST = 1;
//unsigned char frame_type = 0;
@@ -179,7 +178,6 @@ int main(int argc, char **argv)
int gNB_id = 0;
int ap;
int tx_offset;
- double txlev_float;
int32_t txlev;
int start_rb = 0;
int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)
@@ -199,6 +197,9 @@ int main(int argc, char **argv)
int ptrs_arg[2] = {-1,-1};// Invalid values
/* DMRS TYPE = dmrs_arg[0], Add Pos = dmrs_arg[1] */
int dmrs_arg[2] = {-1,-1};// Invalid values
+ uint16_t ptrsSymPos = 0;
+ uint16_t ptrsSymbPerSlot = 0;
+ uint16_t ptrsRePerSymb = 0;
UE_nr_rxtx_proc_t UE_proc;
FILE *scg_fd=NULL;
@@ -217,6 +218,9 @@ int main(int argc, char **argv)
//logInit();
randominit(0);
+ /* initialize the sin-cos table */
+ InitSinLUT();
+
while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:G:H:M:N:PR:S:T:U:L:")) != -1) {
printf("handling optarg %c\n",c);
switch (c) {
@@ -833,7 +837,8 @@ int main(int argc, char **argv)
gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round;
rv_index = nr_rv_round_map[round];
- UE_proc.nr_tti_tx = slot;
+ UE_proc.thread_id = 0;
+ UE_proc.nr_slot_tx = slot;
UE_proc.frame_tx = frame;
UL_tti_req->SFN = frame;
@@ -904,6 +909,7 @@ int main(int argc, char **argv)
scheduled_response.CC_id = 0;
scheduled_response.frame = frame;
scheduled_response.slot = slot;
+ scheduled_response.thread_id = UE_proc.thread_id;
scheduled_response.dl_config = NULL;
scheduled_response.ul_config = &ul_config;
scheduled_response.tx_request = &tx_req;
@@ -948,8 +954,6 @@ int main(int argc, char **argv)
nr_fill_ulsch(gNB,frame,slot,pusch_pdu);
for (int i=0;i<(TBS/8);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
- double scale = 1;
-
if (input_fd == NULL) {
// set FAPI parameters for UE, put them in the scheduled response and call
@@ -959,7 +963,7 @@ int main(int argc, char **argv)
/////////////////////////phy_procedures_nr_ue_TX///////////////////////
///////////
- phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id, 0);
+ phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
if (n_trials==1) {
@@ -972,20 +976,16 @@ int main(int argc, char **argv)
txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-
- txlev_float = (double)txlev/scale; // output of signal_energy is fixed point representation
-
-
}
else n_trials = 1;
if (input_fd == NULL ) {
- sigma_dB = N0;
+ sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
sigma = pow(10,sigma_dB/10);
- tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/txlev_float);
- if(n_trials==1) printf("txlev_float %f, sigma_dB %f, tx_gain %f tx_offset %d, slot_offset %d\n",10*log10(txlev_float),sigma_dB,tx_gain,tx_offset,slot_offset);
+
+ if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)frame_parms->ofdm_symbol_size/(12*nb_rb));
for (i=0; inb_antennas_rx; ap++) {
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((tx_gain*r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((tx_gain*r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */
if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)],
@@ -1016,6 +1016,17 @@ int main(int argc, char **argv)
}
+
+ if(pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
+ set_ptrs_symb_idx(&ptrsSymPos,
+ pusch_pdu->nr_of_symbols,
+ pusch_pdu->start_symbol_index,
+ 1<ul_dmrs_symb_pos);
+ ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymPos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols);
+ ptrsRePerSymb = ((pusch_pdu->rb_size + ptrs_freq_density - 1)/ptrs_freq_density);
+ printf("[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb );
+ }
////////////////////////////////////////////////////////////
//----------------------------------------------------------
@@ -1080,7 +1091,7 @@ int main(int argc, char **argv)
}
/* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */
available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density);
- printf("After PTRS subtraction available_bits are : %u \n", available_bits);
+ printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) );
}
for (i = 0; i < available_bits; i++) {
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
index fc5360848c..7600dfb08f 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
@@ -94,6 +94,7 @@ extern int pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode);
int test_synchro_pss_sss_nr(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int pss_sequence_number)
{
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
+ UE_nr_rxtx_proc_t proc = {0};
int synchro_position;
int offset;
int16_t *tmp;
@@ -130,7 +131,7 @@ int test_synchro_pss_sss_nr(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, in
#endif
- rx_sss_nr(PHY_vars_UE, &metric_fdd_ncp, &phase_fdd_ncp);
+ rx_sss_nr(PHY_vars_UE, &proc, &metric_fdd_ncp, &phase_fdd_ncp);
#if TEST_SYNCHRO_TIMING_PSS
@@ -244,7 +245,7 @@ void set_sequence_sss(PHY_VARS_NR_UE *PHY_vars_UE, int offset, int slot_offset)
void insert_sequence_sss(PHY_VARS_NR_UE *PHY_vars_UE, int offset)
{
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
- int samples_for_half_frame = (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)>>1;
+ int samples_for_half_frame = frame_parms->samples_per_frame / 2;
set_sequence_sss(PHY_vars_UE, offset, 0);
@@ -327,7 +328,7 @@ int test_synchro_pss_sss(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int s
int sync_pos2 = synchro_position - frame_parms->nb_prefix_samples;
- int sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples;
+ int sync_pos_slot = (frame_parms->samples_per_slot>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples;
if (sync_pos2 >= sync_pos_slot)
PHY_vars_UE->rx_offset = sync_pos2 - sync_pos_slot;
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
index fa8b49842f..f3dbc78a73 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
@@ -300,7 +300,7 @@ typedef enum {
void set_random_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int amp) {
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
- int samples_for_frame = (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
+ int samples_for_frame = frame_parms->samples_per_frame;
int16_t random;
int16_t *data_p;
random_data_format_t data_format = SINUSOIDAL_DATA;
@@ -394,7 +394,7 @@ void set_random_rx_buffer(PHY_VARS_NR_UE *PHY_vars_UE, int amp) {
int set_pss_in_rx_buffer_from_external_buffer(PHY_VARS_NR_UE *PHY_vars_UE, short *input_buffer) {
NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
- int samples_for_frame = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe; /* both i and q */
+ int samples_for_frame = frame_parms->samples_per_frame; /* both i and q */
for (int aa=0; aaframe_parms.nb_antennas_rx; aa++) {
for (int i = 0; i < samples_for_frame; i++) {
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.h b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.h
index 65755b0dfb..f0929e88c0 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.h
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.h
@@ -69,12 +69,6 @@ typedef struct {
int number_of_fail;
} test_t;
-typedef struct {
- uint16_t ofdm_symbol_size;
- uint32_t samples_per_tti;
- uint32_t samples_per_subframe;
-} save_frame_parms_t;
-
/*************** GLOBAL VARIABLES***********************************/
EXTERN PHY_VARS_eNB *PHY_vars_eNB;
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_generator_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_generator_test.c
index ab3ede4b8f..68acea6d98 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_generator_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_generator_test.c
@@ -58,7 +58,7 @@ int test_pucch_generators(PHY_VARS_NR_UE *ue) {
int occ_Index = 0;
uint64_t pucch_payload = 0;
int tx_amp = 512;
- int nr_tti_tx = 0;
+ int nr_slot_tx = 0;
int N_UCI = 0; /* size in bits for Uplink Control Information */
switch(format) {
@@ -67,7 +67,7 @@ int test_pucch_generators(PHY_VARS_NR_UE *ue) {
&ue->frame_parms,
&ue->pucch_config_dedicated_nr[gNB_id],
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
(uint8_t)m_0,
(uint8_t)m_CS,
nb_symbols_total,
@@ -82,7 +82,7 @@ int test_pucch_generators(PHY_VARS_NR_UE *ue) {
&ue->pucch_config_dedicated_nr[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
(uint8_t)m_0,
nb_symbols_total,
starting_symbol_index,
@@ -95,13 +95,13 @@ int test_pucch_generators(PHY_VARS_NR_UE *ue) {
case pucch_format2_nr: {
nr_generate_pucch2(ue,
- ue->pdcch_vars[ue->current_thread_id[nr_tti_tx]][gNB_id]->crnti,
+ ue->pdcch_vars[thread_number][gNB_id]->crnti,
ue->common_vars.txdataF,
&ue->frame_parms,
&ue->pucch_config_dedicated_nr[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
nb_symbols_total,
starting_symbol_index,
nb_of_prbs,
@@ -113,14 +113,14 @@ int test_pucch_generators(PHY_VARS_NR_UE *ue) {
case pucch_format3_nr:
case pucch_format4_nr: {
nr_generate_pucch3_4(ue,
- ue->pdcch_vars[ue->current_thread_id[nr_tti_tx]][gNB_id]->crnti,
+ ue->pdcch_vars[thread_number][gNB_id]->crnti,
ue->common_vars.txdataF,
&ue->frame_parms,
format,
&ue->pucch_config_dedicated_nr[gNB_id],
pucch_payload,
tx_amp,
- nr_tti_tx,
+ nr_slot_tx,
nb_symbols_total,
starting_symbol_index,
nb_of_prbs,
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
index 403a035c96..bdb860a150 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
@@ -169,7 +169,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
printf("%s", tst_separator);
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
printf("\n => Test : No harq feedback on going\n");
@@ -180,7 +180,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
}
/* set a tx slot with no ack */
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
@@ -267,7 +267,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
common_pucch_configuration(ue, gNB_id, TST_PUCCH_COMMON_CONFIG_INDEX_OK);
/* set a tx slot with no ack */
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
harq_status->ack = DL_ACK;
@@ -290,9 +290,9 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
/* set a second ack on a different downlink harq process */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_SECOND;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_SECOND;
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_SECOND].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_SECOND].harq_ack;
harq_status->n_CCE = 2;
harq_status->N_CCE = 4;
@@ -316,7 +316,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
v_return = -1;
}
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack.ack = DL_NACK;
+ ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack.ack = DL_NACK;
printf("\n => Test : PUCCH format from common config in dedicated mode: two negative downlink ACKnowledgments \n");
@@ -563,9 +563,9 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
printf("%s", tst_separator);
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -582,9 +582,9 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
for (int i = 0; i < TST_NB_STEP_SINGLE_TRANSPORT_BLOCK; i++) {
/* set a tx slot with no ack */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -616,9 +616,9 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
for (i = 1; i < TST_NB_STEP_SINGLE_TRANSPORT_BLOCK; i = i+2) {
/* set a tx slot with no ack */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -677,12 +677,12 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
for (int code_word = 0; code_word < 2; code_word++) {
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
/* set a tx slot with no ack */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -697,7 +697,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
reset_harq = TRUE;
}
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->pucch_resource_indicator = pucch_resource_indicator[i][j];
@@ -720,12 +720,12 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
for (int code_word = 0; code_word < 2; code_word++) {
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
/* set a tx slot with no ack */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -734,7 +734,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
for (int j = 0 ; j < 2; j++) {
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->pucch_resource_indicator = pucch_resource_indicator[i][j];
}
@@ -754,12 +754,12 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
for (int code_word = 0; code_word < 2; code_word++) {
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->Number_MCS_HARQ_DL_DCI = 2;
/* set a tx slot with no ack */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
+ ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
- NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+ NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -768,7 +768,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
for (int j = 0 ; j < 2; j++) {
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
harq_status->pucch_resource_indicator = pucch_resource_indicator[i][j];
}
@@ -935,7 +935,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p
}
/* restore single transport block */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->Number_MCS_HARQ_DL_DCI = 1;
+ ue->dlsch[proc->thread_id][gNB_id][0]->Number_MCS_HARQ_DL_DCI = 1;
return (v_return);
}
@@ -976,9 +976,9 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
NR_UE_HARQ_STATUS_t *harq_status;
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -1015,9 +1015,9 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
/* set a second harq ack context */
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_SECOND;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_SECOND;
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_SECOND].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_SECOND].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -1073,7 +1073,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
printf("%s", tst_separator);
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = NR_MAX_DLSCH_HARQ_PROCESSES;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = NR_MAX_DLSCH_HARQ_PROCESSES;
set_csi_nr( 4, 0x0E );
@@ -1090,9 +1090,9 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
NR_UE_HARQ_STATUS_t *harq_status;
- ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
+ ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
- harq_status = &ue->dlsch[ue->current_thread_id[proc->nr_tti_rx]][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+ harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
harq_status->slot_for_feedback_ack = proc->nr_slot_tx;
harq_status->send_harq_status = 1;
@@ -1170,11 +1170,9 @@ int test_pucch(PHY_VARS_NR_UE *ue)
proc->frame_rx = 0;
proc->nr_slot_rx = 0;
- proc->nr_tti_rx = 0;
proc->frame_tx = proc->frame_rx + (proc->nr_slot_rx + NR_UE_CAPABILITY_SLOT_RX_TO_TX) / ue->frame_parms.slots_per_frame;
proc->nr_slot_tx = (proc->nr_slot_rx + NR_UE_CAPABILITY_SLOT_RX_TO_TX) % ue->frame_parms.slots_per_frame;
- proc->nr_tti_tx = proc->nr_slot_tx % ue->frame_parms.slots_per_subframe;
init_pucch_power_configuration( ue, gNB_id);
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/srs_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/srs_test.c
index 8451e78fd6..aedb5729a3 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/srs_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/srs_test.c
@@ -229,7 +229,6 @@ int test_srs_periodicity(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc)
for (int slot_tx = 0; slot_tx < frame_parms->slots_per_frame; slot_tx++) {
proc->frame_tx = frame_tx;
proc->nr_slot_tx = slot_tx;
- proc->nr_tti_tx = slot_tx % frame_parms->slots_per_subframe;
if (ue_srs_procedure_nr( ue, proc, 0) == 0) {
printf("test_srs_periodicity srs at frame %d slot %d \n", frame_tx, slot_tx);
}
@@ -373,7 +372,7 @@ int test_srs(PHY_VARS_NR_UE *PHY_vars_UE)
/* start test of sounding reference signals */
default_srs_configuration(frame_parms);
- txptr = calloc(frame_parms->samples_per_tti , sizeof(int32_t));
+ txptr = calloc(frame_parms->samples_per_slot , sizeof(int32_t));
if (txptr == NULL) {
printf("Error test_srs: memory allocation problem txptr \n");
assert(0);
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/sss_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/sss_test.c
index 81e232794e..34127b604f 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/sss_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/sss_test.c
@@ -84,6 +84,7 @@
int test_synchro_pss_sss_nr(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, NR_DL_FRAME_PARMS *frame_parms_gNB, test_t *test)
{
+ UE_nr_rxtx_proc_t proc = {0};
VOID_PARAMETER test;
int synchro_position;
int offset;
@@ -133,7 +134,7 @@ int test_synchro_pss_sss_nr(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, NR
#endif
- rx_sss_nr(PHY_vars_UE, &metric_fdd_ncp, &phase_fdd_ncp);
+ rx_sss_nr(PHY_vars_UE, &proc, &metric_fdd_ncp, &phase_fdd_ncp);
#if TEST_SYNCHRO_TIMING_PSS
diff --git a/openair1/SIMULATION/TOOLS/phase_noise.c b/openair1/SIMULATION/TOOLS/phase_noise.c
index f243a09c59..5958a0ccdd 100644
--- a/openair1/SIMULATION/TOOLS/phase_noise.c
+++ b/openair1/SIMULATION/TOOLS/phase_noise.c
@@ -29,14 +29,43 @@
/* linear phase noise model */
void phase_noise(double ts, int16_t * InRe, int16_t * InIm)
{
+ static uint64_t i=0;
+ int32_t x=0 ,y=0;
double fd = 300;//0.01*30000
- static double i=0;
- double real, imag,x ,y;
+ int16_t SinValue = 0, CosValue= 0;
+ double IdxDouble = (double)(i*fd * ts * ResolSinCos * 4);
+ int16_t IdxModulo = ((int32_t)(IdxDouble>0 ? IdxDouble+0.5 : IdxDouble-0.5)) % (ResolSinCos*4);
+ IdxModulo = IdxModulo<0 ? IdxModulo+ResolSinCos*4 : IdxModulo;
+
+ if(IdxModulo<2*ResolSinCos) {//< 2 check for 1st and 2nd
+ if(IdxModulo < ResolSinCos) {// 1st Quadrant
+ SinValue = LUTSin[IdxModulo];
+ CosValue = LUTSin[ResolSinCos-IdxModulo];
+ }
+ else {// 2nd Quadrant
+ SinValue = LUTSin[2*ResolSinCos-IdxModulo];
+ CosValue = -LUTSin[IdxModulo-ResolSinCos];
+ }
+ }
+ else {// 3rd and 4th Quadrant
+ if(IdxModulo < 3*ResolSinCos) {// 3rd Quadrant
+ SinValue = -LUTSin[IdxModulo-2*ResolSinCos];
+ CosValue = -LUTSin[3*ResolSinCos-IdxModulo];
+ }
+ else {//4th Quadrant
+ SinValue = -LUTSin[4*ResolSinCos-IdxModulo];
+ CosValue = LUTSin[IdxModulo-3*ResolSinCos];
+ }
+ }
+ x = ( ((int32_t)InRe[0] * CosValue) - ((int32_t)InIm[0] * SinValue ));
+ y = ( ((int32_t)InIm[0] * CosValue) + ((int32_t)InRe[0] * SinValue ));
+ InRe[0]= (int16_t)(x>>14);
+ InIm[0]= (int16_t)(y>>14);
i++;
- real = cos(fd * 2 * M_PI * i * ts);
- imag = sin (fd * 2 * M_PI * i * ts);
- x = ((real * (double)InRe[0]) - (imag * (double)InIm[0])) ;
- y= ((real * (double)InIm[0]) + (imag * (double)InRe[0])) ;
- InRe[0]= (int16_t)(x);
- InIm[0]= (int16_t)(y);
+}
+/* Initialisation function for SIN table values */
+void InitSinLUT( void ) {
+ for ( int i=0; i<(ResolSinCos+1); i++ ) {
+ LUTSin[i] = sin((double)(M_PI*i)/(2*ResolSinCos)) * (1<<14); //Format: Q14
+ }
}
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index d2684b15c1..55a78e9778 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -466,6 +466,10 @@ double N_RB2channel_bandwidth(uint16_t N_RB);
\param ts Sampling time
\param *Re *Im Real and Imag part of the signal
*/
+//look-up table for the sine (cosine) function
+#define ResolSinCos 100
+uint16_t LUTSin[ResolSinCos+1];
+void InitSinLUT( void );
void phase_noise(double ts, int16_t * InRe, int16_t * InIm);
#include "targets/RT/USER/rfsim.h"
diff --git a/openair2/COMMON/itti_sim_messages_def.h b/openair2/COMMON/itti_sim_messages_def.h
new file mode 100644
index 0000000000..681fc932dd
--- /dev/null
+++ b/openair2/COMMON/itti_sim_messages_def.h
@@ -0,0 +1,36 @@
+/*
+ * 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 itti_sim_messages_def.h
+ * \brief itti message for itti simulator
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+
+MESSAGE_DEF(GNB_RRC_BCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBBCCHind)
+MESSAGE_DEF(GNB_RRC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBCCCHind)
+MESSAGE_DEF(GNB_RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBDCCHind)
+MESSAGE_DEF(UE_RRC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, UECCCHind)
+MESSAGE_DEF(UE_RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, UEDCCHind)
diff --git a/openair2/COMMON/itti_sim_messages_types.h b/openair2/COMMON/itti_sim_messages_types.h
new file mode 100644
index 0000000000..2e29e8f508
--- /dev/null
+++ b/openair2/COMMON/itti_sim_messages_types.h
@@ -0,0 +1,51 @@
+/*
+ * 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 itti_sim_messages_types.h
+ * \brief itti message for itti simulator
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+#ifndef ITTI_SIM_MESSAGES_TYPES_H_
+#define ITTI_SIM_MESSAGES_TYPES_H_
+
+#include "LTE_asn_constant.h"
+
+
+
+#define GNB_RRC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBBCCHind
+#define GNB_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBCCCHind
+#define GNB_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBDCCHind
+#define UE_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UECCCHind
+#define UE_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UEDCCHind
+
+
+
+typedef struct itti_sim_rrc_ch_s {
+ rb_id_t rbid;
+ uint8_t *sdu;
+ int size;
+} itti_sim_rrc_ch_t;
+
+#endif /* ITTI_SIM_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/mac_messages_def.h b/openair2/COMMON/mac_messages_def.h
index 09b3f2aab4..eeef0d4494 100644
--- a/openair2/COMMON/mac_messages_def.h
+++ b/openair2/COMMON/mac_messages_def.h
@@ -41,10 +41,16 @@ MESSAGE_DEF(RRC_MAC_CCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDat
MESSAGE_DEF(RRC_MAC_CCCH_DATA_CNF, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDataCnf, rrc_mac_ccch_data_cnf)
MESSAGE_DEF(RRC_MAC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDataInd, rrc_mac_ccch_data_ind)
+
MESSAGE_DEF(RRC_MAC_MCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDataReq, rrc_mac_mcch_data_req)
MESSAGE_DEF(RRC_MAC_MCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDataInd, rrc_mac_mcch_data_ind)
MESSAGE_DEF(RRC_MAC_PCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacPcchDataReq, rrc_mac_pcch_data_req)
/* RRC configures DRX context (MAC timers) of a UE */
-MESSAGE_DEF(RRC_MAC_DRX_CONFIG_REQ, MESSAGE_PRIORITY_MED, rrc_mac_drx_config_req_t, rrc_mac_drx_config_req)
\ No newline at end of file
+MESSAGE_DEF(RRC_MAC_DRX_CONFIG_REQ, MESSAGE_PRIORITY_MED, rrc_mac_drx_config_req_t, 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)
+
diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h
index e227296d05..f42813ecb0 100644
--- a/openair2/COMMON/mac_messages_types.h
+++ b/openair2/COMMON/mac_messages_types.h
@@ -38,6 +38,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 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
@@ -45,6 +46,7 @@
#define RRC_MAC_CCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_ccch_data_req
#define RRC_MAC_CCCH_DATA_CNF(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_ccch_data_cnf
#define RRC_MAC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_ccch_data_ind
+#define NR_RRC_MAC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_mac_ccch_data_ind
#define RRC_MAC_MCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_mcch_data_req
#define RRC_MAC_MCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_mcch_data_ind
@@ -86,6 +88,15 @@ typedef struct RrcMacBcchDataInd_s {
uint8_t rsrp;
} RrcMacBcchDataInd;
+typedef struct NRRrcMacBcchDataInd_s {
+ uint32_t frame;
+ uint8_t sub_frame;
+ uint32_t sdu_size;
+ uint8_t sdu[BCCH_SDU_SIZE];
+ uint8_t gnb_index;
+ uint8_t rsrq;
+ uint8_t rsrp;
+} NRRrcMacBcchDataInd;
typedef struct RrcMacBcchMbmsDataReq_s {
uint32_t frame;
@@ -126,6 +137,16 @@ typedef struct RrcMacCcchDataInd_s {
int CC_id;
} RrcMacCcchDataInd;
+typedef struct NRRrcMacCcchDataInd_s {
+ uint32_t frame;
+ uint8_t sub_frame;
+ uint16_t rnti;
+ uint32_t sdu_size;
+ uint8_t sdu[CCCH_SDU_SIZE];
+ uint8_t gnb_index;
+ int CC_id;
+} NRRrcMacCcchDataInd;
+
typedef struct RrcMacMcchDataReq_s {
uint32_t frame;
uint32_t sdu_size;
diff --git a/openair2/COMMON/ngap_messages_def.h b/openair2/COMMON/ngap_messages_def.h
new file mode 100644
index 0000000000..87d8a59fba
--- /dev/null
+++ b/openair2/COMMON/ngap_messages_def.h
@@ -0,0 +1,90 @@
+/*
+ * 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
+ */
+
+/*
+ * ngap_messages_def.h
+ *
+ * Created on: 2020
+ * Author: Yoshio INOUE, Masayuki HARADA
+ * Email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+/* Messages for NGAP logging */
+MESSAGE_DEF(NGAP_UPLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_uplink_nas_log)
+MESSAGE_DEF(NGAP_UE_CAPABILITY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_capability_ind_log)
+MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_initial_context_setup_log)
+MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_nas_non_delivery_ind_log)
+MESSAGE_DEF(NGAP_DOWNLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_downlink_nas_log)
+MESSAGE_DEF(NGAP_S1_SETUP_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_s1_setup_log)
+MESSAGE_DEF(NGAP_INITIAL_UE_MESSAGE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_initial_ue_message_log)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_req_log)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_command_log)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_complete_log)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_ue_context_release_log)
+MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_setup_request_log)
+MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_setup_response_log)
+MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_modify_request_log)
+MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_modify_response_log)
+MESSAGE_DEF(NGAP_PAGING_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_paging_log)
+MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_release_request_log)
+MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_pdusession_release_response_log)
+MESSAGE_DEF(NGAP_ERROR_INDICATION_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_error_indication_log)
+MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_path_switch_req_log)
+MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , ngap_path_switch_req_ack_log)
+
+/* gNB application layer -> NGAP messages */
+MESSAGE_DEF(NGAP_REGISTER_GNB_REQ , MESSAGE_PRIORITY_MED, ngap_register_gnb_req_t , ngap_register_gnb_req)
+
+/* NGAP -> gNB application layer messages */
+MESSAGE_DEF(NGAP_REGISTER_GNB_CNF , MESSAGE_PRIORITY_MED, ngap_register_gnb_cnf_t , ngap_register_gnb_cnf)
+MESSAGE_DEF(NGAP_DEREGISTERED_GNB_IND , MESSAGE_PRIORITY_MED, ngap_deregistered_gnb_ind_t , ngap_deregistered_gnb_ind)
+
+/* RRC -> NGAP messages */
+MESSAGE_DEF(NGAP_NAS_FIRST_REQ , MESSAGE_PRIORITY_MED, ngap_nas_first_req_t , ngap_nas_first_req)
+MESSAGE_DEF(NGAP_UPLINK_NAS , MESSAGE_PRIORITY_MED, ngap_uplink_nas_t , ngap_uplink_nas)
+MESSAGE_DEF(NGAP_UE_CAPABILITIES_IND , MESSAGE_PRIORITY_MED, ngap_ue_cap_info_ind_t , ngap_ue_cap_info_ind)
+MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, ngap_initial_context_setup_resp_t, ngap_initial_context_setup_resp)
+MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_FAIL, MESSAGE_PRIORITY_MED, ngap_initial_context_setup_fail_t, ngap_initial_context_setup_fail)
+MESSAGE_DEF(NGAP_NAS_NON_DELIVERY_IND , MESSAGE_PRIORITY_MED, ngap_nas_non_delivery_ind_t , ngap_nas_non_delivery_ind)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_RESP , MESSAGE_PRIORITY_MED, ngap_ue_release_resp_t , ngap_ue_release_resp)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, ngap_ue_release_complete_t , ngap_ue_release_complete)
+MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_RESP , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_resp_t , ngap_ue_ctxt_modification_resp)
+MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_FAIL , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_fail_t , ngap_ue_ctxt_modification_fail)
+MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESP , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_resp_t , ngap_pdusession_setup_resp)
+MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_fail_t , ngap_pdusession_setup_request_fail)
+MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESP , MESSAGE_PRIORITY_MED, ngap_pdusession_modify_resp_t , ngap_pdusession_modify_resp)
+MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE , MESSAGE_PRIORITY_MED, ngap_pdusession_release_resp_t , ngap_pdusession_release_resp)
+MESSAGE_DEF(NGAP_PATH_SWITCH_REQ , MESSAGE_PRIORITY_MED, ngap_path_switch_req_t , ngap_path_switch_req)
+MESSAGE_DEF(NGAP_PATH_SWITCH_REQ_ACK , MESSAGE_PRIORITY_MED, ngap_path_switch_req_ack_t , ngap_path_switch_req_ack)
+MESSAGE_DEF(NGAP_PDUSESSION_MODIFICATION_IND , MESSAGE_PRIORITY_MED, ngap_pdusession_modification_ind_t , ngap_pdusession_modification_ind)
+
+/* NGAP -> RRC messages */
+MESSAGE_DEF(NGAP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, ngap_downlink_nas_t , ngap_downlink_nas )
+MESSAGE_DEF(NGAP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, ngap_initial_context_setup_req_t , ngap_initial_context_setup_req )
+MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_REQ , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_req_t , ngap_ue_ctxt_modification_req)
+MESSAGE_DEF(NGAP_PAGING_IND , MESSAGE_PRIORITY_MED, ngap_paging_ind_t , ngap_paging_ind )
+MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQ , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_t , ngap_pdusession_setup_req )
+MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_REQ , MESSAGE_PRIORITY_MED, ngap_pdusession_modify_req_t , ngap_pdusession_modify_req )
+MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_COMMAND , MESSAGE_PRIORITY_MED, ngap_pdusession_release_command_t , ngap_pdusession_release_command)
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMMAND, MESSAGE_PRIORITY_MED, ngap_ue_release_command_t , ngap_ue_release_command)
+
+/* NGAP <-> RRC messages (can be initiated either by MME or gNB) */
+MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_REQ , MESSAGE_PRIORITY_MED, ngap_ue_release_req_t , ngap_ue_release_req)
diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h
new file mode 100644
index 0000000000..ff55f61ec0
--- /dev/null
+++ b/openair2/COMMON/ngap_messages_types.h
@@ -0,0 +1,821 @@
+/*
+ * 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
+ */
+
+/*
+ * ngap_messages_types.h
+ *
+ * Created on: 2020
+ * Author: Yoshio INOUE, Masayuki HARADA
+ * Email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#ifndef NGAP_MESSAGES_TYPES_H_
+#define NGAP_MESSAGES_TYPES_H_
+
+#include "LTE_asn_constant.h"
+//-------------------------------------------------------------------------------------------//
+// Defines to access message fields.
+
+#define NGAP_REGISTER_GNB_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_register_gnb_req
+
+#define NGAP_REGISTER_GNB_CNF(mSGpTR) (mSGpTR)->ittiMsg.ngap_register_gnb_cnf
+#define NGAP_DEREGISTERED_GNB_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_deregistered_gnb_ind
+
+#define NGAP_NAS_FIRST_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_nas_first_req
+#define NGAP_UPLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.ngap_uplink_nas
+#define NGAP_UE_CAPABILITIES_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_cap_info_ind
+#define NGAP_INITIAL_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_initial_context_setup_resp
+#define NGAP_INITIAL_CONTEXT_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_initial_context_setup_fail
+#define NGAP_UE_CONTEXT_RELEASE_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_resp
+#define NGAP_NAS_NON_DELIVERY_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_nas_non_delivery_ind
+#define NGAP_UE_CTXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_resp
+#define NGAP_UE_CTXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_fail
+#define NGAP_PDUSESSION_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_resp
+#define NGAP_PDUSESSION_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_req_fail
+#define NGAP_PDUSESSION_MODIFY_RESP(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_modify_resp
+#define NGAP_PATH_SWITCH_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_path_switch_req
+#define NGAP_PATH_SWITCH_REQ_ACK(mSGpTR) (mSGpTR)->ittiMsg.ngap_path_switch_req_ack
+#define NGAP_PDUSESSION_MODIFICATION_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_modification_ind
+
+#define NGAP_DOWNLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.ngap_downlink_nas
+#define NGAP_INITIAL_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_initial_context_setup_req
+#define NGAP_UE_CTXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_req
+#define NGAP_UE_CONTEXT_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_command
+#define NGAP_UE_CONTEXT_RELEASE_COMPLETE(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_complete
+#define NGAP_PDUSESSION_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_req
+#define NGAP_PDUSESSION_MODIFY_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_modify_req
+#define NGAP_PAGING_IND(mSGpTR) (mSGpTR)->ittiMsg.ngap_paging_ind
+
+#define NGAP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.ngap_ue_release_req
+#define NGAP_PDUSESSION_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_command
+#define NGAP_PDUSESSION_RELEASE_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_release_resp
+
+//-------------------------------------------------------------------------------------------//
+/* Maximum number of e-rabs to be setup/deleted in a single message.
+ * Even if only one bearer will be modified by message.
+ */
+#define NGAP_MAX_PDUSESSION (LTE_maxDRB + 3)
+
+/* Length of the transport layer address string
+ * 160 bits / 8 bits by char.
+ */
+#define NGAP_TRANSPORT_LAYER_ADDRESS_SIZE (160 / 8)
+
+#define NGAP_MAX_NB_AMF_IP_ADDRESS 10
+#define NGAP_IMSI_LENGTH 16
+
+#define QOSFLOW_MAX_VALUE 64
+
+/* Security key length used within gNB
+ * Even if only 16 bytes will be effectively used,
+ * the key length is 32 bytes (256 bits)
+ */
+#define SECURITY_KEY_LENGTH 32
+
+typedef enum ngap_paging_drx_e {
+ NGAP_PAGING_DRX_32 = 0x0,
+ NGAP_PAGING_DRX_64 = 0x1,
+ NGAP_PAGING_DRX_128 = 0x2,
+ NGAP_PAGING_DRX_256 = 0x3
+} ngap_paging_drx_t;
+
+/* Lower value codepoint
+ * indicates higher priority.
+ */
+typedef enum ngap_paging_priority_s {
+ NGAP_PAGING_PRIO_LEVEL1 = 0,
+ NGAP_PAGING_PRIO_LEVEL2 = 1,
+ NGAP_PAGING_PRIO_LEVEL3 = 2,
+ NGAP_PAGING_PRIO_LEVEL4 = 3,
+ NGAP_PAGING_PRIO_LEVEL5 = 4,
+ NGAP_PAGING_PRIO_LEVEL6 = 5,
+ NGAP_PAGING_PRIO_LEVEL7 = 6,
+ NGAP_PAGING_PRIO_LEVEL8 = 7
+} ngap_paging_priority_t;
+
+typedef enum ngap_cn_domain_s {
+ NGAP_CN_DOMAIN_PS = 1,
+ NGAP_CN_DOMAIN_CS = 2
+} ngap_cn_domain_t;
+
+typedef struct ngap_net_ip_address_s {
+ unsigned ipv4:1;
+ unsigned ipv6:1;
+ char ipv4_address[16];
+ char ipv6_address[46];
+} ngap_net_ip_address_t;
+
+typedef uint64_t bitrate_t;
+
+typedef struct ngap_ambr_s {
+ bitrate_t br_ul;
+ bitrate_t br_dl;
+} ngap_ambr_t;
+
+typedef enum ngap_priority_level_s {
+ NGAP_PRIORITY_LEVEL_SPARE = 0,
+ NGAP_PRIORITY_LEVEL_HIGHEST = 1,
+ NGAP_PRIORITY_LEVEL_LOWEST = 14,
+ NGAP_PRIORITY_LEVEL_NO_PRIORITY = 15
+} ngap_priority_level_t;
+
+typedef enum ngap_pre_emp_capability_e {
+ NGAP_PRE_EMPTION_CAPABILITY_ENABLED = 0,
+ NGAP_PRE_EMPTION_CAPABILITY_DISABLED = 1,
+ NGAP_PRE_EMPTION_CAPABILITY_MAX,
+} ngap_pre_emp_capability_t;
+
+typedef enum ngap_pre_emp_vulnerability_e {
+ NGAP_PRE_EMPTION_VULNERABILITY_ENABLED = 0,
+ NGAP_PRE_EMPTION_VULNERABILITY_DISABLED = 1,
+ NGAP_PRE_EMPTION_VULNERABILITY_MAX,
+} ngap_pre_emp_vulnerability_t;
+
+typedef struct ngap_allocation_retention_priority_s {
+ ngap_priority_level_t priority_level;
+ ngap_pre_emp_capability_t pre_emp_capability;
+ ngap_pre_emp_vulnerability_t pre_emp_vulnerability;
+} ngap_allocation_retention_priority_t;
+
+typedef struct ngap_security_capabilities_s {
+ uint16_t nRencryption_algorithms;
+ uint16_t nRintegrity_algorithms;
+ uint16_t eUTRAencryption_algorithms;
+ uint16_t eUTRAintegrity_algorithms;
+} ngap_security_capabilities_t;
+
+/* Provides the establishment cause for the RRC connection request as provided
+ * by the upper layers. W.r.t. the cause value names: highPriorityAccess
+ * concerns AC11..AC15, ‘mt Estands for ‘Mobile Terminating Eand ‘mo Efor
+ * 'Mobile Originating'. Defined in TS 36.331.
+ */
+typedef enum ngap_rrc_establishment_cause_e {
+ NGAP_RRC_CAUSE_EMERGENCY = 0x0,
+ NGAP_RRC_CAUSE_HIGH_PRIO_ACCESS = 0x1,
+ NGAP_RRC_CAUSE_MT_ACCESS = 0x2,
+ NGAP_RRC_CAUSE_MO_SIGNALLING = 0x3,
+ NGAP_RRC_CAUSE_MO_DATA = 0x4,
+ NGAP_RRC_CAUSE_MO_VOICECALL = 0x5,
+ NGAP_RRC_CAUSE_MO_VIDEOCALL = 0x6,
+ NGAP_RRC_CAUSE_MO_SMS = 0x7,
+ NGAP_RRC_CAUSE_MPS_PRIORITY_ACCESS = 0x8,
+ NGAP_RRC_CAUSE_MCS_PRIORITY_ACCESS = 0x9,
+ NGAP_RRC_CAUSE_NOTAVAILABLE = 0x10,
+ NGAP_RRC_CAUSE_LAST
+} ngap_rrc_establishment_cause_t;
+
+typedef struct ngap_guami_s {
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_len;
+ uint8_t amf_region_id;
+ uint16_t amf_set_id;
+ uint8_t amf_pointer;
+} ngap_guami_t;
+
+typedef struct ngap_allowed_NSSAI_s{
+ uint8_t sST;
+ uint8_t sD_flag;
+ uint8_t sD[3];
+}ngap_allowed_NSSAI_t;
+
+typedef struct fiveg_s_tmsi_s {
+ uint16_t amf_set_id;
+ uint8_t amf_pointer;
+ uint32_t m_tmsi;
+} fiveg_s_tmsi_t;
+
+typedef struct ngap_tai_plmn_identity_s {
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+} ngap_plmn_identity_t;
+
+typedef struct ngap_ue_paging_identity_s {
+ fiveg_s_tmsi_t s_tmsi;
+} ngap_ue_paging_identity_t;
+
+typedef enum ngap_ue_identities_presenceMask_e {
+ NGAP_UE_IDENTITIES_NONE = 0,
+ NGAP_UE_IDENTITIES_FiveG_s_tmsi = 1 << 1,
+ NGAP_UE_IDENTITIES_guami = 1 << 2,
+} ngap_ue_identities_presenceMask_t;
+
+typedef struct ngap_ue_identity_s {
+ ngap_ue_identities_presenceMask_t presenceMask;
+ fiveg_s_tmsi_t s_tmsi;
+ ngap_guami_t guami;
+} ngap_ue_identity_t;
+
+typedef struct ngap_nas_pdu_s {
+ /* Octet string data */
+ uint8_t *buffer;
+ /* Length of the octet string */
+ uint32_t length;
+} ngap_nas_pdu_t, ngap_ue_radio_cap_t;
+
+typedef struct ngap_mobility_restriction_s{
+ ngap_plmn_identity_t serving_plmn;
+}ngap_mobility_restriction_t;
+
+typedef enum pdu_session_type_e {
+ PDUSessionType_ipv4 = 0,
+ PDUSessionType_ipv6 = 1,
+ PDUSessionType_ipv4v6 = 2,
+ PDUSessionType_ethernet = 3,
+ PDUSessionType_unstructured = 4
+}pdu_session_type_t;
+
+typedef struct ngap_transport_layer_addr_s {
+ /* Length of the transport layer address buffer in bits. NGAP layer received a
+ * bit string<1..160> containing one of the following addresses: ipv4,
+ * ipv6, or ipv4 and ipv6. The layer doesn't interpret the buffer but
+ * silently forward it to NG-U.
+ */
+ uint8_t pdu_session_type;
+ uint8_t length;
+ uint8_t buffer[20]; // in network byte order
+} ngap_transport_layer_addr_t;
+
+#define TRANSPORT_LAYER_ADDR_COPY(dEST,sOURCE) \
+ do { \
+ AssertFatal(sOURCE.len <= 20); \
+ memcpy(dEST.buffer, sOURCE.buffer, sOURCE.len); \
+ dEST.length = sOURCE.length; \
+ } while (0)
+
+typedef struct pdusession_level_qos_parameter_s {
+ uint8_t qci;
+
+ ngap_allocation_retention_priority_t allocation_retention_priority;
+} pdusession_level_qos_parameter_t;
+
+typedef struct pdusession_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+
+ uint8_t nb_qos;
+ /* Quality of service for this pdusession */
+ pdusession_level_qos_parameter_t qos[QOSFLOW_MAX_VALUE];
+ /* The NAS PDU should be forwarded by the RRC layer to the NAS layer */
+ ngap_nas_pdu_t nas_pdu;
+ /* The transport layer address for the IP packets */
+ ngap_transport_layer_addr_t upf_addr;
+ /* S-GW Tunnel endpoint identifier */
+ uint32_t gtp_teid;
+} pdusession_t;
+
+
+typedef enum pdusession_qosflow_mapping_ind_e{
+ QOSFLOW_MAPPING_INDICATION_UL = 0,
+ QOSFLOW_MAPPING_INDICATION_DL = 1,
+ QOSFLOW_MAPPING_INDICATION_NON = 0xFF
+}pdusession_qosflow_mapping_ind_t;
+
+typedef struct pdusession_associate_qosflow_s{
+ uint8_t qci;
+ pdusession_qosflow_mapping_ind_t qos_flow_mapping_ind;
+}pdusession_associate_qosflow_t;
+
+typedef struct pdusession_setup_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+
+ /* The transport layer address for the IP packets */
+ ngap_transport_layer_addr_t gNB_addr;
+
+ /* UPF Tunnel endpoint identifier */
+ uint32_t gtp_teid;
+
+ /* qos flow list number */
+ uint8_t nb_of_qos_flow;
+
+ /* qos flow list(1 ~ 64) */
+ pdusession_associate_qosflow_t associated_qos_flows[QOSFLOW_MAX_VALUE];
+} pdusession_setup_t;
+
+typedef struct pdusession_tobe_added_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+
+ /* Unique drb_ID for the UE. */
+ uint8_t drb_ID;
+
+ /* The transport layer address for the IP packets */
+ ngap_transport_layer_addr_t upf_addr;
+
+ /* S-GW Tunnel endpoint identifier */
+ uint32_t gtp_teid;
+} pdusession_tobe_added_t;
+
+typedef struct pdusession_admitted_tobe_added_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+
+ /* Unique drb_ID for the UE. */
+ uint8_t drb_ID;
+
+ /* The transport layer address for the IP packets */
+ ngap_transport_layer_addr_t gnb_addr;
+
+ /* S-GW Tunnel endpoint identifier */
+ uint32_t gtp_teid;
+} pdusession_admitted_tobe_added_t;
+
+
+
+typedef struct pdusession_tobeswitched_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+
+ /* The transport layer address for the IP packets */
+ ngap_transport_layer_addr_t upf_addr;
+
+ /* S-GW Tunnel endpoint identifier */
+ uint32_t gtp_teid;
+} pdusession_tobeswitched_t;
+
+typedef struct pdusession_modify_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+} pdusession_modify_t;
+
+typedef enum ngap_Cause_e {
+ NGAP_CAUSE_NOTHING, /* No components present */
+ NGAP_CAUSE_RADIO_NETWORK,
+ NGAP_CAUSE_TRANSPORT,
+ NGAP_CAUSE_NAS,
+ NGAP_CAUSE_PROTOCOL,
+ NGAP_CAUSE_MISC,
+ /* Extensions may appear below */
+
+} ngap_Cause_t;
+
+typedef struct pdusession_failed_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+ /* Cause of the failure */
+ // cause_t cause;
+ ngap_Cause_t cause;
+ uint8_t cause_value;
+} pdusession_failed_t;
+
+typedef enum ngap_ue_ctxt_modification_present_s {
+ NGAP_UE_CONTEXT_MODIFICATION_SECURITY_KEY = (1 << 0),
+ NGAP_UE_CONTEXT_MODIFICATION_UE_AMBR = (1 << 1),
+ NGAP_UE_CONTEXT_MODIFICATION_UE_SECU_CAP = (1 << 2),
+} ngap_ue_ctxt_modification_present_t;
+
+typedef enum ngap_paging_ind_present_s {
+ NGAP_PAGING_IND_PAGING_DRX = (1 << 0),
+ NGAP_PAGING_IND_PAGING_PRIORITY = (1 << 1),
+} ngap_paging_ind_present_t;
+
+//-------------------------------------------------------------------------------------------//
+// gNB application layer -> NGAP messages
+typedef struct ngap_register_gnb_req_s {
+ /* Unique gNB_id to identify the gNB within EPC.
+ * For macro gNB ids this field should be 20 bits long.
+ * For home gNB ids this field should be 28 bits long.
+ */
+ uint32_t gNB_id;
+ /* The type of the cell */
+ enum cell_type_e cell_type;
+
+ /* Optional name for the cell
+ * NOTE: the name can be NULL (i.e no name) and will be cropped to 150
+ * characters.
+ */
+ char *gNB_name;
+
+ /* Tracking area code */
+ uint32_t tac;
+
+#define PLMN_LIST_MAX_SIZE 6
+ /* Mobile Country Code
+ * Mobile Network Code
+ */
+ uint16_t mcc[PLMN_LIST_MAX_SIZE];
+ uint16_t mnc[PLMN_LIST_MAX_SIZE];
+ uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
+ uint8_t num_plmn;
+
+ uint16_t num_nssai[PLMN_LIST_MAX_SIZE];
+ ngap_allowed_NSSAI_t s_nssai[PLMN_LIST_MAX_SIZE][8];
+
+ /* Default Paging DRX of the gNB as defined in TS 38.304 */
+ ngap_paging_drx_t default_drx;
+
+ /* The gNB IP address to bind */
+ net_ip_address_t gnb_ip_address;
+
+ /* Nb of AMF to connect to */
+ uint8_t nb_amf;
+ /* List of AMF to connect to */
+ net_ip_address_t amf_ip_address[NGAP_MAX_NB_AMF_IP_ADDRESS];
+ uint8_t broadcast_plmn_num[NGAP_MAX_NB_AMF_IP_ADDRESS];
+ uint8_t broadcast_plmn_index[NGAP_MAX_NB_AMF_IP_ADDRESS][PLMN_LIST_MAX_SIZE];
+
+ /* Number of SCTP streams used for a amf association */
+ uint16_t sctp_in_streams;
+ uint16_t sctp_out_streams;
+} ngap_register_gnb_req_t;
+
+//-------------------------------------------------------------------------------------------//
+// NGAP -> gNB application layer messages
+typedef struct ngap_register_gnb_cnf_s {
+ /* Nb of AMF connected */
+ uint8_t nb_amf;
+} ngap_register_gnb_cnf_t;
+
+typedef struct ngap_deregistered_gnb_ind_s {
+ /* Nb of AMF connected */
+ uint8_t nb_amf;
+} ngap_deregistered_gnb_ind_t;
+
+//-------------------------------------------------------------------------------------------//
+// RRC -> NGAP messages
+
+/* The NAS First Req is the first message exchanged between RRC and NGAP
+ * for an UE.
+ * The rnti uniquely identifies an UE within a cell. Later the gnb_ue_ngap_id
+ * will be the unique identifier used between RRC and NGAP.
+ */
+typedef struct ngap_nas_first_req_s {
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* the chosen PLMN identity as index, see TS 36.331 6.2.2 RRC Connection
+ * Setup Complete. This index here is zero-based, unlike the standard! */
+ int selected_plmn_identity;
+
+ /* Establishment cause as sent by UE */
+ ngap_rrc_establishment_cause_t establishment_cause;
+
+ /* NAS PDU */
+ ngap_nas_pdu_t nas_pdu;
+
+ /* If this flag is set NGAP layer is expecting the GUAMI. If = 0,
+ * the temporary s-tmsi is used.
+ */
+ ngap_ue_identity_t ue_identity;
+} ngap_nas_first_req_t;
+
+typedef struct ngap_uplink_nas_s {
+ /* Unique UE identifier within an gNB */
+ uint32_t gNB_ue_ngap_id;
+
+ /* NAS pdu */
+ ngap_nas_pdu_t nas_pdu;
+} ngap_uplink_nas_t;
+
+typedef struct ngap_ue_cap_info_ind_s {
+ uint32_t gNB_ue_ngap_id;
+ ngap_ue_radio_cap_t ue_radio_cap;
+} ngap_ue_cap_info_ind_t;
+
+typedef struct ngap_initial_context_setup_resp_s {
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession setup-ed in the list */
+ uint8_t nb_of_pdusessions;
+ /* list of pdusession setup-ed by RRC layers */
+ pdusession_setup_t pdusessions[NGAP_MAX_PDUSESSION];
+
+ /* Number of pdusession failed to be setup in list */
+ uint8_t nb_of_pdusessions_failed;
+ /* list of pdusessions that failed to be setup */
+ pdusession_failed_t pdusessions_failed[NGAP_MAX_PDUSESSION];
+} ngap_initial_context_setup_resp_t;
+
+typedef struct ngap_initial_context_setup_fail_s {
+ uint32_t gNB_ue_ngap_id;
+
+ /* TODO add cause */
+} ngap_initial_context_setup_fail_t, ngap_ue_ctxt_modification_fail_t, ngap_pdusession_setup_req_fail_t;
+
+typedef struct ngap_nas_non_delivery_ind_s {
+ uint32_t gNB_ue_ngap_id;
+ ngap_nas_pdu_t nas_pdu;
+ /* TODO: add cause */
+} ngap_nas_non_delivery_ind_t;
+
+typedef struct ngap_ue_ctxt_modification_req_s {
+ uint32_t gNB_ue_ngap_id;
+
+ /* Bit-mask of possible present parameters */
+ ngap_ue_ctxt_modification_present_t present;
+
+ /* Following fields are optionnaly present */
+
+ /* Security key */
+ uint8_t security_key[SECURITY_KEY_LENGTH];
+
+ /* UE aggregate maximum bitrate */
+ ngap_ambr_t ue_ambr;
+
+ /* NR Security capabilities */
+ ngap_security_capabilities_t security_capabilities;
+} ngap_ue_ctxt_modification_req_t;
+
+typedef struct ngap_ue_ctxt_modification_resp_s {
+ uint32_t gNB_ue_ngap_id;
+} ngap_ue_ctxt_modification_resp_t;
+
+typedef struct ngap_ue_release_complete_s {
+
+ uint32_t gNB_ue_ngap_id;
+
+} ngap_ue_release_complete_t;
+
+//-------------------------------------------------------------------------------------------//
+// NGAP -> RRC messages
+typedef struct ngap_downlink_nas_s {
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* Unique UE identifier within an gNB */
+ uint32_t gNB_ue_ngap_id;
+
+ /* NAS pdu */
+ ngap_nas_pdu_t nas_pdu;
+} ngap_downlink_nas_t;
+
+
+typedef struct ngap_initial_context_setup_req_s {
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* gNB ue ngap id as initialized by NGAP layer */
+ uint32_t gNB_ue_ngap_id;
+
+ uint64_t amf_ue_ngap_id:40;
+
+ /* UE aggregate maximum bitrate */
+ ngap_ambr_t ue_ambr;
+
+ /* guami */
+ ngap_guami_t guami;
+
+ /* allowed nssai */
+ uint8_t nb_allowed_nssais;
+ ngap_allowed_NSSAI_t allowed_nssai[8];
+
+ /* Security algorithms */
+ ngap_security_capabilities_t security_capabilities;
+
+ /* Security key */
+ uint8_t security_key[SECURITY_KEY_LENGTH];
+
+ /* Number of pdusession to be setup in the list */
+ uint8_t nb_of_pdusessions;
+ /* list of pdusession to be setup by RRC layers */
+ pdusession_t pdusession_param[NGAP_MAX_PDUSESSION];
+
+ /* Mobility Restriction List */
+ uint8_t mobility_restriction_flag;
+ ngap_mobility_restriction_t mobility_restriction;
+
+ /* Nas Pdu */
+ uint8_t nas_pdu_flag;
+ ngap_nas_pdu_t nas_pdu;
+} ngap_initial_context_setup_req_t;
+
+
+typedef struct ngap_paging_ind_s {
+ /* UE paging identity */
+ ngap_ue_paging_identity_t ue_paging_identity;
+
+ /* Indicates origin of paging */
+ ngap_cn_domain_t cn_domain;
+
+ /* PLMN_identity in TAI of Paging*/
+ ngap_plmn_identity_t plmn_identity[256];
+
+ /* TAC in TAIList of Paging*/
+ int16_t tac[256];
+
+ /* size of TAIList*/
+ int16_t tai_size;
+
+ /* Optional fields */
+ ngap_paging_drx_t paging_drx;
+
+ ngap_paging_priority_t paging_priority;
+} ngap_paging_ind_t;
+
+typedef struct ngap_pdusession_setup_req_s {
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* gNB ue ngap id as initialized by NGAP layer */
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession to be setup in the list */
+ uint8_t nb_pdusessions_tosetup;
+
+ /* E RAB setup request */
+ pdusession_t pdusession_setup_params[NGAP_MAX_PDUSESSION];
+
+} ngap_pdusession_setup_req_t;
+
+typedef struct ngap_pdusession_setup_resp_s {
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession setup-ed in the list */
+ uint8_t nb_of_pdusessions;
+ /* list of pdusession setup-ed by RRC layers */
+ pdusession_setup_t pdusessions[NGAP_MAX_PDUSESSION];
+
+ /* Number of pdusession failed to be setup in list */
+ uint8_t nb_of_pdusessions_failed;
+ /* list of pdusessions that failed to be setup */
+ pdusession_failed_t pdusessions_failed[NGAP_MAX_PDUSESSION];
+} ngap_pdusession_setup_resp_t;
+
+typedef struct ngap_path_switch_req_s {
+
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession setup-ed in the list */
+ uint8_t nb_of_pdusessions;
+
+ /* list of pdusession setup-ed by RRC layers */
+ pdusession_setup_t pdusessions_tobeswitched[NGAP_MAX_PDUSESSION];
+
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ ngap_guami_t ue_guami;
+
+ uint16_t ue_initial_id;
+
+ /* Security algorithms */
+ ngap_security_capabilities_t security_capabilities;
+
+} ngap_path_switch_req_t;
+
+typedef struct ngap_path_switch_req_ack_s {
+
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ uint32_t gNB_ue_ngap_id;
+
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* UE aggregate maximum bitrate */
+ ngap_ambr_t ue_ambr;
+
+ /* Number of pdusession setup-ed in the list */
+ uint8_t nb_pdusessions_tobeswitched;
+
+ /* list of pdusession to be switched by RRC layers */
+ pdusession_tobeswitched_t pdusessions_tobeswitched[NGAP_MAX_PDUSESSION];
+
+ /* Number of pdusessions to be released by RRC */
+ uint8_t nb_pdusessions_tobereleased;
+
+ /* list of pdusessions to be released */
+ pdusession_failed_t pdusessions_tobereleased[NGAP_MAX_PDUSESSION];
+
+ /* Security key */
+ int next_hop_chain_count;
+ uint8_t next_security_key[SECURITY_KEY_LENGTH];
+
+} ngap_path_switch_req_ack_t;
+
+typedef struct ngap_pdusession_modification_ind_s {
+
+ uint32_t gNB_ue_ngap_id;
+
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* Number of pdusession setup-ed in the list */
+ uint8_t nb_of_pdusessions_tobemodified;
+
+ uint8_t nb_of_pdusessions_nottobemodified;
+
+ /* list of pdusession setup-ed by RRC layers */
+ pdusession_setup_t pdusessions_tobemodified[NGAP_MAX_PDUSESSION];
+
+ pdusession_setup_t pdusessions_nottobemodified[NGAP_MAX_PDUSESSION];
+
+ uint16_t ue_initial_id;
+
+} ngap_pdusession_modification_ind_t;
+
+// NGAP --> RRC messages
+typedef struct ngap_ue_release_command_s {
+
+ uint32_t gNB_ue_ngap_id;
+
+} ngap_ue_release_command_t;
+
+
+//-------------------------------------------------------------------------------------------//
+// NGAP <-- RRC messages
+typedef struct ngap_ue_release_req_s {
+ uint32_t gNB_ue_ngap_id;
+ ngap_Cause_t cause;
+ long cause_value;
+} ngap_ue_release_req_t, ngap_ue_release_resp_t;
+
+typedef struct ngap_pdusession_modify_req_s {
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* gNB ue ngap id as initialized by NGAP layer */
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession to be modify in the list */
+ uint8_t nb_pdusessions_tomodify;
+
+ /* E RAB modify request */
+ pdusession_t pdusession_modify_params[NGAP_MAX_PDUSESSION];
+} ngap_pdusession_modify_req_t;
+
+typedef struct ngap_pdusession_modify_resp_s {
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession modify-ed in the list */
+ uint8_t nb_of_pdusessions;
+ /* list of pdusession modify-ed by RRC layers */
+ pdusession_modify_t pdusessions[NGAP_MAX_PDUSESSION];
+
+ /* Number of pdusession failed to be modify in list */
+ uint8_t nb_of_pdusessions_failed;
+ /* list of pdusessions that failed to be modify */
+ pdusession_failed_t pdusessions_failed[NGAP_MAX_PDUSESSION];
+} ngap_pdusession_modify_resp_t;
+
+typedef struct pdusession_release_s {
+ /* Unique pdusession_id for the UE. */
+ uint8_t pdusession_id;
+} pdusession_release_t;
+
+typedef struct ngap_pdusession_release_command_s {
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* gNB ue ngap id as initialized by NGAP layer */
+ uint32_t gNB_ue_ngap_id;
+
+ /* The NAS PDU should be forwarded by the RRC layer to the NAS layer */
+ ngap_nas_pdu_t nas_pdu;
+
+ /* Number of pdusession to be released in the list */
+ uint8_t nb_pdusessions_torelease;
+
+ /* PDUSession release command */
+ pdusession_release_t pdusession_release_params[NGAP_MAX_PDUSESSION];
+
+} ngap_pdusession_release_command_t;
+
+typedef struct ngap_pdusession_release_resp_s {
+ /* AMF UE id */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* gNB ue ngap id as initialized by NGAP layer */
+ uint32_t gNB_ue_ngap_id;
+
+ /* Number of pdusession released in the list */
+ uint8_t nb_of_pdusessions_released;
+
+ /* list of pdusessions released */
+ pdusession_release_t pdusession_release[NGAP_MAX_PDUSESSION];
+
+ /* Number of pdusession failed to be released in list */
+ uint8_t nb_of_pdusessions_failed;
+ /* list of pdusessions that failed to be released */
+ pdusession_failed_t pdusessions_failed[NGAP_MAX_PDUSESSION];
+
+} ngap_pdusession_release_resp_t;
+
+#endif /* NGAP_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/pdcp_messages_def.h b/openair2/COMMON/pdcp_messages_def.h
index c4be4b2957..b148ae0e1f 100644
--- a/openair2/COMMON/pdcp_messages_def.h
+++ b/openair2/COMMON/pdcp_messages_def.h
@@ -31,3 +31,6 @@
MESSAGE_DEF(RRC_DCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcDcchDataReq, rrc_dcch_data_req)
MESSAGE_DEF(RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcDcchDataInd, rrc_dcch_data_ind)
MESSAGE_DEF(RRC_PCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcPcchDataReq, rrc_pcch_data_req)
+
+// gNB
+MESSAGE_DEF(NR_RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, NRRrcDcchDataInd, nr_rrc_dcch_data_ind)
diff --git a/openair2/COMMON/pdcp_messages_types.h b/openair2/COMMON/pdcp_messages_types.h
index 1551e4283f..daf8ba7cac 100644
--- a/openair2/COMMON/pdcp_messages_types.h
+++ b/openair2/COMMON/pdcp_messages_types.h
@@ -35,6 +35,9 @@
#define RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_dcch_data_ind
#define RRC_PCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_pcch_data_req
+// gNB
+#define NR_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nr_rrc_dcch_data_ind
+
//-------------------------------------------------------------------------------------------//
// Messages between RRC and PDCP layers
typedef struct RrcDcchDataReq_s {
@@ -61,6 +64,16 @@ typedef struct RrcDcchDataInd_s {
uint8_t eNB_index; // LG: needed in UE
} RrcDcchDataInd;
+typedef struct NRRrcDcchDataInd_s {
+ uint32_t frame;
+ uint8_t dcch_index;
+ uint32_t sdu_size;
+ uint8_t *sdu_p;
+ uint16_t rnti;
+ uint8_t module_id;
+ uint8_t gNB_index; // LG: needed in UE
+} NRRrcDcchDataInd;
+
typedef struct RrcPcchDataReq_s {
uint32_t sdu_size;
uint8_t *sdu_p;
diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h
index 2555be081a..75e5b99222 100644
--- a/openair2/COMMON/platform_types.h
+++ b/openair2/COMMON/platform_types.h
@@ -299,6 +299,12 @@ typedef struct protocol_ctxt_s {
(CTXT_Pp)->module_id, \
(CTXT_Pp)->rnti
+#define PROTOCOL_NR_CTXT_ARGS(CTXT_Pp) \
+ (CTXT_Pp)->frame, \
+ ((CTXT_Pp)->enb_flag == GNB_FLAG_YES) ? "gNB":" UE", \
+ (CTXT_Pp)->module_id, \
+ (CTXT_Pp)->rnti
+
#define CHECK_CTXT_ARGS(CTXT_Pp)
#define exit_fun(msg) exit_function(__FILE__,__FUNCTION__,__LINE__,msg)
diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h
index befab4ebdf..f6b4f3c4e2 100644
--- a/openair2/COMMON/s1ap_messages_types.h
+++ b/openair2/COMMON/s1ap_messages_types.h
@@ -386,6 +386,7 @@ typedef struct s1ap_register_enb_req_s {
uint8_t nb_mme;
/* List of MME to connect to */
net_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS];
+ uint16_t mme_port[S1AP_MAX_NB_MME_IP_ADDRESS];
uint8_t broadcast_plmn_num[S1AP_MAX_NB_MME_IP_ADDRESS];
uint8_t broadcast_plmn_index[S1AP_MAX_NB_MME_IP_ADDRESS][PLMN_LIST_MAX_SIZE];
diff --git a/openair2/COMMON/tasks_def.h b/openair2/COMMON/tasks_def.h
index 0fb1bd6b30..33b6d5f9d4 100644
--- a/openair2/COMMON/tasks_def.h
+++ b/openair2/COMMON/tasks_def.h
@@ -74,6 +74,7 @@ TASK_DEF(TASK_PROTO_AGENT, TASK_PRIORITY_MED, 200)
/// Radio Resource Control task
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200)
+TASK_DEF(TASK_RRC_NRUE, TASK_PRIORITY_MED, 200)
/// Non Access Stratum task
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200)
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200)
@@ -81,3 +82,8 @@ TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200)
//MESSAGE GENERATOR TASK
TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200)
+#ifdef ITTI_SIM
+TASK_DEF(TASK_RRC_GNB_SIM, TASK_PRIORITY_MED, 200)
+TASK_DEF(TASK_RRC_UE_SIM, TASK_PRIORITY_MED, 200)
+#endif
+
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index cf8ba78a81..de77d783c7 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -2511,6 +2511,9 @@ int RCconfig_S1(
S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] = 0;
}
+ /* set S1-mme port (sctp) */
+ S1AP_REGISTER_ENB_REQ(msg_p).mme_port[l] = *S1ParamList.paramarray[l][ENB_MME_PORT_IDX].u16ptr;
+
AssertFatal(S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] <= S1AP_REGISTER_ENB_REQ(msg_p).num_plmn,
"List of broadcast PLMN to be sent to MME can not be longer than actual "
"PLMN list (max %d, but is %d)\n",
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 24240e5ae1..de7e0bbdad 100644
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -34,6 +34,7 @@
#define ENB_PARAMDEF_H_
#include "common/config/config_paramdesc.h"
#include "RRC_paramsvalues.h"
+#include "s1ap_eNB_default_values.h"
#define ENB_CONFIG_STRING_CC_NODE_FUNCTION "node_function"
#define ENB_CONFIG_STRING_CC_NODE_TIMING "node_timing"
@@ -910,6 +911,7 @@ typedef struct srb1_params_s {
#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4"
#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6"
+#define ENB_CONFIG_STRING_MME_PORT "port"
#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active"
#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference"
#define ENB_CONFIG_STRING_MME_BROADCAST_PLMN_INDEX "broadcast_plmn_index"
@@ -924,14 +926,20 @@ typedef struct srb1_params_s {
{ENB_CONFIG_STRING_MME_IPV6_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
- {ENB_CONFIG_STRING_MME_BROADCAST_PLMN_INDEX, NULL, 0, uptr:NULL, defintarrayval:NULL, TYPE_UINTARRAY, 6} \
+ {ENB_CONFIG_STRING_MME_BROADCAST_PLMN_INDEX, NULL, 0, uptr:NULL, defintarrayval:NULL, TYPE_UINTARRAY, 6}, \
+ {ENB_CONFIG_STRING_MME_PORT, NULL, 0, u16ptr:NULL, defuintval:S1AP_PORT_NUMBER, TYPE_UINT16, 0}, \
}
+
+
+
+
#define ENB_MME_IPV4_ADDRESS_IDX 0
#define ENB_MME_IPV6_ADDRESS_IDX 1
#define ENB_MME_IP_ADDRESS_ACTIVE_IDX 2
#define ENB_MME_IP_ADDRESS_PREFERENCE_IDX 3
#define ENB_MME_BROADCAST_PLMN_INDEX 4
+#define ENB_MME_PORT_IDX 5
/*---------------------------------------------------------------------------------------------------------------------------------------*/
/* X2 configuration parameters section name */
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index 9bdd709262..01d7a3b833 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -39,7 +39,7 @@
#include "x2ap_eNB.h"
#include "intertask_interface.h"
-#include "s1ap_eNB.h"
+#include "ngap_gNB.h"
#include "sctp_eNB_task.h"
#include "gtpv1u_eNB_task.h"
#include "PHY/INIT/phy_init.h"
@@ -75,26 +75,29 @@ static void configure_nr_rrc(uint32_t gnb_id)
static uint32_t gNB_app_register(uint32_t gnb_id_start, uint32_t gnb_id_end)//, const Enb_properties_array_t *enb_properties)
{
uint32_t gnb_id;
- //MessageDef *msg_p;
+ MessageDef *msg_p;
uint32_t register_gnb_pending = 0;
for (gnb_id = gnb_id_start; (gnb_id < gnb_id_end) ; gnb_id++) {
{
- //s1ap_register_enb_req_t *s1ap_register_gNB; //Type Temporarily reuse
+ if(NGAP_CONF_MODE){
+ ngap_register_gnb_req_t *ngap_register_gNB; //Type Temporarily reuse
+
+ // note: there is an implicit relationship between the data structure and the message name
+ msg_p = itti_alloc_new_message (TASK_GNB_APP, NGAP_REGISTER_GNB_REQ); //Message Temporarily reuse
- // note: there is an implicit relationship between the data structure and the message name
- /*msg_p = itti_alloc_new_message (TASK_GNB_APP, S1AP_REGISTER_ENB_REQ); //Message Temporarily reuse
+ RCconfig_NR_NG(msg_p, gnb_id);
+
+ ngap_register_gNB = &NGAP_REGISTER_GNB_REQ(msg_p); //Message Temporarily reuse
- RCconfig_NR_S1(msg_p, gnb_id);*/
+ LOG_I(GNB_APP,"default drx %d\n",ngap_register_gNB->default_drx);
+
+ itti_send_msg_to_task (TASK_NGAP, GNB_MODULE_ID_TO_INSTANCE(gnb_id), msg_p);
+ }
if (gnb_id == 0) RCconfig_nr_gtpu();
- /*s1ap_register_gNB = &S1AP_REGISTER_ENB_REQ(msg_p); //Message Temporarily reuse
- LOG_I(GNB_APP,"default drx %d\n",s1ap_register_gNB->default_drx);*/
-
- LOG_I(GNB_APP,"[gNB %d] gNB_app_register for instance %d\n", gnb_id, GNB_MODULE_ID_TO_INSTANCE(gnb_id));
-
- //itti_send_msg_to_task (TASK_S1AP, GNB_MODULE_ID_TO_INSTANCE(gnb_id), msg_p);
+ LOG_I(GNB_APP,"[gNB %d] gNB_app_register for instance %d\n", gnb_id, GNB_MODULE_ID_TO_INSTANCE(gnb_id));
register_gnb_pending++;
}
@@ -173,7 +176,7 @@ void *gNB_app_task(void *args_p)
__attribute__((unused)) uint32_t x2_register_gnb_pending = gNB_app_register_x2 (gnb_id_start, gnb_id_end);
}
- if (EPC_MODE_ENABLED) {
+ if (AMF_MODE_ENABLED) {
/* Try to register each gNB */
//registered_gnb = 0;
__attribute__((unused)) uint32_t register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);//, gnb_properties_p);
@@ -201,16 +204,16 @@ void *gNB_app_task(void *args_p)
break;
-/*
- case S1AP_REGISTER_ENB_CNF:
- LOG_I(GNB_APP, "[gNB %d] Received %s: associated MME %d\n", instance, msg_name,
- S1AP_REGISTER_ENB_CNF(msg_p).nb_mme);
+ case NGAP_REGISTER_GNB_CNF:
+ LOG_I(GNB_APP, "[gNB %d] Received %s: associated AMF %d\n", instance, msg_name,
+ NGAP_REGISTER_GNB_CNF(msg_p).nb_amf);
+/*
DevAssert(register_gnb_pending > 0);
register_gnb_pending--;
- // Check if at least gNB is registered with one MME
- if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) {
+ // Check if at least gNB is registered with one AMF
+ if (NGAP_REGISTER_GNB_CNF(msg_p).nb_amf > 0) {
registered_gnb++;
}
@@ -226,7 +229,7 @@ void *gNB_app_task(void *args_p)
} else {
uint32_t not_associated = gnb_nb - registered_gnb;
- LOG_W(GNB_APP, " %d gNB %s not associated with a MME, retrying registration in %d seconds ...\n",
+ LOG_W(GNB_APP, " %d gNB %s not associated with a AMF, retrying registration in %d seconds ...\n",
not_associated, not_associated > 1 ? "are" : "is", GNB_REGISTER_RETRY_DELAY);
// Restart the gNB registration process in GNB_REGISTER_RETRY_DELAY seconds
@@ -241,12 +244,12 @@ void *gNB_app_task(void *args_p)
}
}
}
-
- break;
*/
- case S1AP_DEREGISTERED_ENB_IND:
- LOG_W(GNB_APP, "[gNB %d] Received %s: associated MME %d\n", instance, msg_name,
- S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme);
+ break;
+
+ case NGAP_DEREGISTERED_GNB_IND:
+ LOG_W(GNB_APP, "[gNB %d] Received %s: associated AMF %d\n", instance, msg_name,
+ NGAP_DEREGISTERED_GNB_IND(msg_p).nb_amf);
/* TODO handle recovering of registration */
break;
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 82baf2aaa2..4435cff3be 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -38,6 +38,7 @@
#include "UTIL/OTG/otg_externs.h"
#include "intertask_interface.h"
#include "s1ap_eNB.h"
+#include "ngap_gNB.h"
#include "sctp_eNB_task.h"
#include "sctp_default_values.h"
// #include "SystemInformationBlockType2.h"
@@ -341,8 +342,8 @@ void RCconfig_nr_flexran()
/* gNB ID from configuration, as read in by RCconfig_RRC() */
if (!GNBParamList.paramarray[i][GNB_GNB_ID_IDX].uptr) {
// Calculate a default gNB ID
- if (EPC_MODE_ENABLED)
- gnb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8);
+ if (AMF_MODE_ENABLED)
+ gnb_id = i + (ngap_generate_gNB_id () & 0xFFFFFF8);
else
gnb_id = i;
} else {
@@ -535,7 +536,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
AssertFatal (i0,
"Failed to parse config file no active gNodeBs in %s \n", GNB_CONFIG_STRING_ACTIVE_GNBS);
-
sprintf(gtpupath,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
- config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);
-
+ config_get(GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);
+ config_get(NETParams,sizeof(NETParams)/sizeof(paramdef_t),gtpupath);
+ if (NETParams[0].strptr != NULL) { // SA
+ LOG_I(GTPU, "SA mode \n");
+ cidr = gnb_ipv4_address_for_NGU;
+ gnb_mode = 0;
+ } else {// NSA
+ LOG_I(GTPU, "NSA mode \n");
cidr = gnb_ipv4_address_for_S1U;
+ gnb_mode = 1;
+ }
+
address = strtok(cidr, "/");
-
+
if (address) {
MessageDef *message;
AssertFatal((message = itti_alloc_new_message(TASK_GNB_APP, GTPV1U_ENB_S1_REQ))!=NULL,"");
@@ -707,18 +719,25 @@ int RCconfig_nr_gtpu(void ) {
// LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
- IPV4_STR_ADDR_TO_INT_NWBO ( address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
- LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
- GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_S1U;
+ if (gnb_mode == 1) { // NSA
+ IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
+ LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
+ GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_S1U;
+ } else {// TODO SA
+ IPV4_STR_ADDR_TO_INT_NWBO (address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR gNB NG_U !\n" );
+ LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
+ GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = gnb_port_for_NGU;
+ }
+
itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
} else
- LOG_E(GTPU,"invalid address for S1U\n");
+ LOG_E(GTPU,"invalid address for NGU\n");
return 0;
}
-int RCconfig_NR_S1(MessageDef *msg_p, uint32_t i) {
+int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i) {
int j,k = 0;
int gnb_id;
@@ -741,7 +760,7 @@ int RCconfig_NR_S1(MessageDef *msg_p, uint32_t i) {
config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL);
/*
- if (EPC_MODE_ENABLED) {
+ if (AMF_MODE_ENABLED) {
if (strcasecmp( *(GNBSParams[GNB_ASN1_VERBOSITY_IDX].strptr), GNB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) {
asn_debug = 0;
asn1_xer_print = 0;
@@ -766,56 +785,61 @@ int RCconfig_NR_S1(MessageDef *msg_p, uint32_t i) {
if (GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt>0) {
// Output a list of all gNBs.
config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL);
-
if (GNBParamList.numelt > 0) {
for (k = 0; k < GNBParamList.numelt; k++) {
- if (GNBParamList.paramarray[k][GNB_GNB_ID_IDX].uptr == NULL) {
- // Calculate a default gNB ID
- if (EPC_MODE_ENABLED) {
- uint32_t hash;
-
- hash = s1ap_generate_eNB_id ();
- gnb_id = k + (hash & 0xFFFF8);
- } else {
- gnb_id = k;
- }
- } else {
+ if (GNBParamList.paramarray[k][GNB_GNB_ID_IDX].uptr == NULL) {
+ // Calculate a default gNB ID
+ if (AMF_MODE_ENABLED) {
+ uint32_t hash;
+
+ hash = ngap_generate_gNB_id ();
+ gnb_id = k + (hash & 0xFFFFFF8);
+ } else {
+ gnb_id = k;
+ }
+ } else {
gnb_id = *(GNBParamList.paramarray[k][GNB_GNB_ID_IDX].uptr);
}
- // search if in active list
- for (j=0; j < GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; j++) {
- if (strcmp(GNBSParams[GNB_ACTIVE_GNBS_IDX].strlistptr[j], *(GNBParamList.paramarray[k][GNB_GNB_NAME_IDX].strptr)) == 0) {
+ // search if in active list
+ for (j=0; j < GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; j++) {
+ if (strcmp(GNBSParams[GNB_ACTIVE_GNBS_IDX].strlistptr[j], *(GNBParamList.paramarray[k][GNB_GNB_NAME_IDX].strptr)) == 0) {
paramdef_t PLMNParams[] = GNBPLMNPARAMS_DESC;
paramlist_def_t PLMNParamList = {GNB_CONFIG_STRING_PLMN_LIST, NULL, 0};
+ paramdef_t SNSSAIParams[] = GNBSNSSAIPARAMS_DESC;
+ paramlist_def_t SNSSAIParamList = {GNB_CONFIG_STRING_SNSSAI_LIST, NULL, 0};
/* map parameter checking array instances to parameter definition array instances */
checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
+ checkedparam_t config_check_SNSSAIParams [] = SNSSAIPARAMS_CHECK;
for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
+ for (int J = 0; J < sizeof(SNSSAIParams) / sizeof(paramdef_t); ++J)
+ SNSSAIParams[J].chkPptr = &(config_check_SNSSAIParams[J]);
- paramdef_t S1Params[] = GNBS1PARAMS_DESC;
- paramlist_def_t S1ParamList = {GNB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
-
- paramdef_t SCTPParams[] = GNBSCTPPARAMS_DESC;
- paramdef_t NETParams[] = GNBNETPARAMS_DESC;
- char aprefix[MAX_OPTNAME_SIZE*2 + 8];
-
- S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = gnb_id;
-
- if (strcmp(*(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr), "CELL_MACRO_GNB") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB;
- } else if (strcmp(*(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr), "CELL_HOME_GNB") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
- } else {
- AssertFatal (0,
- "Failed to parse gNB configuration file %s, gnb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_GNB or CELL_HOME_GNB !\n",
- RC.config_file_name, i, *(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr));
- }
-
- S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(GNBParamList.paramarray[k][GNB_GNB_NAME_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).tac = *GNBParamList.paramarray[k][GNB_TRACKING_AREA_CODE_IDX].uptr;
+ paramdef_t NGParams[] = GNBNGPARAMS_DESC;
+ paramlist_def_t NGParamList = {GNB_CONFIG_STRING_AMF_IP_ADDRESS,NULL,0};
+
+ paramdef_t SCTPParams[] = GNBSCTPPARAMS_DESC;
+ paramdef_t NETParams[] = GNBNETPARAMS_DESC;
+ char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+ sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, k);
+
+ NGAP_REGISTER_GNB_REQ (msg_p).gNB_id = gnb_id;
+
+ if (strcmp(*(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr), "CELL_MACRO_GNB") == 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).cell_type = CELL_MACRO_GNB;
+ } else if (strcmp(*(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr), "CELL_HOME_GNB") == 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).cell_type = CELL_HOME_ENB;
+ } else {
+ AssertFatal (0,
+ "Failed to parse gNB configuration file %s, gnb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_GNB or CELL_HOME_GNB !\n",
+ RC.config_file_name, i, *(GNBParamList.paramarray[k][GNB_CELL_TYPE_IDX].strptr));
+ }
+
+ NGAP_REGISTER_GNB_REQ (msg_p).gNB_name = strdup(*(GNBParamList.paramarray[k][GNB_GNB_NAME_IDX].strptr));
+ NGAP_REGISTER_GNB_REQ (msg_p).tac = *GNBParamList.paramarray[k][GNB_TRACKING_AREA_CODE_IDX].uptr;
AssertFatal(!GNBParamList.paramarray[k][GNB_MOBILE_COUNTRY_CODE_IDX_OLD].strptr
&& !GNBParamList.paramarray[k][GNB_MOBILE_NETWORK_CODE_IDX_OLD].strptr,
"It seems that you use an old configuration file. Please change the existing\n"
@@ -831,100 +855,116 @@ int RCconfig_NR_S1(MessageDef *msg_p, uint32_t i) {
AssertFatal(0, "The number of PLMN IDs must be in [1,6], but is %d\n",
PLMNParamList.numelt);
- S1AP_REGISTER_ENB_REQ(msg_p).num_plmn = PLMNParamList.numelt;
+ NGAP_REGISTER_GNB_REQ(msg_p).num_plmn = PLMNParamList.numelt;
for (int l = 0; l < PLMNParamList.numelt; ++l) {
-
- S1AP_REGISTER_ENB_REQ (msg_p).mcc[l] = *PLMNParamList.paramarray[l][GNB_MOBILE_COUNTRY_CODE_IDX].uptr;
- S1AP_REGISTER_ENB_REQ (msg_p).mnc[l] = *PLMNParamList.paramarray[l][GNB_MOBILE_NETWORK_CODE_IDX].uptr;
- S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][GNB_MNC_DIGIT_LENGTH].u8ptr;
- S1AP_REGISTER_ENB_REQ (msg_p).default_drx = 0;
- AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length[l] == 2) ||
- (S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length[l] == 3),
- "BAD MNC DIGIT LENGTH %d",
- S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length[l]);
- }
- sprintf(aprefix,"%s.[%i]",GNB_CONFIG_STRING_GNB_LIST,k);
- config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix);
-
- S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
-
- for (int l = 0; l < S1ParamList.numelt; l++) {
-
- S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1;
-
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][GNB_MME_IPV4_ADDRESS_IDX].strptr));
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][GNB_MME_IPV6_ADDRESS_IDX].strptr));
+ char snssaistr[MAX_OPTNAME_SIZE*2 + 8];
+ sprintf(snssaistr, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, k, GNB_CONFIG_STRING_PLMN_LIST, l);
+ config_getlist(&SNSSAIParamList, SNSSAIParams, sizeof(SNSSAIParams)/sizeof(paramdef_t), snssaistr);
- if (strcmp(*(S1ParamList.paramarray[l][GNB_MME_IP_ADDRESS_ACTIVE_IDX].strptr), "yes") == 0) {
- }
- if (strcmp(*(S1ParamList.paramarray[l][GNB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
- } else if (strcmp(*(S1ParamList.paramarray[l][GNB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
- } else if (strcmp(*(S1ParamList.paramarray[l][GNB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
- }
+ NGAP_REGISTER_GNB_REQ (msg_p).mcc[l] = *PLMNParamList.paramarray[l][GNB_MOBILE_COUNTRY_CODE_IDX].uptr;
+ NGAP_REGISTER_GNB_REQ (msg_p).mnc[l] = *PLMNParamList.paramarray[l][GNB_MOBILE_NETWORK_CODE_IDX].uptr;
+ NGAP_REGISTER_GNB_REQ (msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][GNB_MNC_DIGIT_LENGTH].u8ptr;
+ NGAP_REGISTER_GNB_REQ (msg_p).default_drx = 0;
+ AssertFatal((NGAP_REGISTER_GNB_REQ (msg_p).mnc_digit_length[l] == 2) ||
+ (NGAP_REGISTER_GNB_REQ (msg_p).mnc_digit_length[l] == 3),
+ "BAD MNC DIGIT LENGTH %d",
+ NGAP_REGISTER_GNB_REQ (msg_p).mnc_digit_length[l]);
+
+ NGAP_REGISTER_GNB_REQ (msg_p).num_nssai[l] = SNSSAIParamList.numelt;
+ for (int s = 0; s < SNSSAIParamList.numelt; ++s) {
+
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sST = *SNSSAIParamList.paramarray[s][GNB_SLICE_SERIVE_TYPE_IDX].uptr;
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sD_flag = 0;
+ if(*SNSSAIParamList.paramarray[s][GNB_SLICE_DIFFERENTIATOR_IDX].uptr != 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sD_flag = 1;
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sD[0] = (*SNSSAIParamList.paramarray[s][GNB_SLICE_DIFFERENTIATOR_IDX].uptr & 0xFF0000) >> 16;
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sD[1] = (*SNSSAIParamList.paramarray[s][GNB_SLICE_DIFFERENTIATOR_IDX].uptr & 0x00FF00) >> 8;
+ NGAP_REGISTER_GNB_REQ (msg_p).s_nssai[l][s].sD[2] = (*SNSSAIParamList.paramarray[s][GNB_SLICE_DIFFERENTIATOR_IDX].uptr & 0x0000FF);
+ }
+ }
+ }
+ sprintf(aprefix,"%s.[%i]",GNB_CONFIG_STRING_GNB_LIST,k);
+ config_getlist( &NGParamList,NGParams,sizeof(NGParams)/sizeof(paramdef_t),aprefix);
+
+ NGAP_REGISTER_GNB_REQ (msg_p).nb_amf = 0;
+
+ for (int l = 0; l < NGParamList.numelt; l++) {
+
+ NGAP_REGISTER_GNB_REQ (msg_p).nb_amf += 1;
+
+ strcpy(NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[l].ipv4_address,*(NGParamList.paramarray[l][GNB_AMF_IPV4_ADDRESS_IDX].strptr));
+ strcpy(NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[l].ipv6_address,*(NGParamList.paramarray[l][GNB_AMF_IPV6_ADDRESS_IDX].strptr));
- if (S1ParamList.paramarray[l][GNB_MME_BROADCAST_PLMN_INDEX].iptr)
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] = S1ParamList.paramarray[l][GNB_MME_BROADCAST_PLMN_INDEX].numelt;
+ if (strcmp(*(NGParamList.paramarray[l][GNB_AMF_IP_ADDRESS_ACTIVE_IDX].strptr), "yes") == 0) {
+ }
+ if (strcmp(*(NGParamList.paramarray[l][GNB_AMF_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[j].ipv4 = 1;
+ } else if (strcmp(*(NGParamList.paramarray[l][GNB_AMF_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[j].ipv6 = 1;
+ } else if (strcmp(*(NGParamList.paramarray[l][GNB_AMF_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
+ NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[j].ipv4 = 1;
+ NGAP_REGISTER_GNB_REQ (msg_p).amf_ip_address[j].ipv6 = 1;
+ }
+
+ if (NGParamList.paramarray[l][GNB_AMF_BROADCAST_PLMN_INDEX].iptr)
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] = NGParamList.paramarray[l][GNB_AMF_BROADCAST_PLMN_INDEX].numelt;
else
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] = 0;
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] = 0;
- AssertFatal(S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] <= S1AP_REGISTER_ENB_REQ(msg_p).num_plmn,
- "List of broadcast PLMN to be sent to MME can not be longer than actual "
+ AssertFatal(NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] <= NGAP_REGISTER_GNB_REQ(msg_p).num_plmn,
+ "List of broadcast PLMN to be sent to AMF can not be longer than actual "
"PLMN list (max %d, but is %d)\n",
- S1AP_REGISTER_ENB_REQ(msg_p).num_plmn,
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l]);
+ NGAP_REGISTER_GNB_REQ(msg_p).num_plmn,
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l]);
- for (int el = 0; el < S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l]; ++el) {
+ for (int el = 0; el < NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l]; ++el) {
/* UINTARRAY gets mapped to int, see config_libconfig.c:223 */
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_index[l][el] = S1ParamList.paramarray[l][GNB_MME_BROADCAST_PLMN_INDEX].iptr[el];
- AssertFatal(S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_index[l][el] >= 0
- && S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_index[l][el] < S1AP_REGISTER_ENB_REQ(msg_p).num_plmn,
- "index for MME's MCC/MNC (%d) is an invalid index for the registered PLMN IDs (%d)\n",
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_index[l][el],
- S1AP_REGISTER_ENB_REQ(msg_p).num_plmn);
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_index[l][el] = NGParamList.paramarray[l][GNB_AMF_BROADCAST_PLMN_INDEX].iptr[el];
+ AssertFatal(NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_index[l][el] >= 0
+ && NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_index[l][el] < NGAP_REGISTER_GNB_REQ(msg_p).num_plmn,
+ "index for AMF's MCC/MNC (%d) is an invalid index for the registered PLMN IDs (%d)\n",
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_index[l][el],
+ NGAP_REGISTER_GNB_REQ(msg_p).num_plmn);
}
/* if no broadcasst_plmn array is defined, fill default values */
- if (S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] == 0) {
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_num[l] = S1AP_REGISTER_ENB_REQ(msg_p).num_plmn;
+ if (NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] == 0) {
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_num[l] = NGAP_REGISTER_GNB_REQ(msg_p).num_plmn;
- for (int el = 0; el < S1AP_REGISTER_ENB_REQ(msg_p).num_plmn; ++el)
- S1AP_REGISTER_ENB_REQ(msg_p).broadcast_plmn_index[l][el] = el;
+ for (int el = 0; el < NGAP_REGISTER_GNB_REQ(msg_p).num_plmn; ++el)
+ NGAP_REGISTER_GNB_REQ(msg_p).broadcast_plmn_index[l][el] = el;
}
-
- }
+
+ }
-
- // SCTP SETTING
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS;
- if (EPC_MODE_ENABLED) {
- sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,k,GNB_CONFIG_STRING_SCTP_CONFIG);
- config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[GNB_SCTP_INSTREAMS_IDX].uptr);
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[GNB_SCTP_OUTSTREAMS_IDX].uptr);
- }
+
+ // SCTP SETTING
+ NGAP_REGISTER_GNB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
+ NGAP_REGISTER_GNB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS;
+ if (AMF_MODE_ENABLED) {
+ sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,k,GNB_CONFIG_STRING_SCTP_CONFIG);
+ config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
+ NGAP_REGISTER_GNB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[GNB_SCTP_INSTREAMS_IDX].uptr);
+ NGAP_REGISTER_GNB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[GNB_SCTP_OUTSTREAMS_IDX].uptr);
+ }
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,k,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
- // NETWORK_INTERFACES
+ // NETWORK_INTERFACES
config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
-
- // S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
- cidr = *(NETParams[GNB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr);
- address = strtok(cidr, "/");
-
- S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0;
- S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1;
-
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address);
-
- break;
- }
- }
+
+ // NGAP_REGISTER_GNB_REQ (msg_p).enb_interface_name_for_NGU = strdup(enb_interface_name_for_NGU);
+ cidr = *(NETParams[GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX].strptr);
+ address = strtok(cidr, "/");
+
+ NGAP_REGISTER_GNB_REQ (msg_p).gnb_ip_address.ipv6 = 0;
+ NGAP_REGISTER_GNB_REQ (msg_p).gnb_ip_address.ipv4 = 1;
+
+ strcpy(NGAP_REGISTER_GNB_REQ (msg_p).gnb_ip_address.ipv4_address, address);
+
+ break;
+ }
+ }
}
}
}
@@ -1021,10 +1061,10 @@ int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i) {
for (k = 0; k < GNBParamList.numelt; k++) {
if (GNBParamList.paramarray[k][GNB_GNB_ID_IDX].uptr == NULL) {
// Calculate a default eNB ID
- if (EPC_MODE_ENABLED) {
+ if (AMF_MODE_ENABLED) {
uint32_t hash;
- hash = s1ap_generate_eNB_id ();
- gnb_id = k + (hash & 0xFFFF8);
+ hash = ngap_generate_gNB_id ();
+ gnb_id = k + (hash & 0xFFFFFF8);
} else {
gnb_id = k;
}
@@ -1150,7 +1190,7 @@ int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i) {
X2AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS;
- if (EPC_MODE_ENABLED) {
+ if (AMF_MODE_ENABLED) {
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,k,GNB_CONFIG_STRING_SCTP_CONFIG);
config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[GNB_SCTP_INSTREAMS_IDX].uptr);
diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h
index e2588d9e4d..0d965171ef 100644
--- a/openair2/GNB_APP/gnb_config.h
+++ b/openair2/GNB_APP/gnb_config.h
@@ -39,6 +39,7 @@
#include "platform_constants.h"
#include "PHY/defs_eNB.h"
#include "s1ap_messages_types.h"
+#include "ngap_messages_types.h"
#ifdef CMAKER
#include "rrc_messages_types.h"
@@ -102,7 +103,7 @@ extern void NRRCConfig(void);
//void ru_config_display(void);
void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc);
-int RCconfig_NR_S1(MessageDef *msg_p, uint32_t i);
+int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i);
int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i);
#endif /* GNB_CONFIG_H_ */
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 84da1de530..b4ce7c325f 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -150,7 +150,7 @@ typedef struct ccparams_nr_x2 {
{GNB_CONFIG_STRING_GNB_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_CELL_TYPE, NULL, 0, strptr:NULL, defstrval:"CELL_MACRO_GNB", TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_GNB_NAME, NULL, 0, strptr:NULL, defstrval:"OAIgNodeB", TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_TRACKING_AREA_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_TRACKING_AREA_CODE, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_MOBILE_COUNTRY_CODE_OLD, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_MOBILE_NETWORK_CODE_OLD, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \
@@ -236,38 +236,58 @@ typedef struct ccparams_nr_x2 {
}
+/* SNSSAI ID configuration */
+#define GNB_CONFIG_STRING_SNSSAI_LIST "snssaiList"
+#define GNB_CONFIG_STRING_SLICE_SERIVE_TYPE "sst"
+#define GNB_CONFIG_STRING_SLICE_DIFFERENTIATOR "sd"
-/* MME configuration parameters section name */
-#define GNB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address"
+#define GNB_SLICE_SERIVE_TYPE_IDX 0
+#define GNB_SLICE_DIFFERENTIATOR_IDX 1
+
+#define GNBSNSSAIPARAMS_DESC { \
+/* optname helpstr paramflags XXXptr def val type numelt */ \
+ {GNB_CONFIG_STRING_SLICE_SERIVE_TYPE, "slice serive type", 0, uptr:NULL, defuintval:1, TYPE_UINT, 0}, \
+ {GNB_CONFIG_STRING_SLICE_DIFFERENTIATOR, "slice differentiator", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \
+}
+
+#define SLICE_SERIVE_TYPE_OKRANGES {1,2,3,4}
+
+#define SNSSAIPARAMS_CHECK { \
+ { .s1 = { config_check_intval, SLICE_SERIVE_TYPE_OKRANGES, 4 } }, \
+ { .s5 = { NULL } }, \
+}
+
+/* AMF configuration parameters section name */
+#define GNB_CONFIG_STRING_AMF_IP_ADDRESS "amf_ip_address"
/* SRB1 configuration parameters names */
-#define GNB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4"
-#define GNB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6"
-#define GNB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active"
-#define GNB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference"
-#define GNB_CONFIG_STRING_MME_BROADCAST_PLMN_INDEX "broadcast_plmn_index"
+#define GNB_CONFIG_STRING_AMF_IPV4_ADDRESS "ipv4"
+#define GNB_CONFIG_STRING_AMF_IPV6_ADDRESS "ipv6"
+#define GNB_CONFIG_STRING_AMF_IP_ADDRESS_ACTIVE "active"
+#define GNB_CONFIG_STRING_AMF_IP_ADDRESS_PREFERENCE "preference"
+#define GNB_CONFIG_STRING_AMF_BROADCAST_PLMN_INDEX "broadcast_plmn_index"
/*-------------------------------------------------------------------------------------------------------------------------------------*/
/* MME configuration parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*-------------------------------------------------------------------------------------------------------------------------------------*/
-#define GNBS1PARAMS_DESC { \
-{GNB_CONFIG_STRING_MME_IPV4_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_MME_IPV6_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+#define GNBNGPARAMS_DESC { \
+{GNB_CONFIG_STRING_AMF_IPV4_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_AMF_IPV6_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_AMF_IP_ADDRESS_ACTIVE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_AMF_IP_ADDRESS_PREFERENCE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
}
-#define GNB_MME_IPV4_ADDRESS_IDX 0
-#define GNB_MME_IPV6_ADDRESS_IDX 1
-#define GNB_MME_IP_ADDRESS_ACTIVE_IDX 2
-#define GNB_MME_IP_ADDRESS_PREFERENCE_IDX 3
-#define GNB_MME_BROADCAST_PLMN_INDEX 4
+#define GNB_AMF_IPV4_ADDRESS_IDX 0
+#define GNB_AMF_IPV6_ADDRESS_IDX 1
+#define GNB_AMF_IP_ADDRESS_ACTIVE_IDX 2
+#define GNB_AMF_IP_ADDRESS_PREFERENCE_IDX 3
+#define GNB_AMF_BROADCAST_PLMN_INDEX 4
/*---------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------*/
/* SCTP configuration parameters section name */
@@ -295,11 +315,11 @@ typedef struct ccparams_nr_x2 {
/* S1 interface configuration parameters section name */
#define GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES"
-#define GNB_INTERFACE_NAME_FOR_S1_MME_IDX 0
-#define GNB_IPV4_ADDRESS_FOR_S1_MME_IDX 1
-#define GNB_INTERFACE_NAME_FOR_S1U_IDX 2
-#define GNB_IPV4_ADDR_FOR_S1U_IDX 3
-#define GNB_PORT_FOR_S1U_IDX 4
+#define GNB_INTERFACE_NAME_FOR_NG_AMF_IDX 0
+#define GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX 1
+#define GNB_INTERFACE_NAME_FOR_NGU_IDX 2
+#define GNB_IPV4_ADDR_FOR_NGU_IDX 3
+#define GNB_PORT_FOR_NGU_IDX 4
#define GNB_IPV4_ADDR_FOR_X2C_IDX 5
#define GNB_PORT_FOR_X2C_IDX 6
@@ -307,9 +327,15 @@ typedef struct ccparams_nr_x2 {
#define GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_S1_MME "GNB_INTERFACE_NAME_FOR_S1_MME"
#define GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1_MME "GNB_IPV4_ADDRESS_FOR_S1_MME"
#define GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_S1U "GNB_INTERFACE_NAME_FOR_S1U"
-#define GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_S1U "GNB_IPV4_ADDRESS_FOR_S1U"
+#define GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1U "GNB_IPV4_ADDRESS_FOR_S1U"
#define GNB_CONFIG_STRING_GNB_PORT_FOR_S1U "GNB_PORT_FOR_S1U"
+#define GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_NG_AMF "GNB_INTERFACE_NAME_FOR_NG_AMF"
+#define GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_NG_AMF "GNB_IPV4_ADDRESS_FOR_NG_AMF"
+#define GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_NGU "GNB_INTERFACE_NAME_FOR_NGU"
+#define GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU "GNB_IPV4_ADDRESS_FOR_NGU"
+#define GNB_CONFIG_STRING_GNB_PORT_FOR_NGU "GNB_PORT_FOR_NGU"
+
/* X2 interface configuration parameters names */
#define GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C "GNB_IPV4_ADDRESS_FOR_X2C"
#define GNB_CONFIG_STRING_ENB_PORT_FOR_X2C "GNB_PORT_FOR_X2C"
@@ -319,11 +345,11 @@ typedef struct ccparams_nr_x2 {
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*--------------------------------------------------------------------------------------------------------------------------------------------------*/
#define GNBNETPARAMS_DESC { \
-{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_S1_MME, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1_MME, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_GNB_PORT_FOR_S1U, NULL, 0, uptr:NULL, defintval:2152L, TYPE_UINT, 0}, \
+{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_NG_AMF, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_NG_AMF, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_NGU, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_PORT_FOR_NGU, NULL, 0, uptr:NULL, defintval:2152L, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_X2C, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_ENB_PORT_FOR_X2C, NULL, 0, uptr:NULL, defintval:0L, TYPE_UINT, 0} \
}
@@ -335,8 +361,11 @@ typedef struct ccparams_nr_x2 {
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define GNBGTPUPARAMS_DESC { \
+{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_NGU, NULL, 0, strptr:&gnb_interface_name_for_NGU, defstrval:"lo", TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_NGU, NULL, 0, strptr:&gnb_ipv4_address_for_NGU, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_PORT_FOR_NGU, NULL, 0, uptr:&gnb_port_for_NGU, defintval:2152, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_GNB_INTERFACE_NAME_FOR_S1U, NULL, 0, strptr:&gnb_interface_name_for_S1U, defstrval:"lo", TYPE_STRING, 0}, \
-{GNB_CONFIG_STRING_GNB_IPV4_ADDR_FOR_S1U, NULL, 0, strptr:&gnb_ipv4_address_for_S1U, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
+{GNB_CONFIG_STRING_GNB_IPV4_ADDRESS_FOR_S1U, NULL, 0, strptr:&gnb_ipv4_address_for_S1U, defstrval:"127.0.0.1", TYPE_STRING, 0}, \
{GNB_CONFIG_STRING_GNB_PORT_FOR_S1U, NULL, 0, uptr:&gnb_port_for_S1U, defintval:2152, TYPE_UINT, 0} \
}
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 5609b44067..876fef9dbc 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1888,7 +1888,8 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
}
uint8_t N_sh_symb = pdsch_rel15->NrOfSymbols;
uint8_t Imcs = pdsch_rel15->mcsIndex[0];
- uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS - N_PRB_oh;
+ uint16_t dmrs_length = get_num_dmrs(pdsch_rel15->dlDmrsSymbPos);
+ uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS*dmrs_length - N_PRB_oh;
LOG_D(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh);
uint16_t R;
@@ -1905,10 +1906,10 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
TBS = nr_compute_tbs(Qm,
R,
- pdsch_rel15->rbSize,
- N_sh_symb,
- N_PRB_DMRS, // FIXME // This should be multiplied by the number of dmrs symbols
- N_PRB_oh,
+ pdsch_rel15->rbSize,
+ N_sh_symb,
+ N_PRB_DMRS*dmrs_length,
+ N_PRB_oh,
tb_scaling,
pdsch_rel15->nrOfLayers)>>3;
@@ -2793,6 +2794,8 @@ int16_t fill_dmrs_mask(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,i
if (NrOfSymbols < 13 && *dmrs_config->dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition!=NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1) return(1<dmrs_AdditionalPosition==NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0) return(1<dmrs_AdditionalPosition==NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1) return(1<dmrs_DownlinkForPDSCH_MappingTypeB &&
@@ -2855,3 +2858,72 @@ int binomial(int n, int k) {
return c;
}
+/* extract PTRS values from RC and validate it based upon 38.214 5.1.6.3 */
+bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
+ uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,
+ uint8_t *portIndex,uint8_t *nERatio, uint8_t *reOffset,
+ uint8_t NrOfSymbols)
+{
+ bool valid = true;
+
+ /* as defined in T 38.214 5.1.6.3 */
+ if(rbSize < 3) {
+ valid = false;
+ return valid;
+ }
+ /* Check for Frequency Density values */
+ if(ptrs_config->frequencyDensity->list.count < 2) {
+ /* Default value for K_PTRS = 2 as defined in T 38.214 5.1.6.3 */
+ *K_ptrs = 2;
+ }
+ else {
+ *K_ptrs = get_K_ptrs(*ptrs_config->frequencyDensity->list.array[0],
+ *ptrs_config->frequencyDensity->list.array[1],
+ rbSize);
+ }
+ /* Check for time Density values */
+ if(ptrs_config->timeDensity->list.count < 3) {
+ /* Default value for L_PTRS = 1 as defined in T 38.214 5.1.6.3 */
+ *L_ptrs = 1;
+ }
+ else {
+ *L_ptrs = get_L_ptrs(*ptrs_config->timeDensity->list.array[0],
+ *ptrs_config->timeDensity->list.array[1],
+ *ptrs_config->timeDensity->list.array[2],
+ mcsIndex,
+ mcsTable);
+ }
+ *portIndex =*ptrs_config->epre_Ratio;
+ *nERatio = *ptrs_config->resourceElementOffset;
+ *reOffset = 0;
+ /* If either or both of the parameters PT-RS time density (LPT-RS) and PT-RS frequency density (KPT-RS), shown in Table
+ * 5.1.6.3-1 and Table 5.1.6.3-2, indicates that 'PT-RS not present', the UE shall assume that PT-RS is not present
+ */
+ if(*K_ptrs ==2 || *K_ptrs ==4 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ if(*L_ptrs ==0 || *L_ptrs ==1 || *L_ptrs ==2 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ /* PTRS is not present also :
+ * When the UE is receiving a PDSCH with allocation duration of 4 symbols and if LPT-RS is set to 4, the UE shall assume
+ * PT-RS is not transmitted
+ * When the UE is receiving a PDSCH with allocation duration of 2 symbols as defined in Clause 7.4.1.1.2 of [4, TS
+ * 38.211] and if LPT-RS is set to 2 or 4, the UE shall assume PT-RS is not transmitted.
+ */
+ if((NrOfSymbols == 4 && *L_ptrs ==2) || ((NrOfSymbols == 2 && *L_ptrs > 0))) {
+ valid = false;
+ return valid;
+ }
+ //printf("[MAC] PTRS is set K= %u L= %u\n", *K_ptrs,1<<*L_ptrs);
+ return valid;
+}
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index 520261e5c5..2be97ba8f6 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -185,4 +185,10 @@ uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint
uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB);
int16_t get_N_RA_RB (int delta_f_RA_PRACH,int delta_f_PUSCH);
+
+bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
+ uint16_t rbSize, uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,uint8_t *portIndex,
+ uint8_t *nERatio,uint8_t *reOffset,
+ uint8_t NrOfSymbols);
#endif
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index ab6a047500..1c5ff728f2 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -96,7 +96,8 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
@param module_id_t mod_id module ID
@param int cc_id CC ID
@param frame_t frame frame number
- @param int slot reference number */
+ @param int slot reference number
+ @param UE_nr_rxtx_proc_t *proc pointer to process context */
void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
fapi_nr_dl_config_request_t *dl_config,
fapi_nr_ul_config_request_t *ul_config,
@@ -104,7 +105,8 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
module_id_t mod_id,
int cc_id,
frame_t frame,
- int slot);
+ int slot,
+ int thread_id);
/* \brief Get SR payload (0,1) from UE MAC
@param Mod_id Instance id of UE in machine
@@ -211,9 +213,10 @@ and fills the PRACH PDU per each FD occasion.
@param module_idP Index of UE instance
@param frameP Frame index
@param slotP Slot index
+@param thread_id RX/TX Thread ID
@returns void
*/
-void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP);
+void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, int thread_id);
/* \brief This function schedules the Msg3 transmission
@param
@@ -264,7 +267,7 @@ andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4
@param CC_id Component Carrier Index
@param frame
@param gNB_id gNB index
-@param nr_tti_tx slot for PRACH transmission
+@param nr_slot_tx slot for PRACH transmission
@returns indication to generate PRACH to phy */
uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
fapi_nr_ul_config_prach_pdu *prach_pdu,
@@ -273,7 +276,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
UE_MODE_t UE_mode,
frame_t frame,
uint8_t gNB_id,
- int nr_tti_tx);
+ int nr_slot_tx);
/* \brief Function implementing the routine for the selection of Random Access resources (5.1.2 TS 38.321).
@param module_idP Index of UE instance
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index f54aa711f5..34b6d801c5 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -401,7 +401,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
UE_MODE_t UE_mode,
frame_t frame,
uint8_t gNB_id,
- int nr_tti_tx){
+ int nr_slot_tx){
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
@@ -489,9 +489,9 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
}
//mac->RA_tx_frame = frame;
- //mac->RA_tx_subframe = nr_tti_tx;
+ //mac->RA_tx_slot = nr_slot_tx;
//mac->RA_backoff_frame = frame;
- //mac->RA_backoff_subframe = nr_tti_tx;
+ //mac->RA_backoff_slot = nr_slot_tx;
if (size_sdu > 0) {
@@ -510,7 +510,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
// Fill in preamble and PRACH resources
if (mac->generate_nr_prach == 1)
- nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
+ nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer
(uint8_t *) payload, // UL MAC pdu pointer
@@ -544,7 +544,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
// - handle backoff and raResponseWindow params
// LOG_D(MAC, "[MAC][UE %d][RAPROC] frame %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n",
- // mod_id, frame, nr_tti_tx, mac->RA_window_cnt, mac->RA_tx_frame, mac->RA_tx_subframe);
+ // mod_id, frame, nr_slot_tx, mac->RA_window_cnt, mac->RA_tx_frame, mac->RA_tx_subframe);
if (mac->RA_BI_found){
prach_resources->RA_PREAMBLE_BACKOFF = prach_resources->RA_SCALING_FACTOR_BI * mac->RA_backoff_indicator;
@@ -564,7 +564,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
} else if (mac->RA_window_cnt == 0 && !mac->RA_RAPID_found) {
- LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: nr_tti_tx %d: RAR reception failed \n", mod_id, frame, nr_tti_tx);
+ LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: nr_slot_tx %d: RAR reception failed \n", mod_id, frame, nr_slot_tx);
mac->ra_state = RA_UE_IDLE;
mac->RA_PREAMBLE_TRANSMISSION_COUNTER++;
@@ -622,22 +622,22 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
// frame_diff = (sframe_t) frame - mac->RA_backoff_frame;
// if (frame_diff < 0) frame_diff = -frame_diff;
// mac->RA_backoff_frame = frame;
- // mac->RA_backoff_subframe = nr_tti_tx;
+ // mac->RA_backoff_slot = nr_slot_tx;
// }
// compute RA window parameters
// if (mac->RA_window_cnt > 0){
// frame_diff = (frame_t) frame - mac->RA_tx_frame;
// if (frame_diff < 0) frame_diff = -frame_diff;
- // mac->RA_window_cnt -= ((10 * frame_diff) + (nr_tti_tx - mac->RA_tx_subframe));
- // LOG_D(MAC, "[MAC][UE %d][RAPROC] Frame %d, subframe %d: RA Active, adjusted window cnt %d\n", mod_id, frame, nr_tti_tx, mac->RA_window_cnt);
+ // mac->RA_window_cnt -= ((10 * frame_diff) + (nr_slot_tx - mac->RA_tx_subframe));
+ // LOG_D(MAC, "[MAC][UE %d][RAPROC] Frame %d, subframe %d: RA Active, adjusted window cnt %d\n", mod_id, frame, nr_slot_tx, mac->RA_window_cnt);
// }
// mac->RA_tx_frame = frame;
- // mac->RA_tx_subframe = nr_tti_tx;
+ // mac->RA_tx_slot = nr_slot_tx;
// Fill in preamble and PRACH resources
if (mac->generate_nr_prach == 1)
- nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
+ nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
} else {
@@ -646,12 +646,12 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
LOG_D(MAC, "[MAC][UE %d][RAPROC][%d.%d]: RAR not received yet (RA window count %d) \n",
mod_id,
frame,
- nr_tti_tx,
+ nr_slot_tx,
mac->RA_window_cnt);
// Fill in preamble and PRACH resources
if (mac->generate_nr_prach == 1)
- nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
+ nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_slot_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 4c950a92e6..36a4c5fceb 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -185,6 +185,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
int ss_id;
uint8_t bwp_id = 1, coreset_id = 1;
+ //NR_ServingCellConfig_t *scd = mac->scg->spCellConfig->spCellConfigDedicated;
NR_BWP_Downlink_t *bwp = mac->DLbwp[bwp_id - 1];
#ifdef DEBUG_DCI
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index dc36fcd731..2cc5f38a39 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -775,7 +775,8 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
module_id_t mod_id,
int cc_id,
frame_t frame,
- int slot){
+ int slot,
+ int thread_id){
scheduled_response->dl_config = dl_config;
scheduled_response->ul_config = ul_config;
@@ -784,7 +785,7 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
scheduled_response->CC_id = cc_id;
scheduled_response->frame = frame;
scheduled_response->slot = slot;
-
+ scheduled_response->thread_id = thread_id;
}
uint32_t get_ssb_slot(uint32_t ssb_index){
@@ -1387,7 +1388,7 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
NR_TDD_UL_DL_Pattern_t *tdd_pattern = &mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1;
const int num_slots_per_tdd = nr_slots_per_frame[mu] >> (7 - tdd_pattern->dl_UL_TransmissionPeriodicity);
const int num_slots_ul = tdd_pattern->nrofUplinkSlots + (tdd_pattern->nrofUplinkSymbols!=0);
- int index = slot + num_slots_ul - num_slots_per_tdd;
+ int index = (slot + num_slots_ul - num_slots_per_tdd) % num_slots_per_tdd;
LOG_D(MAC, "nr_ue_procedures: get_ul_config_request() slots per tdd %d, num_slots_ul %d, index %d\n",
num_slots_per_tdd,
num_slots_ul,
@@ -1466,7 +1467,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
*/
dl_config->number_pdus = dl_config->number_pdus + 1;
- fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot);
+ fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
mac->if_module->scheduled_response(&scheduled_response);
}
@@ -1480,7 +1481,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
dcireq.dl_config_req.number_pdus = 0;
nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
- fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot);
+ fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
mac->if_module->scheduled_response(&scheduled_response);
}
@@ -1644,7 +1645,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
}
}
- fill_scheduled_response(&scheduled_response, NULL, ul_config_req, &tx_req, mod_id, cc_id, rx_frame, rx_slot);
+ fill_scheduled_response(&scheduled_response, NULL, ul_config_req, &tx_req, mod_id, cc_id, rx_frame, rx_slot, ul_info->thread_id);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
mac->if_module->scheduled_response(&scheduled_response);
}
@@ -1713,7 +1714,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
ul_config_list->pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
ul_config->number_pdus++;
// scheduled_response
- fill_scheduled_response(&scheduled_response, NULL, ul_config, &tx_req, ul_info->module_id, ul_info->cc_id, ul_info->frame_rx, ul_info->slot_rx);
+ fill_scheduled_response(&scheduled_response, NULL, ul_config, &tx_req, ul_info->module_id, ul_info->cc_id, ul_info->frame_rx, ul_info->slot_rx, ul_info->thread_id);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
mac->if_module->scheduled_response(&scheduled_response);
}
@@ -1768,7 +1769,7 @@ void nr_ue_msg3_scheduler(NR_UE_MAC_INST_t *mac,
// PRACH formats 9, 10, 11 are corresponding to dual PRACH format configurations A1/B1, A2/B2, A3/B3.
// - todo:
// - Partial configuration is actually already stored in (fapi_nr_prach_config_t) &mac->phy_config.config_req->prach_config
-void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) {
+void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, int thread_id) {
uint16_t format, format0, format1, ncs;
int is_nr_prach_slot;
@@ -1896,7 +1897,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
} // if format1
} // is_nr_prach_slot
- fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP);
+ fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
mac->if_module->scheduled_response(&scheduled_response);
} // if is_nr_UL_slot
@@ -1962,7 +1963,7 @@ uint16_t nr_dci_format_size (PHY_VARS_NR_UE *ue,
csi_MeasConfig_t csi_MeasConfig = ue->csi_MeasConfig;
PUSCH_ServingCellConfig_t PUSCH_ServingCellConfig= ue->PUSCH_ServingCellConfig;
PDSCH_ServingCellConfig_t PDSCH_ServingCellConfig= ue->PDSCH_ServingCellConfig;
- NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
+ NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[proc->thread_id][eNB_id];
// 1 CARRIER_IN
// crossCarrierSchedulingConfig from higher layers, variable crossCarrierSchedulingConfig indicates if 'cross carrier scheduling' is enabled or not:
// if No cross carrier scheduling: number of bits for CARRIER_IND is 0
@@ -2089,7 +2090,7 @@ uint16_t nr_dci_format_size (PHY_VARS_NR_UE *ue,
(dynamic_prb_BundlingType2==dy_2_n4)||(dynamic_prb_BundlingType2==dy_2_wideband)) prb_BundlingType_size=1;
// 15 RATE_MATCHING_IND FIXME!!!
- // according to TS 38.212: Rate matching indicator – 0, 1, or 2 bits according to higher layer parameter rateMatchPattern
+ // according to TS 38.212: Rate matching indicator E0, 1, or 2 bits according to higher layer parameter rateMatchPattern
uint8_t rateMatching_bits = pdsch_config.n_rateMatchPatterns;
// 16 ZP_CSI_RS_TRIGGER FIXME!!!
// 0, 1, or 2 bits as defined in Subclause 5.1.4.2 of [6, TS 38.214].
@@ -2232,7 +2233,7 @@ uint16_t nr_dci_format_size (PHY_VARS_NR_UE *ue,
// 2 bits otherwise
uint8_t ptrs_dmrs_bits=0; //FIXME!!!
// 46 BETA_OFFSET_IND
- // at IE PUSCH-Config, beta_offset indicator – 0 if the higher layer parameter betaOffsets = semiStatic; otherwise 2 bits
+ // at IE PUSCH-Config, beta_offset indicator E0 if the higher layer parameter betaOffsets = semiStatic; otherwise 2 bits
// uci-OnPUSCH
// Selection between and configuration of dynamic and semi-static beta-offset. If the field is absent or released, the UE applies the value 'semiStatic' and the BetaOffsets
uint8_t betaOffsets = 0;
@@ -2890,6 +2891,13 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
dlsch_config_pdu->number_rbs = NRRIV2BW(riv,n_RB_DLBWP);
dlsch_config_pdu->start_rb = NRRIV2PRBOFFSET(riv,n_RB_DLBWP);
+ // Sanity check in case a false or erroneous DCI is received
+ if ((dlsch_config_pdu->number_rbs < 1 ) || (dlsch_config_pdu->number_rbs > n_RB_DLBWP - dlsch_config_pdu->start_rb)) {
+ // DCI is invalid!
+ LOG_W(MAC, "Frequency domain assignment values are invalid! #RBs: %d, Start RB: %d, n_RB_DLBWP: %d \n", dlsch_config_pdu->number_rbs, dlsch_config_pdu->start_rb, n_RB_DLBWP);
+ return -1;
+ }
+
}
if(pusch_config_pdu != NULL){
/*
@@ -2904,6 +2912,14 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
pusch_config_pdu->rb_size = NRRIV2BW(riv,n_RB_ULBWP);
pusch_config_pdu->rb_start = NRRIV2PRBOFFSET(riv,n_RB_ULBWP);
+
+ // Sanity check in case a false or erroneous DCI is received
+ if ((pusch_config_pdu->rb_size < 1) || (pusch_config_pdu->rb_size > n_RB_ULBWP - pusch_config_pdu->rb_start)) {
+ // DCI is invalid!
+ LOG_W(MAC, "Frequency domain assignment values are invalid! #RBs: %d, Start RB: %d, n_RB_ULBWP: %d \n",pusch_config_pdu->rb_size, pusch_config_pdu->rb_start, n_RB_ULBWP);
+ return -1;
+ }
+
}
return 0;
}
@@ -3127,8 +3143,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
int bwp_id = 1;
int mu = 0;
long k2 = 0;
+ int pucch_res_set_cnt = 0, valid = 0;
uint16_t frame_tx = 0, slot_tx = 0;
-
+ bool valid_ptrs_setup = 0;
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
fapi_nr_ul_config_request_t *ul_config = NULL;
@@ -3188,7 +3205,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu_0_0 = &ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu;
/* IDENTIFIER_DCI_FORMATS */
/* FREQ_DOM_RESOURCE_ASSIGNMENT_UL */
- nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_0,NULL,n_RB_ULBWP,0,dci->frequency_domain_assignment.val);
+ if (nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_0,NULL,n_RB_ULBWP,0,dci->frequency_domain_assignment.val) < 0)
+ return -1;
/* TIME_DOM_RESOURCE_ASSIGNMENT */
if (nr_ue_process_dci_time_dom_resource_assignment(mac,pusch_config_pdu_0_0,NULL,dci->time_domain_assignment.val) < 0)
return -1;
@@ -3199,6 +3217,27 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
/* MCS */
pusch_config_pdu_0_0->mcs_index = dci->mcs;
+
+ /* MCS TABLE */
+ if (mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
+ pusch_config_pdu_0_0->transform_precoding = 1;
+ else
+ pusch_config_pdu_0_0->transform_precoding = 0;
+
+ if (pusch_config_pdu_0_0->transform_precoding == transform_precoder_disabled)
+ pusch_config_pdu_0_0->mcs_table = get_pusch_mcs_table(pusch_config->mcs_Table, 0,
+ dci_format, NR_RNTI_TC, NR_SearchSpace__searchSpaceType_PR_common, false);
+ else
+ pusch_config_pdu_0_0->mcs_table = get_pusch_mcs_table(pusch_config->mcs_TableTransformPrecoder, 1,
+ dci_format, NR_RNTI_TC, NR_SearchSpace__searchSpaceType_PR_common, false);
+
+ pusch_config_pdu_0_0->target_code_rate = nr_get_code_rate_ul(pusch_config_pdu_0_0->mcs_index, pusch_config_pdu_0_0->mcs_table);
+ pusch_config_pdu_0_0->qam_mod_order = nr_get_Qm_ul(pusch_config_pdu_0_0->mcs_index, pusch_config_pdu_0_0->mcs_table);
+ if (pusch_config_pdu_0_0->target_code_rate == 0 || pusch_config_pdu_0_0->qam_mod_order == 0) {
+ LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected UL DCI. Ignoring DCI! \n");
+ return -1;
+ }
+
/* NDI */
pusch_config_pdu_0_0->pusch_data.new_data_indicator = dci->ndi;
/* RV */
@@ -3287,7 +3326,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
/* BANDWIDTH_PART_IND */
//pusch_config_pdu_0_1->bandwidth_part_ind = dci->bwp_indicator.val;
/* FREQ_DOM_RESOURCE_ASSIGNMENT_UL */
- nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_1,NULL,n_RB_ULBWP,0,dci->frequency_domain_assignment.val);
+ if (nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_1,NULL,n_RB_ULBWP,0,dci->frequency_domain_assignment.val) < 0)
+ return -1;
/* TIME_DOM_RESOURCE_ASSIGNMENT */
if (nr_ue_process_dci_time_dom_resource_assignment(mac,pusch_config_pdu_0_1,NULL,dci->time_domain_assignment.val) < 0)
return -1;
@@ -3645,7 +3685,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing;
/* IDENTIFIER_DCI_FORMATS */
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
- nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_0,0,n_RB_DLBWP,dci->frequency_domain_assignment.val);
+ if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_0,0,n_RB_DLBWP,dci->frequency_domain_assignment.val) < 0)
+ return -1;
/* TIME_DOM_RESOURCE_ASSIGNMENT */
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val) < 0)
return -1;
@@ -3663,6 +3704,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dlsch_config_pdu_1_0->vrb_to_prb_mapping = (dci->vrb_to_prb_mapping.val == 0) ? vrb_to_prb_mapping_non_interleaved:vrb_to_prb_mapping_interleaved;
/* MCS */
dlsch_config_pdu_1_0->mcs = dci->mcs;
+ // Basic sanity check for MCS value to check for a false or erroneous DCI
+ if (dlsch_config_pdu_1_0->mcs > 28) {
+ LOG_W(MAC, "MCS value % d out of bounds! Possibly due to false DCI. Ignoring DCI!!\n", dlsch_config_pdu_1_0->mcs);
+ return -1;
+ }
/* NDI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
dlsch_config_pdu_1_0->ndi = dci->ndi;
/* RV (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
@@ -3693,6 +3739,20 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
//if (dci->pucch_resource_indicator == 6) dlsch_config_pdu_1_0->pucch_resource_id = 7; //pucch-ResourceId obtained from the 7th value of resourceList FIXME!!
//if (dci->pucch_resource_indicator == 7) dlsch_config_pdu_1_0->pucch_resource_id = 8; //pucch-ResourceId obtained from the 8th value of resourceList FIXME!!
dlsch_config_pdu_1_0->pucch_resource_id = dci->pucch_resource_indicator;
+ // Sanity check for pucch_resource_indicator value received to check for false DCI.
+ valid = 0;
+ pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+ for (int id = 0; id < pucch_res_set_cnt; id++) {
+ if (dlsch_config_pdu_1_0->pucch_resource_id < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+ valid = 1;
+ break;
+ }
+ }
+ if (!valid) {
+ LOG_W(MAC, "pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", dlsch_config_pdu_1_0->pucch_resource_id);
+ return -1;
+ }
+
/* PDSCH_TO_HARQ_FEEDBACK_TIME_IND (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI)*/
dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind = dci->pdsch_to_harq_feedback_timing_indicator.val;
@@ -3770,7 +3830,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
/* BANDWIDTH_PART_IND */
// dlsch_config_pdu_1_1->bandwidth_part_ind = dci->bandwidth_part_ind;
/* FREQ_DOM_RESOURCE_ASSIGNMENT_DL */
- nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_1,0,n_RB_DLBWP,dci->frequency_domain_assignment.val);
+ if (nr_ue_process_dci_freq_dom_resource_assignment(NULL,dlsch_config_pdu_1_1,0,n_RB_DLBWP,dci->frequency_domain_assignment.val) < 0)
+ return -1;
/* TIME_DOM_RESOURCE_ASSIGNMENT */
if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val) < 0)
return -1;
@@ -3793,12 +3854,22 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dlsch_config_pdu_1_1->zp_csi_rs_trigger = dci->zp_csi_rs_trigger.val;
/* MCS (for transport block 1)*/
dlsch_config_pdu_1_1->mcs = dci->mcs;
+ // Basic sanity check for MCS value to check for a false or erroneous DCI
+ if (dlsch_config_pdu_1_1->mcs > 28) {
+ LOG_W(MAC, "MCS value % d out of bounds! Possibly due to false DCI. Ignoring DCI!!\n", dlsch_config_pdu_1_1->mcs);
+ return -1;
+ }
/* NDI (for transport block 1)*/
dlsch_config_pdu_1_1->ndi = dci->ndi;
/* RV (for transport block 1)*/
dlsch_config_pdu_1_1->rv = dci->rv;
/* MCS (for transport block 2)*/
dlsch_config_pdu_1_1->tb2_mcs = dci->mcs2.val;
+ // Basic sanity check for MCS value to check for a false or erroneous DCI
+ if (dlsch_config_pdu_1_1->tb2_mcs > 28) {
+ LOG_W(MAC, "MCS value % d out of bounds! Possibly due to false DCI. Ignoring DCI!!\n", dlsch_config_pdu_1_1->tb2_mcs);
+ return -1;
+ }
/* NDI (for transport block 2)*/
dlsch_config_pdu_1_1->tb2_ndi = dci->ndi2.val;
/* RV (for transport block 2)*/
@@ -3815,6 +3886,20 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
if (dci->tpc == 3) dlsch_config_pdu_1_1->accumulated_delta_PUCCH = 3;
/* PUCCH_RESOURCE_IND */
dlsch_config_pdu_1_1->pucch_resource_id = dci->pucch_resource_indicator;
+ // Sanity check for pucch_resource_indicator value received to check for false DCI.
+ valid = 0;
+ pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+ for (int id = 0; id < pucch_res_set_cnt; id++) {
+ if (dlsch_config_pdu_1_1->pucch_resource_id < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+ valid = 1;
+ break;
+ }
+ }
+ if (!valid) {
+ LOG_W(MAC, "pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", dlsch_config_pdu_1_1->pucch_resource_id);
+ return -1;
+ }
+
/* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
// according to TS 38.213 Table 9.2.3-1
dlsch_config_pdu_1_1->pdsch_to_harq_feedback_time_ind = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
@@ -3919,6 +4004,19 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type);
dl_config->number_pdus = dl_config->number_pdus + 1;
+ /* TODO same calculation for MCS table as done in UL */
+ dlsch_config_pdu_1_1->mcs_table = 0;
+ /*PTRS configuration */
+ if(mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) {
+ valid_ptrs_setup = set_dl_ptrs_values(mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup,
+ dlsch_config_pdu_1_1->number_rbs, dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table,
+ &dlsch_config_pdu_1_1->PTRSFreqDensity,&dlsch_config_pdu_1_1->PTRSTimeDensity,
+ &dlsch_config_pdu_1_1->PTRSPortIndex,&dlsch_config_pdu_1_1->nEpreRatioOfPDSCHToPTRS,
+ &dlsch_config_pdu_1_1->PTRSReOffset, dlsch_config_pdu_1_1->number_symbols);
+ if(valid_ptrs_setup==true) {
+ dlsch_config_pdu_1_1->pduBitmap |= 0x1;
+ }
+ }
break;
@@ -4231,10 +4329,10 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
case NR_RNTI_P:
/*
- // Short Messages Indicator – 2 bits
+ // Short Messages Indicator E2 bits
for (int i=0; i<2; i++)
dci_pdu |= (((uint64_t)dci_pdu_rel15->short_messages_indicator>>(1-i))&1)<<(dci_size-pos++);
- // Short Messages – 8 bits
+ // Short Messages E8 bits
for (int i=0; i<8; i++)
*dci_pdu |= (((uint64_t)dci_pdu_rel15->short_messages>>(7-i))&1)<<(dci_size-pos++);
// Freq domain assignment 0-16 bit
@@ -4301,13 +4399,13 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
// HARQ process number 4bit
pos+=4;
dci_pdu_rel15->harq_pid = (*dci_pdu>>(dci_size-pos))&0xf;
- // Downlink assignment index – 2 bits
+ // Downlink assignment index E2 bits
pos+=2;
dci_pdu_rel15->dai[0].val = (*dci_pdu>>(dci_size-pos))&3;
- // TPC command for scheduled PUCCH – 2 bits
+ // TPC command for scheduled PUCCH E2 bits
pos+=2;
dci_pdu_rel15->tpc = (*dci_pdu>>(dci_size-pos))&3;
- // PDSCH-to-HARQ_feedback timing indicator – 3 bits
+ // PDSCH-to-HARQ_feedback timing indicator E3 bits
pos+=3;
dci_pdu_rel15->pdsch_to_harq_feedback_timing_indicator.val = (*dci_pdu>>(dci_size-pos))&7;
@@ -4325,10 +4423,9 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
// Time domain assignment 4bit
pos+=4;
dci_pdu_rel15->time_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&0xf;
- // This is not supported yet - Skip for now
- // Frequency hopping flag – 1 bit
- //pos++;
- //dci_pdu_rel15->frequency_hopping_flag.val= (*dci_pdu>>(dci_size-pos))&1;
+ // Frequency hopping flag E1 bit
+ pos++;
+ dci_pdu_rel15->frequency_hopping_flag.val= (*dci_pdu>>(dci_size-pos))&1;
// MCS 5 bit
pos+=5;
dci_pdu_rel15->mcs= (*dci_pdu>>(dci_size-pos))&0x1f;
@@ -4341,10 +4438,10 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
// HARQ process number 4bit
pos+=4;
dci_pdu_rel15->harq_pid = (*dci_pdu>>(dci_size-pos))&0xf;
- // TPC command for scheduled PUSCH – 2 bits
+ // TPC command for scheduled PUSCH E2 bits
pos+=2;
dci_pdu_rel15->tpc = (*dci_pdu>>(dci_size-pos))&3;
- // UL/SUL indicator – 1 bit
+ // UL/SUL indicator E1 bit
/* commented for now (RK): need to get this from BWP descriptor
if (cfg->pucch_config.pucch_GroupHopping.value)
dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)ul_sul_indicator&1)<<(dci_size-pos++);
@@ -4362,7 +4459,7 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
// Time domain assignment 4bit
for (int i=0; i<4; i++)
dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)time_domain_assignment>>(3-i))&1)<<(dci_size-pos++);
- // Frequency hopping flag – 1 bit
+ // Frequency hopping flag E1 bit
dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)frequency_hopping_flag&1)<<(dci_size-pos++);
// MCS 5 bit
for (int i=0; i<5; i++)
@@ -4376,11 +4473,11 @@ int nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
for (int i=0; i<4; i++)
*dci_pdu |= (((uint64_t)*dci_pdu>>(dci_size-pos)harq_pid>>(3-i))&1)<<(dci_size-pos++);
- // TPC command for scheduled PUSCH – 2 bits
+ // TPC command for scheduled PUSCH E2 bits
for (int i=0; i<2; i++)
dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)tpc>>(1-i))&1)<<(dci_size-pos++);
*/
- // UL/SUL indicator – 1 bit
+ // UL/SUL indicator E1 bit
/*
commented for now (RK): need to get this information from BWP descriptor
if (cfg->pucch_config.pucch_GroupHopping.value)
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 5d701bf5b8..e4c2e11d7d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -337,61 +337,6 @@ void nr_schedule_pusch(int Mod_idP,
}
}
-
-void nr_schedule_pucch(int Mod_idP,
- int UE_id,
- int nr_ulmix_slots,
- frame_t frameP,
- sub_frame_t slotP) {
-
- uint16_t O_csi, O_ack, O_uci;
- uint8_t O_sr = 0; // no SR in PUCCH implemented for now
- NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
-
- NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
- int bwp_id=1;
- NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1];
- nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[Mod_idP]->UL_tti_req[0];
-
- NR_sched_pucch *curr_pucch;
-
- for (int k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][l];
- O_ack = curr_pucch->dai_c;
- O_csi = curr_pucch->csi_bits;
- O_uci = O_ack + O_csi + O_sr;
- if ((O_uci>0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
- UL_tti_req->SFN = curr_pucch->frame;
- UL_tti_req->Slot = curr_pucch->ul_slot;
- UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
- UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
- nfapi_nr_pucch_pdu_t *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
- memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
- UL_tti_req->n_pdus+=1;
-
- LOG_D(MAC,"Scheduling pucch reception for frame %d slot %d with (%d, %d, %d) (SR ACK, CSI) bits\n",
- frameP,slotP,O_sr,O_ack,curr_pucch->csi_bits);
-
- nr_configure_pucch(pucch_pdu,
- scc,
- ubwp,
- UE_info->rnti[UE_id],
- curr_pucch->resource_indicator,
- O_csi,
- O_ack,
- O_sr);
-
- memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
- 0,
- sizeof(NR_sched_pucch));
- }
- }
- }
-}
-
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
return (bitmap >> slot) & 0x01;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 9b1aef826b..0ba4941815 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -434,7 +434,6 @@ void nr_initiate_ra_proc(module_id_t module_idP,
uint8_t ul_carrier_id = 0; // 0 for NUL 1 for SUL
NR_SearchSpace_t *ss;
- int UE_id = 0;
uint16_t msg2_frame, msg2_slot,monitoring_slot_period,monitoring_offset;
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 92af24a04d..b0f2d2f68c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -159,13 +159,15 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
const int abs_slot = (slots_per_frame * frameP) + slotP;
const int slot_per_period = (slots_per_frame>>1)<<(*cc->ServingCellConfigCommon->ssb_periodicityServingCell);
int eff_120_slot;
+ const BIT_STRING_t *shortBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.shortBitmap;
const BIT_STRING_t *mediumBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap;
+ const BIT_STRING_t *longBitmap = &cc->ServingCellConfigCommon->ssb_PositionsInBurst->choice.longBitmap;
uint8_t buf = 0;
switch (cc->ServingCellConfigCommon->ssb_PositionsInBurst->present) {
case 1:
// presence of ssbs possible in the first 2 slots of ssb period
if ((abs_slot % slot_per_period) < 2 &&
- (((mediumBitmap->buf[0]) >> (6 - (slotP << 1))) & 3) != 0)
+ (((shortBitmap->buf[0]) >> (6 - (slotP << 1))) & 3) != 0)
fill_ssb_vrb_map(cc, (ssb_offset0 / (ratio * 12) - 10), CC_id);
break;
case 2:
@@ -180,16 +182,16 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP,
"240kHZ subcarrier spacing currently not supported for SSBs\n");
if ((abs_slot % slot_per_period) < 8) {
eff_120_slot = slotP;
- buf = mediumBitmap->buf[0];
+ buf = longBitmap->buf[0];
} else if ((abs_slot % slot_per_period) < 17) {
eff_120_slot = slotP - 9;
- buf = mediumBitmap->buf[1];
+ buf = longBitmap->buf[1];
} else if ((abs_slot % slot_per_period) < 26) {
eff_120_slot = slotP - 18;
- buf = mediumBitmap->buf[2];
+ buf = longBitmap->buf[2];
} else if ((abs_slot % slot_per_period) < 35) {
eff_120_slot = slotP - 27;
- buf = mediumBitmap->buf[3];
+ buf = longBitmap->buf[3];
}
if (((buf >> (6 - (eff_120_slot << 1))) & 3) != 0)
fill_ssb_vrb_map(cc, ssb_offset0 / (ratio * 12) - 10, CC_id);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 7a7fe1288c..a9839ed985 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -304,9 +304,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
// 2) Generation of DLSCH MAC subPDUs including subheaders and MAC SDUs
for (i = 0; i < num_sdus; i++) {
- LOG_D(MAC, "[gNB] Generate DLSCH header num sdu %d len sdu %d\n", num_sdus, sdu_lengths[i]);
- if (sdu_lengths[i] < 128) {
+ if (sdu_lengths[i] < 256) {
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i];
@@ -316,7 +315,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i];
- ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0x7f;
+ ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0xff;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff;
last_size = 3;
}
@@ -326,6 +325,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]);
dlsch_buffer_ptr += sdu_lengths[i];
mac_pdu_ptr += sdu_lengths[i];
+ LOG_D(MAC, "Generate DLSCH header num sdu %d len header %d len sdu %d -> offset %ld\n", num_sdus, last_size, sdu_lengths[i], (unsigned char *)mac_pdu_ptr - mac_pdu);
}
// 4) Compute final offset for padding
@@ -333,6 +333,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_PADDING;
mac_pdu_ptr++;
+ LOG_D(MAC, "Generate Padding -> offset %ld\n", (unsigned char *)mac_pdu_ptr - mac_pdu);
} else {
// no MAC subPDU with padding
}
@@ -343,100 +344,6 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
return offset;
}
-void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
- nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
- nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
- NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
-
- // TODO
- int max_harq_rounds = 4; // TODO define macro
-
- if (uci_01 != NULL) {
- // handle harq
- int harq_idx_s = 0;
-
- // iterate over received harq bits
- for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
- // search for the right harq process
- for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
- // if the gNB received ack with a good confidence
- if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
- if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) &&
- (uci_01->harq->harq_confidence_level == 0)) {
- // toggle NDI and reset round
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- }
- else
- sched_ctrl->harq_processes[harq_idx].round++;
- sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
- harq_idx_s = harq_idx + 1;
- // if the max harq rounds was reached
- if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- stats->dlsch_errors++;
- }
- break;
- }
- // if feedback slot processing is aborted
- else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
- (sched_ctrl->harq_processes[harq_idx].is_waiting)) {
- sched_ctrl->harq_processes[harq_idx].round++;
- if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- }
- sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
- }
- }
- }
- }
-
-
- if (uci_234 != NULL) {
- int harq_idx_s = 0;
- int acknack;
-
- // iterate over received harq bits
- for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
- acknack = ((uci_234->harq.harq_payload[harq_bit>>3])>>harq_bit)&0x01;
- for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES-1; harq_idx++) {
- // if the gNB received ack with a good confidence or if the max harq rounds was reached
- if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
- // TODO add some confidence level for when there is no CRC
- if ((uci_234->harq.harq_crc != 1) && acknack) {
- // toggle NDI and reset round
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- }
- else
- sched_ctrl->harq_processes[harq_idx].round++;
- sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
- harq_idx_s = harq_idx + 1;
- // if the max harq rounds was reached
- if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- stats->dlsch_errors++;
- }
- break;
- }
- // if feedback slot processing is aborted
- else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
- (sched_ctrl->harq_processes[harq_idx].is_waiting)) {
- sched_ctrl->harq_processes[harq_idx].round++;
- if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
- sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
- sched_ctrl->harq_processes[harq_idx].round = 0;
- }
- sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
- }
- }
- }
- }
-}
-
int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) {
struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList =
bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
@@ -503,11 +410,12 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
return;
LOG_D(MAC,
- "%d.%d, DTCH%d->DLSCH, RLC status %d bytes\n",
+ "%d.%d, DTCH%d->DLSCH, RLC status %d bytes TA %d\n",
frame,
slot,
lcid,
- sched_ctrl->rlc_status[lcid].bytes_in_buffer);
+ sched_ctrl->rlc_status[lcid].bytes_in_buffer,
+ sched_ctrl->ta_apply);
/* Find a free CCE */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
@@ -598,6 +506,8 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
sched_ctrl->time_domain_allocation);
int rbSize = 0;
+ const int oh = 2 + (sched_ctrl->num_total_bytes >= 256)
+ + 2 * (frame == (sched_ctrl->ta_frame + 10) % 1024);
uint32_t TBS = 0;
do {
rbSize++;
@@ -611,7 +521,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
0 /* tb_scaling */,
1 /* nrOfLayers */)
>> 3;
- } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes);
+ } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes + oh);
sched_ctrl->rbSize = rbSize;
sched_ctrl->rbStart = rbStart;
}
@@ -642,7 +552,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
* If such UE is not scheduled now, it will be by the preprocessor later.
* If we add the CE, ta_apply will be reset */
if (frame == (sched_ctrl->ta_frame + 10) % 1024)
- sched_ctrl->ta_apply = false; /* the timer is reset once TA CE is scheduled */
+ sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */
if (sched_ctrl->rbSize <= 0)
continue;
@@ -683,6 +593,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
harq->is_waiting = 1;
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
+ LOG_D(MAC, "%4d.%2d RNTI %04x start %d RBS %d MCS %d TBS %d HARQ PID %d round %d NDI %d\n",
+ frame, slot, rnti, sched_ctrl->rbStart, sched_ctrl->rbSize, sched_ctrl->mcs,
+ TBS, current_harq_pid, harq->round, harq->ndi);
+
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
nr_fill_nfapi_dl_pdu(module_id,
dl_req,
@@ -742,12 +656,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
unsigned char sdu_lcids[NB_RB_MAX] = {0};
const int lcid = DL_SCH_LCID_DTCH;
if (sched_ctrl->num_total_bytes > 0) {
+ /* this is the data from the RLC we would like to request (e.g., only
+ * some bytes for first LC and some more from a second one */
+ const rlc_buffer_occupancy_t ndata = sched_ctrl->rlc_status[lcid].bytes_in_buffer;
+ /* this is the maximum data we can transport based on TBS minus headers */
+ const int mindata = min(ndata, TBS - ta_len - header_length_total - sdu_length_total - 2 - (ndata >= 256));
LOG_D(MAC,
"[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting "
"%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n",
module_id,
frame,
- TBS - ta_len - header_length_total - sdu_length_total - 3,
+ mindata,
lcid,
header_length_total,
TBS);
@@ -759,7 +678,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
ENB_FLAG_YES,
MBMS_FLAG_NO,
lcid,
- TBS - ta_len - header_length_total - sdu_length_total - 3,
+ mindata,
(char *)&mac_sdus[sdu_length_total],
0,
0);
@@ -783,7 +702,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
mac_sdus[i] = (unsigned char) (lrand48()&0xff);
sdu_lcids[0] = 0x3f; // DRB
sdu_lengths[0] = TBS - ta_len - 3;
- header_length_total += 2 + (sdu_lengths[0] >= 128);
+ header_length_total += 2 + (sdu_lengths[0] >= 256);
sdu_length_total += sdu_lengths[0];
num_sdus +=1;
}
@@ -791,7 +710,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS;
UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += sdu_length_total;
- const int post_padding = TBS >= 2 + header_length_total + sdu_length_total + ta_len;
+ const int post_padding = TBS > header_length_total + sdu_length_total + ta_len;
const int ntx_req = gNB_mac->TX_req[CC_id].Number_of_PDUs;
nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[ntx_req];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 6116bed50c..ae389cd23b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -453,6 +453,7 @@ void nr_fill_nfapi_dl_pdu(int Mod_idP,
const int bwp_id = sched_ctrl->active_bwp->bwp_Id;
const int nrOfLayers = 1;
const int mcs = sched_ctrl->mcs;
+ bool valid_ptrs_setup = false;
AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
"downlinkBWP_ToAddModList has %d BWP!\n",
@@ -521,6 +522,19 @@ void nr_fill_nfapi_dl_pdu(int Mod_idP,
scc->dmrs_TypeA_Position,
pdsch_pdu_rel15->NrOfSymbols);
+ /* Check and validate PTRS values */
+ if(bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) {
+ valid_ptrs_setup = set_dl_ptrs_values(bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup,
+ pdsch_pdu_rel15->rbSize, pdsch_pdu_rel15->mcsIndex[0],
+ pdsch_pdu_rel15->mcsTable[0],
+ &pdsch_pdu_rel15->PTRSFreqDensity,&pdsch_pdu_rel15->PTRSTimeDensity,
+ &pdsch_pdu_rel15->PTRSPortIndex,&pdsch_pdu_rel15->nEpreRatioOfPDSCHToPTRS,
+ &pdsch_pdu_rel15->PTRSReOffset, pdsch_pdu_rel15->NrOfSymbols);
+ if(valid_ptrs_setup==true) {
+ pdsch_pdu_rel15->pduBitmap |=0x1;
+ }
+ }
+
dci_pdu_rel15_t dci_pdu_rel15[MAX_DCI_CORESET];
memset(dci_pdu_rel15, 0, sizeof(dci_pdu_rel15_t) * MAX_DCI_CORESET);
@@ -798,7 +812,11 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
AssertFatal(1==0,"Couldn't fine pucch resource indicator %d in PUCCH resource set %d for %d UCI bits",pucch_resource,i,O_uci);
}
if (pucchresset->pucch_ResourceSetId == 1 && O_uci>2) {
+#if (NR_RRC_VERSION >= MAKE_VERSION(16, 0, 0))
+ N3 = pucchresset->maxPayloadSize!= NULL ? *pucchresset->maxPayloadSize : 1706;
+#else
N3 = pucchresset->maxPayloadMinus1!= NULL ? *pucchresset->maxPayloadMinus1 : 1706;
+#endif
if (N2O_uci) {
if (pucch_resource < n_list)
resource_id = pucchresset->resourceList.list.array[pucch_resource];
@@ -915,84 +933,6 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
}
-uint16_t compute_pucch_prb_size(uint8_t format,
- uint8_t nr_prbs,
- uint16_t O_tot,
- uint16_t O_csi,
- NR_PUCCH_MaxCodeRate_t *maxCodeRate,
- uint8_t Qm,
- uint8_t n_symb,
- uint8_t n_re_ctrl) {
-
- uint16_t O_crc;
-
- if (O_tot<12)
- O_crc = 0;
- else{
- if (O_tot<20)
- O_crc = 6;
- else {
- if (O_tot<360)
- O_crc = 11;
- else
- AssertFatal(1==0,"Case for segmented PUCCH not yet implemented");
- }
- }
-
- int rtimes100;
- switch(*maxCodeRate){
- case NR_PUCCH_MaxCodeRate_zeroDot08 :
- rtimes100 = 8;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot15 :
- rtimes100 = 15;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot25 :
- rtimes100 = 25;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot35 :
- rtimes100 = 35;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot45 :
- rtimes100 = 45;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot60 :
- rtimes100 = 60;
- break;
- case NR_PUCCH_MaxCodeRate_zeroDot80 :
- rtimes100 = 80;
- break;
- default :
- AssertFatal(1==0,"Invalid MaxCodeRate");
- }
-
- float r = (float)rtimes100/100;
-
- if (O_csi == O_tot) {
- if ((O_tot+O_csi)>(nr_prbs*n_re_ctrl*n_symb*Qm*r))
- AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs",
- r,O_tot,O_crc,nr_prbs);
- else
- return nr_prbs;
- }
-
- if (format==2){
- // TODO fix this for multiple CSI reports
- for (int i=1; i<=nr_prbs; i++){
- if((O_tot+O_crc)<=(i*n_symb*Qm*n_re_ctrl*r) &&
- (O_tot+O_crc)>((i-1)*n_symb*Qm*n_re_ctrl*r))
- return i;
- }
- AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with at most %d PRBs",
- r,O_tot,O_crc,nr_prbs);
- }
- else{
- AssertFatal(1==0,"Not yet implemented");
- }
-
-}
-
-
void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
dci_pdu_rel15_t *dci_pdu_rel15,
nr_dci_format_t format,
@@ -1688,7 +1628,7 @@ inline void add_nr_ue_list(NR_UE_list_t *listP, int UE_id) {
/*
* Remove a UE from NR_UE_list listP
*/
-inline int remove_nr_ue_list(NR_UE_list_t *listP, int UE_id) {
+static inline void remove_nr_ue_list(NR_UE_list_t *listP, int UE_id) {
int *cur = &listP->head;
while (*cur != -1 && *cur != UE_id)
cur = &listP->next[*cur];
@@ -1696,7 +1636,7 @@ inline int remove_nr_ue_list(NR_UE_list_t *listP, int UE_id) {
int *next = &listP->next[*cur];
*cur = listP->next[*cur];
*next = -1;
- return 1;
+ return;
}
int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP)
@@ -1917,324 +1857,6 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
}
-uint16_t nr_get_csi_bitlen(int Mod_idP,
- int UE_id,
- uint8_t csi_report_id) {
-
- uint16_t csi_bitlen =0;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- CRI_SSBRI_RSRP_bitlen_t * CSI_report_bitlen = NULL;
-
- CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0]);
- csi_bitlen = ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
- CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
- (CSI_report_bitlen->nb_ssbri_cri -1 )) *UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report);
-
- return csi_bitlen;
-}
-
-
-void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
- int *period, int *offset) {
-
- NR_CSI_ReportPeriodicityAndOffset_PR p_and_o = csirep->reportConfigType.choice.periodic->reportSlotConfig.present;
-
- switch(p_and_o){
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots4:
- *period = 4;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots4;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots5:
- *period = 5;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots5;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots8:
- *period = 8;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots8;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots10:
- *period = 10;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots10;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots16:
- *period = 16;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots16;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots20:
- *period = 20;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots20;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots40:
- *period = 40;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots40;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots80:
- *period = 80;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots80;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots160:
- *period = 160;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots160;
- break;
- case NR_CSI_ReportPeriodicityAndOffset_PR_slots320:
- *period = 320;
- *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
- break;
- default:
- AssertFatal(1==0,"No periodicity and offset resource found in CSI report");
- }
-}
-
-
-//!TODO : same function can be written to handle csi_resources
-void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
- uint8_t csi_report_id = 0;
- uint8_t csi_resourceidx =0;
- uint8_t csi_ssb_idx =0;
-
- NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
- NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
- for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
- csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
- UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
-
- for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
- if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
- continue;
- else {
- //Finding the CSI_RS or SSB Resources
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
- if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
- struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
-
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
- }
-
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
- uint8_t nb_ssb_resources =0;
- for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
- if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
- *(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) { ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
- if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
- csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
- if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
- else
- /*! From Spec 38.331
- * nrofReportedRS
- * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
- * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
- * When the field is absent the UE applies the value 1
- */
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
- }else
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
-
- nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
- if (nb_ssb_resources){
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- }
- else{
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
- }
-
- LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d",
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
- break ;
- }
- }
- }
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report){
- AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
- }
- break;
- }
- }
- }
-}
-
-void nr_csi_meas_reporting(int Mod_idP,
- int UE_id,
- frame_t frame,
- sub_frame_t slot,
- int slots_per_tdd,
- int ul_slots,
- int n_slots_frame) {
-
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_sched_pucch *curr_pucch;
- NR_PUCCH_ResourceSet_t *pucchresset;
- NR_CSI_ReportConfig_t *csirep;
- NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
- NR_CSI_MeasConfig_t *csi_measconfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
- NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
- NR_PUCCH_Config_t *pucch_Config = ubwp->bwp_Dedicated->pucch_Config->choice.setup;
-
- AssertFatal(csi_measconfig->csi_ReportConfigToAddModList->list.count>0,"NO CSI report configuration available");
-
- for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
-
- csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
-
- AssertFatal(csirep->reportConfigType.choice.periodic!=NULL,"Only periodic CSI reporting is implemented currently");
- int period, offset, sched_slot;
- csi_period_offset(csirep,&period,&offset);
- sched_slot = (period+offset)%n_slots_frame;
- // prepare to schedule csi measurement reception according to 5.2.1.4 in 38.214
- // preparation is done in first slot of tdd period
- if ( (frame%(period/n_slots_frame)==(offset/n_slots_frame)) && (slot==((sched_slot/slots_per_tdd)*slots_per_tdd))) {
-
- // we are scheduling pucch for csi in the first pucch occasion (this comes before ack/nack)
- curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[(sched_slot%slots_per_tdd)-slots_per_tdd+ul_slots][0];
-
- NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
-
- int found = -1;
- pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
- int n_list = pucchresset->resourceList.list.count;
- for (int i=0; iresourceList.list.array[i] == pucchcsires->pucch_Resource)
- found = i;
- }
- AssertFatal(found>-1,"CSI resource not found among PUCCH resources");
-
- curr_pucch->resource_indicator = found;
-
- n_list = pucch_Config->resourceToAddModList->list.count;
-
- // going through the list of PUCCH resources to find the one indexed by resource_id
- for (int i=0; iresourceToAddModList->list.array[i];
- if (pucchres->pucch_ResourceId == *pucchresset->resourceList.list.array[found]) {
- switch(pucchres->format.present){
- case NR_PUCCH_Resource__format_PR_format2:
- if (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
- curr_pucch->simultaneous_harqcsi = false;
- else
- curr_pucch->simultaneous_harqcsi = true;
- break;
- case NR_PUCCH_Resource__format_PR_format3:
- if (pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
- curr_pucch->simultaneous_harqcsi = false;
- else
- curr_pucch->simultaneous_harqcsi = true;
- break;
- case NR_PUCCH_Resource__format_PR_format4:
- if (pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
- curr_pucch->simultaneous_harqcsi = false;
- else
- curr_pucch->simultaneous_harqcsi = true;
- break;
- default:
- AssertFatal(1==0,"Invalid PUCCH format type");
- }
- }
- }
- curr_pucch->csi_bits += nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id); // TODO function to compute CSI meas report bit size
- curr_pucch->frame = frame;
- curr_pucch->ul_slot = sched_slot;
- }
- }
-}
-
-
-// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
-void nr_acknack_scheduling(int Mod_idP,
- int UE_id,
- frame_t frameP,
- sub_frame_t slotP,
- int slots_per_tdd,
- int *pucch_id,
- int *pucch_occ) {
-
- NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
- NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
- NR_sched_pucch *curr_pucch;
- int max_acknacks,pucch_res,first_ul_slot_tdd,k,i,l;
- uint8_t pdsch_to_harq_feedback[8];
- int found = 0;
- int nr_ulmix_slots = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
- if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0)
- nr_ulmix_slots++;
-
- bool csi_pres=false;
- for (k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits>0)
- csi_pres=true;
- }
-
- // As a preference always schedule ack nacks in PUCCH0 (max 2 per slots)
- // Unless there is CSI meas reporting scheduled in the period to avoid conflicts in the same slot
- if (csi_pres)
- max_acknacks=10;
- else
- max_acknacks=2;
-
- // this is hardcoded for now as ue specific
- NR_SearchSpace__searchSpaceType_PR ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- get_pdsch_to_harq_feedback(Mod_idP,UE_id,ss_type,pdsch_to_harq_feedback);
-
- // for each possible ul or mixed slot
- for (k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][l];
- //if it is possible to schedule acknack in current pucch (no exclusive csi pucch)
- if ((curr_pucch->csi_bits == 0) || (curr_pucch->simultaneous_harqcsi==true)) {
- // if there is free room in current pucch structure
- if (curr_pucch->dai_c-1){
- curr_pucch->resource_indicator = pucch_res;
- curr_pucch->frame = frameP;
- // first pucch occasion in first UL or MIXED slot
- first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
- i = 0;
- while (i<8 && found == 0) { // look if timing indicator is among allowed values
- if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
- found = 1;
- if (found == 0) i++;
- }
- if (found == 1) {
- // computing slot in which pucch is scheduled
- curr_pucch->dai_c++;
- curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
- curr_pucch->timing_indicator = i; // index in the list of timing indicators
- *pucch_id = k;
- *pucch_occ = l;
- return;
- }
- }
- }
- }
- }
- }
- AssertFatal(1==0,"No Uplink slot available in accordance to allowed timing indicator\n");
-}
-
-
-int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l) {
-
- // to be updated later, for now simple implementation
- // use the second allocation just in case there is csi in the first
- // in that case use second resource (for a different symbol) see 9.2 in 38.213
- if (l==1) {
- if (UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits==0)
- return -1;
- else
- return 1;
- }
- else
- return 0;
-
-}
-
void find_aggregation_candidates(uint8_t *aggregation_level,
uint8_t *nr_of_candidates,
NR_SearchSpace_t *ss) {
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
new file mode 100644
index 0000000000..746dd8ee48
--- /dev/null
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -0,0 +1,588 @@
+/*
+ * 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 gNB_scheduler_uci.c
+ * \brief MAC procedures related to UCI
+ * \date 2020
+ * \version 1.0
+ * \company Eurecom
+ */
+
+#include "LAYER2/MAC/mac.h"
+#include "NR_MAC_gNB/nr_mac_gNB.h"
+#include "NR_MAC_COMMON/nr_mac_extern.h"
+#include "NR_MAC_gNB/mac_proto.h"
+#include "common/ran_context.h"
+
+extern RAN_CONTEXT_t RC;
+
+void nr_schedule_pucch(int Mod_idP,
+ int UE_id,
+ int nr_ulmix_slots,
+ frame_t frameP,
+ sub_frame_t slotP) {
+
+ uint16_t O_csi, O_ack, O_uci;
+ uint8_t O_sr = 0; // no SR in PUCCH implemented for now
+ NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
+
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
+ int bwp_id=1;
+ NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1];
+ nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[Mod_idP]->UL_tti_req[0];
+
+ NR_sched_pucch *curr_pucch;
+
+ for (int k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][l];
+ O_ack = curr_pucch->dai_c;
+ O_csi = curr_pucch->csi_bits;
+ O_uci = O_ack + O_csi + O_sr;
+ if ((O_uci>0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
+ UL_tti_req->SFN = curr_pucch->frame;
+ UL_tti_req->Slot = curr_pucch->ul_slot;
+ UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
+ UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
+ nfapi_nr_pucch_pdu_t *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
+ memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
+ UL_tti_req->n_pdus+=1;
+
+ LOG_D(MAC,"Scheduling pucch reception for frame %d slot %d with (%d, %d, %d) (SR ACK, CSI) bits\n",
+ frameP,slotP,O_sr,O_ack,curr_pucch->csi_bits);
+
+ nr_configure_pucch(pucch_pdu,
+ scc,
+ ubwp,
+ UE_info->rnti[UE_id],
+ curr_pucch->resource_indicator,
+ O_csi,
+ O_ack,
+ O_sr);
+
+ memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
+ 0,
+ sizeof(NR_sched_pucch));
+ }
+ }
+ }
+}
+
+
+//!TODO : same function can be written to handle csi_resources
+void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
+ uint8_t csi_report_id = 0;
+ uint8_t csi_resourceidx =0;
+ uint8_t csi_ssb_idx =0;
+
+ NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
+ for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+ csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
+ UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
+
+ for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
+ if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
+ continue;
+ else {
+ //Finding the CSI_RS or SSB Resources
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
+ if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
+ struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
+
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
+ }
+
+ if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
+ uint8_t nb_ssb_resources =0;
+ for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+ if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
+ *(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) {
+ ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+ if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
+ csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
+ if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+ else
+ /*! From Spec 38.331
+ * nrofReportedRS
+ * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
+ * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
+ * When the field is absent the UE applies the value 1
+ */
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
+ } else
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
+
+ nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
+ if (nb_ssb_resources){
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ }
+ else{
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
+ }
+
+ LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d",
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
+ UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
+ break ;
+ }
+ }
+ }
+ if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report)
+ AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
+ break;
+ }
+ }
+ }
+}
+
+
+uint16_t nr_get_csi_bitlen(int Mod_idP,
+ int UE_id,
+ uint8_t csi_report_id) {
+
+ uint16_t csi_bitlen =0;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ CRI_SSBRI_RSRP_bitlen_t * CSI_report_bitlen = NULL;
+
+ CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0]);
+ csi_bitlen = ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
+ CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
+ (CSI_report_bitlen->nb_ssbri_cri -1 )) *UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report);
+
+ return csi_bitlen;
+}
+
+
+void nr_csi_meas_reporting(int Mod_idP,
+ int UE_id,
+ frame_t frame,
+ sub_frame_t slot,
+ int slots_per_tdd,
+ int ul_slots,
+ int n_slots_frame) {
+
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_sched_pucch *curr_pucch;
+ NR_PUCCH_ResourceSet_t *pucchresset;
+ NR_CSI_ReportConfig_t *csirep;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
+ NR_CSI_MeasConfig_t *csi_measconfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
+ NR_PUCCH_Config_t *pucch_Config = ubwp->bwp_Dedicated->pucch_Config->choice.setup;
+
+ AssertFatal(csi_measconfig->csi_ReportConfigToAddModList->list.count>0,"NO CSI report configuration available");
+
+ for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+
+ csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+
+ AssertFatal(csirep->reportConfigType.choice.periodic!=NULL,"Only periodic CSI reporting is implemented currently");
+ int period, offset, sched_slot;
+ csi_period_offset(csirep,&period,&offset);
+ sched_slot = (period+offset)%n_slots_frame;
+ // prepare to schedule csi measurement reception according to 5.2.1.4 in 38.214
+ // preparation is done in first slot of tdd period
+ if ( (frame%(period/n_slots_frame)==(offset/n_slots_frame)) && (slot==((sched_slot/slots_per_tdd)*slots_per_tdd))) {
+
+ // we are scheduling pucch for csi in the first pucch occasion (this comes before ack/nack)
+ curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[(sched_slot%slots_per_tdd)-slots_per_tdd+ul_slots][0];
+
+ NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
+
+ int found = -1;
+ pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
+ int n_list = pucchresset->resourceList.list.count;
+ for (int i=0; iresourceList.list.array[i] == pucchcsires->pucch_Resource)
+ found = i;
+ }
+ AssertFatal(found>-1,"CSI resource not found among PUCCH resources");
+
+ curr_pucch->resource_indicator = found;
+
+ n_list = pucch_Config->resourceToAddModList->list.count;
+
+ // going through the list of PUCCH resources to find the one indexed by resource_id
+ for (int i=0; iresourceToAddModList->list.array[i];
+ if (pucchres->pucch_ResourceId == *pucchresset->resourceList.list.array[found]) {
+ switch(pucchres->format.present){
+ case NR_PUCCH_Resource__format_PR_format2:
+ if (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+ curr_pucch->simultaneous_harqcsi = false;
+ else
+ curr_pucch->simultaneous_harqcsi = true;
+ break;
+ case NR_PUCCH_Resource__format_PR_format3:
+ if (pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+ curr_pucch->simultaneous_harqcsi = false;
+ else
+ curr_pucch->simultaneous_harqcsi = true;
+ break;
+ case NR_PUCCH_Resource__format_PR_format4:
+ if (pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+ curr_pucch->simultaneous_harqcsi = false;
+ else
+ curr_pucch->simultaneous_harqcsi = true;
+ break;
+ default:
+ AssertFatal(1==0,"Invalid PUCCH format type");
+ }
+ }
+ }
+ curr_pucch->csi_bits += nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id); // TODO function to compute CSI meas report bit size
+ curr_pucch->frame = frame;
+ curr_pucch->ul_slot = sched_slot;
+ }
+ }
+}
+
+
+void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
+ nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
+ nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
+ NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
+
+ // TODO
+ int max_harq_rounds = 4; // TODO define macro
+
+ if (uci_01 != NULL) {
+ // handle harq
+ int harq_idx_s = 0;
+
+ // iterate over received harq bits
+ for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
+ // search for the right harq process
+ for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
+ // if the gNB received ack with a good confidence
+ if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
+ sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
+ if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) &&
+ (uci_01->harq->harq_confidence_level == 0)) {
+ // toggle NDI and reset round
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ }
+ else
+ sched_ctrl->harq_processes[harq_idx].round++;
+ sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+ harq_idx_s = harq_idx + 1;
+ // if the max harq rounds was reached
+ if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ stats->dlsch_errors++;
+ }
+ break;
+ }
+ // if feedback slot processing is aborted
+ else if (sched_ctrl->harq_processes[harq_idx].feedback_slot != -1
+ && (UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot
+ && sched_ctrl->harq_processes[harq_idx].is_waiting) {
+ sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
+ sched_ctrl->harq_processes[harq_idx].round++;
+ if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ }
+ sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+ }
+ }
+ }
+ }
+
+
+ if (uci_234 != NULL) {
+ int harq_idx_s = 0;
+ int acknack;
+
+ // iterate over received harq bits
+ for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
+ acknack = ((uci_234->harq.harq_payload[harq_bit>>3])>>harq_bit)&0x01;
+ for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES-1; harq_idx++) {
+ // if the gNB received ack with a good confidence or if the max harq rounds was reached
+ if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
+ // TODO add some confidence level for when there is no CRC
+ sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
+ if ((uci_234->harq.harq_crc != 1) && acknack) {
+ // toggle NDI and reset round
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ }
+ else
+ sched_ctrl->harq_processes[harq_idx].round++;
+ sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+ harq_idx_s = harq_idx + 1;
+ // if the max harq rounds was reached
+ if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ stats->dlsch_errors++;
+ }
+ break;
+ }
+ // if feedback slot processing is aborted
+ else if (sched_ctrl->harq_processes[harq_idx].feedback_slot != -1
+ && (UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot
+ && sched_ctrl->harq_processes[harq_idx].is_waiting) {
+ sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
+ sched_ctrl->harq_processes[harq_idx].round++;
+ if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+ sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+ sched_ctrl->harq_processes[harq_idx].round = 0;
+ }
+ sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+ }
+ }
+ }
+ }
+}
+
+
+// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
+void nr_acknack_scheduling(int Mod_idP,
+ int UE_id,
+ frame_t frameP,
+ sub_frame_t slotP,
+ int slots_per_tdd,
+ int *pucch_id,
+ int *pucch_occ) {
+
+ NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_sched_pucch *curr_pucch;
+ int max_acknacks,pucch_res,first_ul_slot_tdd,k,i,l;
+ uint8_t pdsch_to_harq_feedback[8];
+ int found = 0;
+ int nr_ulmix_slots = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+ if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0)
+ nr_ulmix_slots++;
+
+ bool csi_pres=false;
+ for (k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits>0)
+ csi_pres=true;
+ }
+
+ // As a preference always schedule ack nacks in PUCCH0 (max 2 per slots)
+ // Unless there is CSI meas reporting scheduled in the period to avoid conflicts in the same slot
+ if (csi_pres)
+ max_acknacks=10;
+ else
+ max_acknacks=2;
+
+ // this is hardcoded for now as ue specific
+ NR_SearchSpace__searchSpaceType_PR ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+ get_pdsch_to_harq_feedback(Mod_idP,UE_id,ss_type,pdsch_to_harq_feedback);
+
+ // for each possible ul or mixed slot
+ for (k=0; kUE_sched_ctrl[UE_id].sched_pucch[k][l];
+ //if it is possible to schedule acknack in current pucch (no exclusive csi pucch)
+ if ((curr_pucch->csi_bits == 0) || (curr_pucch->simultaneous_harqcsi==true)) {
+ // if there is free room in current pucch structure
+ if (curr_pucch->dai_c-1){
+ curr_pucch->resource_indicator = pucch_res;
+ curr_pucch->frame = frameP;
+ // first pucch occasion in first UL or MIXED slot
+ first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
+ i = 0;
+ while (i<8 && found == 0) { // look if timing indicator is among allowed values
+ if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
+ found = 1;
+ if (found == 0) i++;
+ }
+ if (found == 1) {
+ // computing slot in which pucch is scheduled
+ curr_pucch->dai_c++;
+ curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
+ curr_pucch->timing_indicator = i; // index in the list of timing indicators
+ *pucch_id = k;
+ *pucch_occ = l;
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+ AssertFatal(1==0,"No Uplink slot available in accordance to allowed timing indicator\n");
+}
+
+
+void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
+ int *period, int *offset) {
+
+ NR_CSI_ReportPeriodicityAndOffset_PR p_and_o = csirep->reportConfigType.choice.periodic->reportSlotConfig.present;
+
+ switch(p_and_o){
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots4:
+ *period = 4;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots4;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots5:
+ *period = 5;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots5;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots8:
+ *period = 8;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots8;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots10:
+ *period = 10;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots10;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots16:
+ *period = 16;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots16;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots20:
+ *period = 20;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots20;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots40:
+ *period = 40;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots40;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots80:
+ *period = 80;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots80;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots160:
+ *period = 160;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots160;
+ break;
+ case NR_CSI_ReportPeriodicityAndOffset_PR_slots320:
+ *period = 320;
+ *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
+ break;
+ default:
+ AssertFatal(1==0,"No periodicity and offset resource found in CSI report");
+ }
+}
+
+
+int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l) {
+
+ // to be updated later, for now simple implementation
+ // use the second allocation just in case there is csi in the first
+ // in that case use second resource (for a different symbol) see 9.2 in 38.213
+ if (l==1) {
+ if (UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits==0)
+ return -1;
+ else
+ return 1;
+ }
+ else
+ return 0;
+
+}
+
+
+uint16_t compute_pucch_prb_size(uint8_t format,
+ uint8_t nr_prbs,
+ uint16_t O_tot,
+ uint16_t O_csi,
+ NR_PUCCH_MaxCodeRate_t *maxCodeRate,
+ uint8_t Qm,
+ uint8_t n_symb,
+ uint8_t n_re_ctrl) {
+
+ uint16_t O_crc;
+
+ if (O_tot<12)
+ O_crc = 0;
+ else{
+ if (O_tot<20)
+ O_crc = 6;
+ else {
+ if (O_tot<360)
+ O_crc = 11;
+ else
+ AssertFatal(1==0,"Case for segmented PUCCH not yet implemented");
+ }
+ }
+
+ int rtimes100;
+ switch(*maxCodeRate){
+ case NR_PUCCH_MaxCodeRate_zeroDot08 :
+ rtimes100 = 8;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot15 :
+ rtimes100 = 15;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot25 :
+ rtimes100 = 25;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot35 :
+ rtimes100 = 35;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot45 :
+ rtimes100 = 45;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot60 :
+ rtimes100 = 60;
+ break;
+ case NR_PUCCH_MaxCodeRate_zeroDot80 :
+ rtimes100 = 80;
+ break;
+ default :
+ AssertFatal(1==0,"Invalid MaxCodeRate");
+ }
+
+ float r = (float)rtimes100/100;
+
+ if (O_csi == O_tot) {
+ if ((O_tot+O_csi)>(nr_prbs*n_re_ctrl*n_symb*Qm*r))
+ AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs",
+ r,O_tot,O_crc,nr_prbs);
+ else
+ return nr_prbs;
+ }
+
+ if (format==2){
+ // TODO fix this for multiple CSI reports
+ for (int i=1; i<=nr_prbs; i++){
+ if((O_tot+O_crc)<=(i*n_symb*Qm*n_re_ctrl*r) &&
+ (O_tot+O_crc)>((i-1)*n_symb*Qm*n_re_ctrl*r))
+ return i;
+ }
+ AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with at most %d PRBs",
+ r,O_tot,O_crc,nr_prbs);
+ }
+ else{
+ AssertFatal(1==0,"Not yet implemented");
+ }
+
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 84ad51f072..76c9dedf30 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -291,7 +291,7 @@ void handle_nr_ul_harq(uint16_t slot, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_sta
}
return;
} else
- LOG_E(MAC,"Incorrect ULSCH HARQ process %d or invalid state %d\n",hrq_id,cur_harq->state);
+ LOG_W(MAC,"Incorrect ULSCH HARQ process %d or invalid state %d (ignore this warning for RA)\n",hrq_id,cur_harq->state);
}
/*
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index b3cd91fd01..7bb08e4f04 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -183,6 +183,9 @@ void nr_schedule_pucch(int Mod_idP,
frame_t frameP,
sub_frame_t slotP);
+void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
+ int *period, int *offset);
+
void nr_csi_meas_reporting(int Mod_idP,
int UE_id,
frame_t frameP,
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index aaa3aafd92..ca37026e54 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -869,10 +869,45 @@ boolean_t pdcp_remove_UE(
return 1;
}
-void pdcp_config_set_security(const protocol_ctxt_t* const ctxt_pP, pdcp_t *pdcp_pP, rb_id_t rb_id,
- uint16_t lc_idP, uint8_t security_modeP, uint8_t *kRRCenc_pP, uint8_t *kRRCint_pP, uint8_t *kUPenc_pP)
+void pdcp_config_set_security(
+ const protocol_ctxt_t* const ctxt_pP,
+ pdcp_t *const pdcp_pP,
+ const rb_id_t rb_id,
+ const uint16_t lc_idP,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc_pP,
+ uint8_t *const kRRCint_pP,
+ uint8_t *const kUPenc_pP)
{
- TODO;
+ DevAssert(pdcp_pP != NULL);
+
+ if ((security_modeP >= 0) && (security_modeP <= 0x77)) {
+ pdcp_pP->cipheringAlgorithm = security_modeP & 0x0f;
+ pdcp_pP->integrityProtAlgorithm = (security_modeP>>4) & 0xf;
+ LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_SET_SECURITY_MODE: cipheringAlgorithm %d integrityProtAlgorithm %d\n",
+ PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP),
+ pdcp_pP->cipheringAlgorithm,
+ pdcp_pP->integrityProtAlgorithm);
+ pdcp_pP->kRRCenc = kRRCenc_pP;
+ pdcp_pP->kRRCint = kRRCint_pP;
+ pdcp_pP->kUPenc = kUPenc_pP;
+ /* Activate security */
+ pdcp_pP->security_activated = 1;
+ MSC_LOG_EVENT(
+ (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
+ "0 Set security ciph %X integ %x UE %"PRIx16" ",
+ pdcp_pP->cipheringAlgorithm,
+ pdcp_pP->integrityProtAlgorithm,
+ ctxt_pP->rnti);
+ } else {
+ MSC_LOG_EVENT(
+ (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
+ "0 Set security failed UE %"PRIx16" ",
+ ctxt_pP->rnti);
+ LOG_E(PDCP,PROTOCOL_PDCP_CTXT_FMT" bad security mode %d",
+ PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP),
+ security_modeP);
+ }
}
static boolean_t pdcp_data_req_drb(
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
index e1ae1df077..804f1e8a74 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
@@ -1285,7 +1285,7 @@ static int missing_size(nr_rlc_entity_am_t *entity, missing_data_t *m,
missing_data_t m_nack;
/* be careful to limit a range to 255 SNs, that is: cut if needed */
- sn_count = m->sn_end - m->sn_start;
+ sn_count = m->sn_end - m->sn_start + 1;
if (sn_count < 0)
sn_count += entity->sn_modulus;
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 5048dd245e..3a46f913e9 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -917,6 +917,9 @@ rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x)
void nr_rlc_tick(int frame, int subframe)
{
if (frame != nr_rlc_current_time_last_frame ||
- subframe != nr_rlc_current_time_last_subframe)
+ subframe != nr_rlc_current_time_last_subframe) {
+ nr_rlc_current_time_last_frame = frame;
+ nr_rlc_current_time_last_subframe = subframe;
nr_rlc_current_time++;
+ }
}
diff --git a/openair2/LAYER2/nr_rlc/tests/run_tests.sh b/openair2/LAYER2/nr_rlc/tests/run_tests.sh
index ac22516064..bf1b343d7e 100755
--- a/openair2/LAYER2/nr_rlc/tests/run_tests.sh
+++ b/openair2/LAYER2/nr_rlc/tests/run_tests.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-test_count=13
+test_count=14
for i in `seq $test_count`
do
diff --git a/openair2/LAYER2/nr_rlc/tests/test14.h b/openair2/LAYER2/nr_rlc/tests/test14.h
new file mode 100644
index 0000000000..9eb472b270
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/tests/test14.h
@@ -0,0 +1,46 @@
+/*
+ * am test (SN field size 18):
+ * test status reporting with missing packet
+ * at time 1, UE receives an SDU of 50 bytes
+ * at time 2, UE receives an SDU of 50 bytes
+ * at time 3, UE receives an SDU of 50 bytes
+ * at time 4, UE receives an SDU of 50 bytes
+ * transmission fails for first SDU, okay for the others
+ * then some time with transmission failing
+ * then at time 49, UE receives an SDU, transmission okay
+ * then at time 50, transmission failing again (we had a bug triggered by this)
+ * finally at time 55, transmission okay again to clear buffers
+ */
+
+TIME, 1,
+ GNB_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
+ UE_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
+ GNB_RECV_FAILS, 1,
+ GNB_PDU_SIZE, 80,
+ UE_PDU_SIZE, 80,
+ UE_SDU, 0, 50,
+TIME, 2,
+ GNB_RECV_FAILS, 0,
+ UE_SDU, 1, 50,
+TIME, 3,
+ GNB_BUFFER_STATUS,
+ UE_SDU, 2, 50,
+TIME, 4,
+ GNB_BUFFER_STATUS,
+ UE_SDU, 3, 50,
+TIME, 5,
+ GNB_BUFFER_STATUS,
+ GNB_RECV_FAILS, 1,
+TIME, 6,
+ GNB_BUFFER_STATUS,
+ UE_BUFFER_STATUS,
+TIME, 49,
+ GNB_RECV_FAILS, 0,
+ UE_SDU, 4, 50,
+TIME, 50,
+ GNB_RECV_FAILS, 1,
+ GNB_BUFFER_STATUS,
+ UE_BUFFER_STATUS,
+TIME, 55,
+ GNB_RECV_FAILS, 0,
+TIME, -1
diff --git a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz
new file mode 100644
index 0000000000..7ab2fc3431
Binary files /dev/null and b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz differ
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index d680e454e8..075c77982a 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -110,7 +110,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
ret = nr_ue_scheduler(NULL, ul_info);
if (is_nr_UL_slot(mac->scc, ul_info->slot_tx) && get_softmodem_params()->do_ra)
- nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx);
+ nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->thread_id);
switch(ret){
case UE_CONNECTION_OK:
@@ -157,7 +157,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
if (ret >= 0) {
AssertFatal( nr_ue_if_module_inst[module_id] != NULL, "IF module is NULL!\n" );
AssertFatal( nr_ue_if_module_inst[module_id]->scheduled_response != NULL, "scheduled_response is NULL!\n" );
- fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, dl_info->module_id, dl_info->cc_id, dl_info->frame, dl_info->slot);
+ fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, dl_info->module_id, dl_info->cc_id, dl_info->frame, dl_info->slot, dl_info->thread_id);
nr_ue_if_module_inst[module_id]->scheduled_response(&scheduled_response);
}
}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index aba6767465..e78529d437 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -66,8 +66,8 @@ typedef struct {
frame_t frame;
/// slot
int slot;
- /// proc is needed to signal back decoded frame number to PHY. However, this is not really FAPI procedure and should be done differently
- UE_nr_rxtx_proc_t * proc;
+ /// index of the current UE RX/TX thread
+ int thread_id;
/// NR UE FAPI-like P7 message, direction: L1 to L2
/// data reception indication structure
@@ -95,6 +95,9 @@ typedef struct {
frame_t frame_tx;
/// slot tx
uint32_t slot_tx;
+ /// index of the current UE RX/TX thread
+ int thread_id;
+
/// dci reception indication structure
fapi_nr_dci_indication_t *dci_ind;
} nr_uplink_indication_t;
@@ -111,6 +114,8 @@ typedef struct {
frame_t frame;
/// slot
int slot;
+ /// index of the current UE RX/TX thread
+ int thread_id;
/// NR UE FAPI-like P7 message, direction: L2 to L1
/// downlink transmission configuration request structure
diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h
index 06b150a673..91dc7aafd4 100644
--- a/openair2/RRC/LTE/defs_NB_IoT.h
+++ b/openair2/RRC/LTE/defs_NB_IoT.h
@@ -37,6 +37,9 @@
#include "COMMON/s1ap_messages_types.h"
#include "COMMON/rrc_messages_types.h"
+#if ITTI_SIM
+#include "COMMON/itti_sim_messages_types.h"
+#endif
#include "collection/tree.h"
#include "rrc_types_NB_IoT.h"
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index d117b18199..11c13eda32 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -43,6 +43,77 @@
extern RAN_CONTEXT_t RC;
+int
+nr_rrc_mac_remove_ue(module_id_t mod_idP,
+ rnti_t rntiP){
+ // todo
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+uint8_t
+nr_rrc_data_req(
+ const protocol_ctxt_t *const ctxt_pP,
+ const rb_id_t rb_idP,
+ const mui_t muiP,
+ const confirm_t confirmP,
+ const sdu_size_t sdu_sizeP,
+ uint8_t *const buffer_pP,
+ const pdcp_transmission_mode_t modeP
+)
+//------------------------------------------------------------------------------
+{
+ if(sdu_sizeP == 255) {
+ LOG_I(RRC,"sdu_sizeP == 255");
+ return FALSE;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE,
+ ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE,
+ buffer_pP,
+ sdu_sizeP,
+ MSC_AS_TIME_FMT"RRC_DCCH_DATA_REQ UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ctxt_pP->rnti,
+ muiP,
+ sdu_sizeP);
+ MessageDef *message_p;
+ // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (
+ ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE,
+ ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
+ sdu_sizeP);
+ memcpy (message_buffer, buffer_pP, sdu_sizeP);
+ message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
+ RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
+ RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
+ RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
+ RRC_DCCH_DATA_REQ (message_p).muip = muiP;
+ RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
+ RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
+ RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
+ //memcpy (RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
+ RRC_DCCH_DATA_REQ (message_p).mode = modeP;
+ RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
+ RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti;
+ RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
+ itti_send_msg_to_task (
+ ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
+ ctxt_pP->instance,
+ message_p);
+ LOG_I(RRC,"sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB\n");
+
+ /* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
+ * Ideally, PDCP would not neet to be triggered like this but react to ITTI
+ * messages automatically */
+ if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type))
+ pdcp_run(ctxt_pP);
+
+ return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+}
+
int8_t mac_rrc_nr_data_req(const module_id_t Mod_idP,
const int CC_id,
const frame_t frameP,
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 4cfa2c9f3f..5003e3d7c6 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -41,8 +41,34 @@
#include
#include "asn1_msg.h"
+#include "../nr_rrc_proto.h"
#include "RRC/NR/nr_rrc_extern.h"
-#if defined(NR_Rel15)
+#include "NR_DL-CCCH-Message.h"
+#include "NR_UL-CCCH-Message.h"
+#include "NR_DL-DCCH-Message.h"
+#include "NR_RRCReject.h"
+#include "NR_RejectWaitTime.h"
+#include "NR_RRCSetup.h"
+#include "NR_RRCSetup-IEs.h"
+#include "NR_SRB-ToAddModList.h"
+#include "NR_CellGroupConfig.h"
+#include "NR_RLC-BearerConfig.h"
+#include "NR_RLC-Config.h"
+#include "NR_LogicalChannelConfig.h"
+#include "NR_PDCP-Config.h"
+#include "NR_MAC-CellGroupConfig.h"
+#include "NR_SecurityModeCommand.h"
+#include "NR_CipheringAlgorithm.h"
+#include "NR_RRCReconfiguration-IEs.h"
+#include "NR_DRB-ToAddMod.h"
+#include "NR_DRB-ToAddModList.h"
+#include "NR_SecurityConfig.h"
+#include "NR_RRCReconfiguration-v1530-IEs.h"
+#include "NR_UL-DCCH-Message.h"
+#include "NR_SDAP-Config.h"
+#include "NR_RRCReconfigurationComplete.h"
+#include "NR_RRCReconfigurationComplete-IEs.h"
+#if defined(NR_Rel16)
#include "NR_SCS-SpecificCarrier.h"
#include "NR_TDD-UL-DL-ConfigCommon.h"
#include "NR_FrequencyInfoUL.h"
@@ -574,6 +600,661 @@ void do_SpCellConfig(gNB_RRC_INST *rrc,
spconfig->reconfigurationWithSync = CALLOC(1,sizeof(struct NR_ReconfigurationWithSync));
}
+//------------------------------------------------------------------------------
+uint8_t do_RRCReject(uint8_t Mod_id,
+ uint8_t *const buffer)
+//------------------------------------------------------------------------------
+{
+ asn_enc_rval_t enc_rval;;
+ NR_DL_CCCH_Message_t dl_ccch_msg;
+ NR_RRCReject_t *rrcReject;
+ NR_RejectWaitTime_t waitTime = 1;
+
+ memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
+ dl_ccch_msg.message.present = NR_DL_CCCH_MessageType_PR_c1;
+ dl_ccch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_DL_CCCH_MessageType__c1));
+ dl_ccch_msg.message.choice.c1->present = NR_RRCReject__criticalExtensions_PR_rrcReject;
+
+ dl_ccch_msg.message.choice.c1->choice.rrcReject = CALLOC(1,sizeof(NR_RRCReject_t));
+ rrcReject = dl_ccch_msg.message.choice.c1->choice.rrcReject;
+
+ rrcReject->criticalExtensions.choice.rrcReject = CALLOC(1, sizeof(struct NR_RRCReject_IEs));
+ rrcReject->criticalExtensions.choice.rrcReject->waitTime = CALLOC(1, sizeof(NR_RejectWaitTime_t));
+
+ rrcReject->criticalExtensions.present = NR_RRCReject__criticalExtensions_PR_rrcReject;
+ rrcReject->criticalExtensions.choice.rrcReject->waitTime = &waitTime;
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_CCCH_Message,
+ NULL,
+ (void *)&dl_ccch_msg,
+ buffer,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_E(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ LOG_D(NR_RRC,"RRCReject Encoded %zd bits (%zd bytes)\n",
+ enc_rval.encoded,(enc_rval.encoded+7)/8);
+ return((enc_rval.encoded+7)/8);
+}
+
+//------------------------------------------------------------------------------
+uint8_t do_RRCSetup(const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ int CC_id,
+ uint8_t *const buffer,
+ const uint8_t transaction_id,
+ NR_SRB_ToAddModList_t *SRB_configList)
+//------------------------------------------------------------------------------
+{
+ asn_enc_rval_t enc_rval;;
+ NR_DL_CCCH_Message_t dl_ccch_msg;
+ NR_RRCSetup_t *rrcSetup;
+ NR_RRCSetup_IEs_t *ie;
+ NR_SRB_ToAddMod_t *SRB1_config = NULL;
+ NR_PDCP_Config_t *pdcp_Config = NULL;
+ NR_CellGroupConfig_t *cellGroupConfig = NULL;
+ NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL;
+ NR_RLC_Config_t *rlc_Config = NULL;
+ NR_LogicalChannelConfig_t *logicalChannelConfig = NULL;
+ NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
+
+ char masterCellGroup_buf[1000];
+ long *logicalChannelGroup = NULL;
+
+ memset((void *)&dl_ccch_msg, 0, sizeof(NR_DL_CCCH_Message_t));
+ dl_ccch_msg.message.present = NR_DL_CCCH_MessageType_PR_c1;
+ dl_ccch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_DL_CCCH_MessageType__c1));
+ dl_ccch_msg.message.choice.c1->present = NR_DL_CCCH_MessageType__c1_PR_rrcSetup;
+ dl_ccch_msg.message.choice.c1->choice.rrcSetup = calloc(1, sizeof(NR_RRCSetup_t));
+
+ rrcSetup = dl_ccch_msg.message.choice.c1->choice.rrcSetup;
+ rrcSetup->criticalExtensions.present = NR_RRCSetup__criticalExtensions_PR_rrcSetup;
+ rrcSetup->rrc_TransactionIdentifier = transaction_id;
+ rrcSetup->criticalExtensions.choice.rrcSetup = calloc(1, sizeof(NR_RRCSetup_IEs_t));
+ ie = rrcSetup->criticalExtensions.choice.rrcSetup;
+
+ /****************************** radioBearerConfig ******************************/
+ /* Configure SRB1 */
+ if (SRB_configList) {
+ free(SRB_configList);
+ }
+
+ SRB_configList = calloc(1, sizeof(NR_SRB_ToAddModList_t));
+ // SRB1
+ /* TODO */
+ SRB1_config = calloc(1, sizeof(NR_SRB_ToAddMod_t));
+ SRB1_config->srb_Identity = 1;
+ // pdcp_Config->t_Reordering
+ SRB1_config->pdcp_Config = pdcp_Config;
+ ie->radioBearerConfig.srb_ToAddModList = SRB_configList;
+ ASN_SEQUENCE_ADD(&SRB_configList->list, SRB1_config);
+
+ ie->radioBearerConfig.srb3_ToRelease = NULL;
+ ie->radioBearerConfig.drb_ToAddModList = NULL;
+ ie->radioBearerConfig.drb_ToReleaseList = NULL;
+ ie->radioBearerConfig.securityConfig = NULL;
+
+ /****************************** masterCellGroup ******************************/
+ /* TODO */
+ cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
+ cellGroupConfig->cellGroupId = 0;
+
+ /* Rlc Bearer Config */
+ /* TS38.331 9.2.1 Default SRB configurations */
+ cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList));
+ rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t));
+ rlc_BearerConfig->logicalChannelIdentity = 1;
+ rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer));
+ rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
+ rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 1;
+ rlc_BearerConfig->reestablishRLC = NULL;
+ rlc_Config = calloc(1, sizeof(NR_RLC_Config_t));
+ rlc_Config->present = NR_RLC_Config_PR_am;
+ rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am));
+ rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
+ rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35;
+ rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0;
+ rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t));
+ *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12;
+ rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
+ rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity;
+ rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity;
+ rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8;
+ rlc_BearerConfig->rlc_Config = rlc_Config;
+ logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t));
+ logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters));
+ logicalChannelConfig->ul_SpecificParameters->priority = 1;
+ logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
+ logicalChannelGroup = CALLOC(1, sizeof(long));
+ *logicalChannelGroup = 0;
+ logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup;
+ rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig;
+ ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig);
+
+ cellGroupConfig->rlc_BearerToReleaseList = NULL;
+ cellGroupConfig->sCellToAddModList = NULL;
+ cellGroupConfig->sCellToReleaseList = NULL;
+
+ /* mac CellGroup Config */
+ mac_CellGroupConfig = calloc(1, sizeof(NR_MAC_CellGroupConfig_t));
+ mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config));
+ mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10;
+ mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80;
+ mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config));
+ mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup;
+ mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup));
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf10;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf10;
+ mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1;
+ cellGroupConfig->mac_CellGroupConfig = mac_CellGroupConfig;
+
+ // cellGroupConfig.physicalCellGroupConfig;
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
+ NULL,
+ (void *)cellGroupConfig,
+ masterCellGroup_buf,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ if (OCTET_STRING_fromBuf(&ie->masterCellGroup, masterCellGroup_buf, (enc_rval.encoded+7)/8) == -1) {
+ LOG_E(NR_RRC, "fatal: OCTET_STRING_fromBuf failed\n");
+ return -1;
+ }
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_CCCH_Message,
+ NULL,
+ (void *)&dl_ccch_msg,
+ buffer,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_E(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ LOG_D(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n",
+ enc_rval.encoded,(enc_rval.encoded+7)/8);
+ return((enc_rval.encoded+7)/8);
+}
+
+uint8_t do_NR_SecurityModeCommand(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *const buffer,
+ const uint8_t Transaction_id,
+ const uint8_t cipheringAlgorithm,
+ NR_IntegrityProtAlgorithm_t *integrityProtAlgorithm
+)
+//------------------------------------------------------------------------------
+{
+ NR_DL_DCCH_Message_t dl_dcch_msg;
+ asn_enc_rval_t enc_rval;
+ memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
+ dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
+ dl_dcch_msg.message.choice.c1=CALLOC(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
+ dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_securityModeCommand;
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand = CALLOC(1, sizeof(struct NR_SecurityModeCommand));
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand->rrc_TransactionIdentifier = Transaction_id;
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.present = NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand;
+
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand =
+ CALLOC(1, sizeof(struct NR_SecurityModeCommand_IEs));
+ // the two following information could be based on the mod_id
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm
+ = (NR_CipheringAlgorithm_t)cipheringAlgorithm;
+ dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm
+ = integrityProtAlgorithm;
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
+ NULL,
+ (void *)&dl_dcch_msg,
+ buffer,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ LOG_D(NR_RRC,"[gNB %d] securityModeCommand for UE %x Encoded %zd bits (%zd bytes)\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti,
+ enc_rval.encoded,
+ (enc_rval.encoded+7)/8);
+
+ if (enc_rval.encoded==-1) {
+ LOG_E(NR_RRC,"[gNB %d] ASN1 : securityModeCommand encoding failed for UE %x\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti);
+ return(-1);
+ }
+
+ // rrc_ue_process_ueCapabilityEnquiry(0,1000,&dl_dcch_msg.message.choice.c1.choice.ueCapabilityEnquiry,0);
+ // exit(-1);
+ return((enc_rval.encoded+7)/8);
+}
+
+/*TODO*/
+//------------------------------------------------------------------------------
+uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *const buffer,
+ const uint8_t Transaction_id)
+//------------------------------------------------------------------------------
+{
+ NR_DL_DCCH_Message_t dl_dcch_msg;
+ NR_UE_CapabilityRAT_Request_t *ue_capabilityrat_request;
+
+ asn_enc_rval_t enc_rval;
+ memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
+ dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
+ dl_dcch_msg.message.choice.c1 = CALLOC(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
+ dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry;
+ dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry = CALLOC(1,sizeof(struct NR_UECapabilityEnquiry));
+ dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry->rrc_TransactionIdentifier = Transaction_id;
+ dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry->criticalExtensions.present = NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry;
+ dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry = CALLOC(1,sizeof(struct NR_UECapabilityEnquiry_IEs));
+ ue_capabilityrat_request = CALLOC(1,sizeof(NR_UE_CapabilityRAT_Request_t));
+ memset(ue_capabilityrat_request,0,sizeof(NR_UE_CapabilityRAT_Request_t));
+ ue_capabilityrat_request->rat_Type = NR_RAT_Type_nr;
+
+ ASN_SEQUENCE_ADD(&dl_dcch_msg.message.choice.c1->choice.ueCapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry->ue_CapabilityRAT_RequestList.list,
+ ue_capabilityrat_request);
+
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
+ NULL,
+ (void *)&dl_dcch_msg,
+ buffer,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ LOG_D(NR_RRC,"[gNB %d] NR UECapabilityRequest for UE %x Encoded %zd bits (%zd bytes)\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti,
+ enc_rval.encoded,
+ (enc_rval.encoded+7)/8);
+
+ if (enc_rval.encoded==-1) {
+ LOG_E(NR_RRC,"[gNB %d] ASN1 : NR UECapabilityRequest encoding failed for UE %x\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti);
+ return(-1);
+ }
+
+ return((enc_rval.encoded+7)/8);
+}
+
+
+uint8_t do_NR_RRCConnectionRelease(uint8_t *buffer,
+ uint8_t Transaction_id) {
+ asn_enc_rval_t enc_rval;
+ NR_DL_DCCH_Message_t dl_dcch_msg;
+ NR_RRCRelease_t *rrcConnectionRelease;
+ memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
+ dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
+ dl_dcch_msg.message.choice.c1=CALLOC(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
+ dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_rrcRelease;
+ dl_dcch_msg.message.choice.c1->choice.rrcRelease = CALLOC(1, sizeof(struct NR_RRCRelease));
+ rrcConnectionRelease = dl_dcch_msg.message.choice.c1->choice.rrcRelease;
+ // RRCConnectionRelease
+ rrcConnectionRelease->rrc_TransactionIdentifier = Transaction_id;
+ rrcConnectionRelease->criticalExtensions.present = NR_RRCRelease__criticalExtensions_PR_rrcRelease;
+ rrcConnectionRelease->criticalExtensions.choice.rrcRelease = NULL;
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
+ NULL,
+ (void *)&dl_dcch_msg,
+ buffer,
+ RRC_BUF_SIZE);
+ if(enc_rval.encoded == -1) {
+ LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+ return((enc_rval.encoded+7)/8);
+}
+
+uint16_t do_RRCReconfiguration(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ uint8_t *buffer,
+ uint8_t Transaction_id,
+ gNB_RRC_INST *gnb_rrc_inst
+)
+{
+ NR_DL_DCCH_Message_t dl_dcch_msg;
+ asn_enc_rval_t enc_rval;
+ NR_RRCReconfiguration_IEs_t *ie;
+ NR_SRB_ToAddModList_t *SRB_configList = NULL;
+ NR_SRB_ToAddModList_t *SRB_configList2 = NULL;
+ NR_SRB_ToAddMod_t *SRB2_config = NULL;
+ NR_DRB_ToAddModList_t *DRB_configList = NULL;
+ NR_DRB_ToAddModList_t *DRB_configList2 = NULL;
+ NR_DRB_ToAddMod_t *DRB_config = NULL;
+ NR_SDAP_Config_t *sdap_config = NULL;
+ NR_SecurityConfig_t *security_config = NULL;
+ NR_DedicatedNAS_Message_t *dedicatedNAS_Message = NULL;
+
+ memset(&dl_dcch_msg, 0, sizeof(NR_DL_DCCH_Message_t));
+ dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
+ dl_dcch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_DL_DCCH_MessageType__c1));
+ dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
+
+ dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration = calloc(1, sizeof(NR_RRCReconfiguration_t));
+ dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = Transaction_id;
+ dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.present = NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
+
+ /******************** Radio Bearer Config ********************/
+ /* Configure SRB2 */
+ SRB_configList2 = ue_context_pP->ue_context.SRB_configList2[Transaction_id];
+ SRB_configList = ue_context_pP->ue_context.SRB_configList;
+ SRB_configList = CALLOC(1, sizeof(*SRB_configList));
+ memset(SRB_configList, 0, sizeof(*SRB_configList));
+
+ if (SRB_configList2) {
+ free(SRB_configList2);
+ }
+
+ SRB_configList2 = CALLOC(1, sizeof(*SRB_configList2));
+ memset(SRB_configList2, 0, sizeof(*SRB_configList2));
+ SRB2_config = CALLOC(1, sizeof(*SRB2_config));
+ SRB2_config->srb_Identity = 2;
+ ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config);
+ ASN_SEQUENCE_ADD(&SRB_configList2->list, SRB2_config);
+
+ /* Configure DRB */
+ DRB_configList = ue_context_pP->ue_context.DRB_configList;
+ if (DRB_configList) {
+ free(DRB_configList);
+ }
+
+ DRB_configList = CALLOC(1, sizeof(*DRB_configList));
+ memset(DRB_configList, 0, sizeof(*DRB_configList));
+
+ DRB_configList2 = ue_context_pP->ue_context.DRB_configList2[Transaction_id];
+ if (DRB_configList2) {
+ free(DRB_configList2);
+ }
+ DRB_configList2 = CALLOC(1, sizeof(*DRB_configList2));
+ memset(DRB_configList2, 0, sizeof(*DRB_configList2));
+
+ DRB_config = CALLOC(1, sizeof(*DRB_config));
+ DRB_config->drb_Identity = 1;
+ DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
+ DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
+ // TODO sdap_Config
+ sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
+ memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
+ DRB_config->cnAssociation->choice.sdap_Config = sdap_config;
+ // TODO pdcp_Config
+ DRB_config->reestablishPDCP = NULL;
+ DRB_config->recoverPDCP = NULL;
+ DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
+ DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
+ DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
+ *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_ms30;
+ DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
+ *DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
+ DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
+ *DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
+ DRB_config->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
+ DRB_config->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
+
+ DRB_config->pdcp_Config->drb->integrityProtection = NULL;
+ DRB_config->pdcp_Config->drb->statusReportRequired = NULL;
+ DRB_config->pdcp_Config->drb->outOfOrderDelivery = NULL;
+ DRB_config->pdcp_Config->moreThanOneRLC = NULL;
+
+ DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
+ *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
+ DRB_config->pdcp_Config->ext1 = NULL;
+
+ ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config);
+ ASN_SEQUENCE_ADD(&DRB_configList2->list, DRB_config);
+
+ /* Configure Security */
+ // security_config = CALLOC(1, sizeof(NR_SecurityConfig_t));
+ // security_config->securityAlgorithmConfig = CALLOC(1, sizeof(*ie->radioBearerConfig->securityConfig->securityAlgorithmConfig));
+ // security_config->securityAlgorithmConfig->cipheringAlgorithm = NR_CipheringAlgorithm_nea0;
+ // security_config->securityAlgorithmConfig->integrityProtAlgorithm = NULL;
+ // security_config->keyToUse = CALLOC(1, sizeof(*ie->radioBearerConfig->securityConfig->keyToUse));
+ // *security_config->keyToUse = NR_SecurityConfig__keyToUse_master;
+
+ ie = calloc(1, sizeof(NR_RRCReconfiguration_IEs_t));
+ ie->radioBearerConfig = calloc(1, sizeof(NR_RadioBearerConfig_t));
+ ie->radioBearerConfig->srb_ToAddModList = SRB_configList;
+ ie->radioBearerConfig->drb_ToAddModList = DRB_configList;
+ ie->radioBearerConfig->securityConfig = security_config;
+ ie->radioBearerConfig->srb3_ToRelease = NULL;
+ ie->radioBearerConfig->drb_ToReleaseList = NULL;
+
+ /******************** Secondary Cell Group ********************/
+ // rrc_gNB_carrier_data_t *carrier = &(gnb_rrc_inst->carrier);
+ // fill_default_secondaryCellGroup( carrier->servingcellconfigcommon,
+ // ue_context_pP->ue_context.secondaryCellGroup,
+ // 1,
+ // 1,
+ // carrier->pdsch_AntennaPorts,
+ // carrier->initial_csi_index[gnb_rrc_inst->Nb_ue]);
+
+ /******************** Meas Config ********************/
+ // measConfig
+ ie->measConfig = NULL;
+ // lateNonCriticalExtension
+ ie->lateNonCriticalExtension = NULL;
+ // nonCriticalExtension
+ ie->nonCriticalExtension = calloc(1, sizeof(NR_RRCReconfiguration_v1530_IEs_t));
+ dedicatedNAS_Message = calloc(1, sizeof(NR_DedicatedNAS_Message_t));
+ dedicatedNAS_Message->buf = ue_context_pP->ue_context.nas_pdu.buffer;
+ dedicatedNAS_Message->size = ue_context_pP->ue_context.nas_pdu.length;
+ ie->nonCriticalExtension->dedicatedNAS_MessageList = calloc(1, sizeof(struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList));
+ ASN_SEQUENCE_ADD(&ie->nonCriticalExtension->dedicatedNAS_MessageList->list, dedicatedNAS_Message);
+
+ dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie;
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
+ NULL,
+ (void *)&dl_dcch_msg,
+ buffer,
+ 100);
+
+ if(enc_rval.encoded == -1) {
+ LOG_I(NR_RRC, "[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ return -1;
+ }
+
+ LOG_D(NR_RRC,"[gNB %d] RRCReconfiguration for UE %x Encoded %zd bits (%zd bytes)\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti,
+ enc_rval.encoded,
+ (enc_rval.encoded+7)/8);
+
+ if (enc_rval.encoded == -1) {
+ LOG_E(NR_RRC,"[gNB %d] ASN1 : RRCReconfiguration encoding failed for UE %x\n",
+ ctxt_pP->module_id,
+ ctxt_pP->rnti);
+ return(-1);
+ }
+
+ return((enc_rval.encoded+7)/8);
+}
+
+
+uint8_t do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv) {
+ asn_enc_rval_t enc_rval;
+ uint8_t buf[5],buf2=0;
+ NR_UL_CCCH_Message_t ul_ccch_msg;
+ NR_RRCSetupRequest_t *rrcSetupRequest;
+ memset((void *)&ul_ccch_msg,0,sizeof(NR_UL_CCCH_Message_t));
+ ul_ccch_msg.message.present = NR_UL_CCCH_MessageType_PR_c1;
+ ul_ccch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_UL_CCCH_MessageType__c1));
+ ul_ccch_msg.message.choice.c1->present = NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest;
+ ul_ccch_msg.message.choice.c1->choice.rrcSetupRequest = CALLOC(1, sizeof(NR_RRCSetupRequest_t));
+ rrcSetupRequest = ul_ccch_msg.message.choice.c1->choice.rrcSetupRequest;
+
+
+ if (1) {
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.present = NR_InitialUE_Identity_PR_randomValue;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.size = 5;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.bits_unused = 1;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf = buf;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf[0] = rv[0];
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf[1] = rv[1];
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf[2] = rv[2];
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf[3] = rv[3];
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.randomValue.buf[4] = rv[4]&0xfe;
+ } else {
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.present = NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.ng_5G_S_TMSI_Part1.size = 1;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.ng_5G_S_TMSI_Part1.bits_unused = 0;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.ng_5G_S_TMSI_Part1.buf = buf;
+ rrcSetupRequest->rrcSetupRequest.ue_Identity.choice.ng_5G_S_TMSI_Part1.buf[0] = 0x12;
+ }
+
+ rrcSetupRequest->rrcSetupRequest.establishmentCause = NR_EstablishmentCause_mo_Signalling; //EstablishmentCause_mo_Data;
+ rrcSetupRequest->rrcSetupRequest.spare.buf = &buf2;
+ rrcSetupRequest->rrcSetupRequest.spare.size=1;
+ rrcSetupRequest->rrcSetupRequest.spare.bits_unused = 7;
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_CCCH_Message, (void *)&ul_ccch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_CCCH_Message,
+ NULL,
+ (void *)&ul_ccch_msg,
+ buffer,
+ 100);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
+ LOG_D(NR_RRC,"[UE] RRCSetupRequest Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
+ return((enc_rval.encoded+7)/8);
+}
+//------------------------------------------------------------------------------
+uint8_t
+do_NR_RRCReconfigurationComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *buffer,
+ const uint8_t Transaction_id
+)
+//------------------------------------------------------------------------------
+{
+ asn_enc_rval_t enc_rval;
+ NR_UL_DCCH_Message_t ul_dcch_msg;
+ NR_RRCReconfigurationComplete_t *rrcReconfigurationComplete;
+ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
+ ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
+ ul_dcch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_UL_DCCH_MessageType__c1));
+ ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_rrcReconfigurationComplete;
+ ul_dcch_msg.message.choice.c1->choice.rrcReconfigurationComplete = CALLOC(1, sizeof(NR_RRCReconfigurationComplete_t));
+ rrcReconfigurationComplete = ul_dcch_msg.message.choice.c1->choice.rrcReconfigurationComplete;
+ rrcReconfigurationComplete->rrc_TransactionIdentifier = Transaction_id;
+ rrcReconfigurationComplete->criticalExtensions.choice.rrcReconfigurationComplete = CALLOC(1, sizeof(NR_RRCReconfigurationComplete_IEs_t));
+ rrcReconfigurationComplete->criticalExtensions.present =
+ NR_RRCReconfigurationComplete__criticalExtensions_PR_rrcReconfigurationComplete;
+ rrcReconfigurationComplete->criticalExtensions.choice.rrcReconfigurationComplete->nonCriticalExtension = NULL;
+ rrcReconfigurationComplete->criticalExtensions.choice.rrcReconfigurationComplete->lateNonCriticalExtension = NULL;
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message,
+ NULL,
+ (void *)&ul_dcch_msg,
+ buffer,
+ 100);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ LOG_I(NR_RRC,"rrcReconfigurationComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
+ return((enc_rval.encoded+7)/8);
+}
+
+uint8_t do_RRCSetupComplete(uint8_t Mod_id, uint8_t *buffer, const uint8_t Transaction_id, uint8_t sel_plmn_id, const int dedicatedInfoNASLength, const char *dedicatedInfoNAS){
+ asn_enc_rval_t enc_rval;
+
+ NR_UL_DCCH_Message_t ul_dcch_msg;
+ NR_RRCSetupComplete_t *RrcSetupComplete;
+ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
+
+ uint8_t buf[6];
+
+ ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
+ ul_dcch_msg.message.choice.c1 = CALLOC(1,sizeof(struct NR_UL_DCCH_MessageType__c1));
+ ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
+ ul_dcch_msg.message.choice.c1->choice.rrcSetupComplete = CALLOC(1, sizeof(NR_RRCSetupComplete_t));
+ RrcSetupComplete = ul_dcch_msg.message.choice.c1->choice.rrcSetupComplete;
+ RrcSetupComplete->rrc_TransactionIdentifier = Transaction_id;
+ RrcSetupComplete->criticalExtensions.present = NR_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete = CALLOC(1, sizeof(NR_RRCSetupComplete_IEs_t));
+ // RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->nonCriticalExtension = CALLOC(1,
+ // sizeof(*RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->nonCriticalExtension));
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->selectedPLMN_Identity = sel_plmn_id;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->registeredAMF = NULL;
+
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value = CALLOC(1, sizeof(struct NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value));
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->present = NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size = 6;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf = buf;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[0] = 0x12;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[1] = 0x34;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[2] = 0x56;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[3] = 0x78;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[4] = 0x9A;
+ RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.buf[5] = 0xBC;
+
+ memset(&RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->dedicatedNAS_Message,0,sizeof(OCTET_STRING_t));
+ OCTET_STRING_fromBuf(&RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete->dedicatedNAS_Message,dedicatedInfoNAS,dedicatedInfoNASLength);
+if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
+}
+
+enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message,
+ NULL,
+ (void *)&ul_dcch_msg,
+ buffer,
+ 100);
+AssertFatal(enc_rval.encoded > 0,"ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name,enc_rval.encoded);
+LOG_D(NR_RRC,"RRCSetupComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
+
+return((enc_rval.encoded+7)/8);
+}
int do_DLInformationTransfer_NR (void * p) {
return 0;
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index 3f647cb887..78deda904d 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -82,3 +82,47 @@ void do_PHYSICALCELLGROUP(uint8_t Mod_id,
void do_SpCellConfig(gNB_RRC_INST *rrc,
struct NR_SpCellConfig *spconfig);
+
+uint8_t do_RRCReject(uint8_t Mod_id,
+ uint8_t *const buffer);
+
+uint8_t do_RRCSetup(const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ int CC_id,
+ uint8_t *const buffer,
+ const uint8_t transaction_id,
+ NR_SRB_ToAddModList_t *SRB_configList);
+uint8_t do_NR_SecurityModeCommand(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *const buffer,
+ const uint8_t Transaction_id,
+ const uint8_t cipheringAlgorithm,
+ NR_IntegrityProtAlgorithm_t *integrityProtAlgorithm);
+
+uint8_t do_NR_SA_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *const buffer,
+ const uint8_t Transaction_id);
+
+uint8_t do_NR_RRCConnectionRelease(uint8_t *buffer,
+ uint8_t Transaction_id);
+uint16_t do_RRCReconfiguration(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ uint8_t *buffer,
+ uint8_t Transaction_id,
+ gNB_RRC_INST *gnb_rrc_inst);
+
+uint8_t do_RRCSetupComplete(uint8_t Mod_id,
+ uint8_t *buffer,
+ const uint8_t Transaction_id,
+ uint8_t sel_plmn_id,
+ const int dedicatedInfoNASLength,
+ const char *dedicatedInfoNAS);
+
+uint8_t do_RRCSetupRequest(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv);
+
+uint8_t do_NR_RRCReconfigurationComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *buffer,
+ const uint8_t Transaction_id
+ );
diff --git a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1 b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1
new file mode 100644
index 0000000000..353e3e398f
--- /dev/null
+++ b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1
@@ -0,0 +1,12881 @@
+NR-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- TAG-BCCH-BCH-MESSAGE-START
+
+BCCH-BCH-Message ::= SEQUENCE {
+ message BCCH-BCH-MessageType
+}
+
+BCCH-BCH-MessageType ::= CHOICE {
+ mib MIB,
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-BCCH-BCH-MESSAGE-STOP
+-- TAG-BCCH-DL-SCH-MESSAGE-START
+
+BCCH-DL-SCH-Message ::= SEQUENCE {
+ message BCCH-DL-SCH-MessageType
+}
+
+BCCH-DL-SCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ systemInformation SystemInformation,
+ systemInformationBlockType1 SIB1
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-BCCH-DL-SCH-MESSAGE-STOP
+-- TAG-DL-CCCH-MESSAGE-START
+
+DL-CCCH-Message ::= SEQUENCE {
+ message DL-CCCH-MessageType
+}
+
+DL-CCCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ rrcReject RRCReject,
+ rrcSetup RRCSetup,
+ spare2 NULL,
+ spare1 NULL
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-DL-CCCH-MESSAGE-STOP
+-- TAG-DL-DCCH-MESSAGE-START
+
+DL-DCCH-Message ::= SEQUENCE {
+ message DL-DCCH-MessageType
+}
+
+DL-DCCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ rrcReconfiguration RRCReconfiguration,
+ rrcResume RRCResume,
+ rrcRelease RRCRelease,
+ rrcReestablishment RRCReestablishment,
+ securityModeCommand SecurityModeCommand,
+ dlInformationTransfer DLInformationTransfer,
+ ueCapabilityEnquiry UECapabilityEnquiry,
+ counterCheck CounterCheck,
+ mobilityFromNRCommand MobilityFromNRCommand,
+ dlDedicatedMessageSegment-r16 DLDedicatedMessageSegment-r16,
+ ueInformationRequest-r16 UEInformationRequest-r16,
+ dlInformationTransferMRDC-r16 DLInformationTransferMRDC-r16,
+ loggedMeasurementConfiguration-r16 LoggedMeasurementConfiguration-r16,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-DL-DCCH-MESSAGE-STOP
+-- TAG-PCCH-PCH-MESSAGE-START
+
+PCCH-Message ::= SEQUENCE {
+ message PCCH-MessageType
+}
+
+PCCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ paging Paging,
+ spare1 NULL
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-PCCH-PCH-MESSAGE-STOP
+-- TAG-UL-CCCH-MESSAGE-START
+
+
+UL-CCCH-Message ::= SEQUENCE {
+ message UL-CCCH-MessageType
+}
+
+UL-CCCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ rrcSetupRequest RRCSetupRequest,
+ rrcResumeRequest RRCResumeRequest,
+ rrcReestablishmentRequest RRCReestablishmentRequest,
+ rrcSystemInfoRequest RRCSystemInfoRequest
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-UL-CCCH-MESSAGE-STOP
+-- TAG-UL-CCCH1-MESSAGE-START
+
+
+UL-CCCH1-Message ::= SEQUENCE {
+ message UL-CCCH1-MessageType
+}
+
+UL-CCCH1-MessageType ::= CHOICE {
+ c1 CHOICE {
+ rrcResumeRequest1 RRCResumeRequest1,
+ spare3 NULL,
+ spare2 NULL,
+ spare1 NULL
+
+ },
+ messageClassExtension SEQUENCE {}
+}
+
+-- TAG-UL-CCCH1-MESSAGE-STOP
+-- TAG-UL-DCCH-MESSAGE-START
+
+UL-DCCH-Message ::= SEQUENCE {
+ message UL-DCCH-MessageType
+}
+
+UL-DCCH-MessageType ::= CHOICE {
+ c1 CHOICE {
+ measurementReport MeasurementReport,
+ rrcReconfigurationComplete RRCReconfigurationComplete,
+ rrcSetupComplete RRCSetupComplete,
+ rrcReestablishmentComplete RRCReestablishmentComplete,
+ rrcResumeComplete RRCResumeComplete,
+ securityModeComplete SecurityModeComplete,
+ securityModeFailure SecurityModeFailure,
+ ulInformationTransfer ULInformationTransfer,
+ locationMeasurementIndication LocationMeasurementIndication,
+ ueCapabilityInformation UECapabilityInformation,
+ counterCheckResponse CounterCheckResponse,
+ ueAssistanceInformation UEAssistanceInformation,
+ failureInformation FailureInformation,
+ ulInformationTransferMRDC ULInformationTransferMRDC,
+ scgFailureInformation SCGFailureInformation,
+ scgFailureInformationEUTRA SCGFailureInformationEUTRA
+ },
+ messageClassExtension CHOICE {
+ c2 CHOICE {
+ ulDedicatedMessageSegment-r16 ULDedicatedMessageSegment-r16,
+ dedicatedSIBRequest-r16 DedicatedSIBRequest-r16,
+ mcgFailureInformation-r16 MCGFailureInformation-r16,
+ ueInformationResponse-r16 UEInformationResponse-r16,
+ sidelinkUEInformationNR-r16 SidelinkUEInformationNR-r16,
+ ulInformationTransferIRAT-r16 ULInformationTransferIRAT-r16,
+ iabOtherInformation-r16 IABOtherInformation-r16,
+ spare9 NULL, spare8 NULL, spare7 NULL, spare6 NULL,
+ spare5 NULL, spare4 NULL, spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ messageClassExtensionFuture-r16 SEQUENCE {}
+ }
+}
+
+-- TAG-UL-DCCH-MESSAGE-STOP
+-- TAG-COUNTERCHECK-START
+
+
+CounterCheck ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ counterCheck CounterCheck-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+CounterCheck-IEs ::= SEQUENCE {
+ drb-CountMSB-InfoList DRB-CountMSB-InfoList,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+DRB-CountMSB-InfoList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info
+
+DRB-CountMSB-Info ::= SEQUENCE {
+ drb-Identity DRB-Identity,
+ countMSB-Uplink INTEGER(0..33554431),
+ countMSB-Downlink INTEGER(0..33554431)
+}
+
+-- TAG-COUNTERCHECK-STOP
+-- TAG-COUNTERCHECKRESPONSE-START
+
+CounterCheckResponse ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ counterCheckResponse CounterCheckResponse-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+CounterCheckResponse-IEs ::= SEQUENCE {
+ drb-CountInfoList DRB-CountInfoList,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+
+}
+
+DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo
+
+DRB-CountInfo ::= SEQUENCE {
+ drb-Identity DRB-Identity,
+ count-Uplink INTEGER(0..4294967295),
+ count-Downlink INTEGER(0..4294967295)
+}
+
+-- TAG-COUNTERCHECKRESPONSE-STOP
+-- TAG-DEDICATEDSIBREQUEST-START
+
+DedicatedSIBRequest-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ dedicatedSIBRequest-r16 DedicatedSIBRequest-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+DedicatedSIBRequest-r16-IEs ::= SEQUENCE {
+ onDemandSIB-RequestList-r16 SEQUENCE {
+
+ requestedSIB-List-r16 SEQUENCE (SIZE (1..maxOnDemandSIB-r16)) OF SIB-ReqInfo-r16 OPTIONAL,
+ requestedPosSIB-List-r16 SEQUENCE (SIZE (1..maxOnDemandPosSIB-r16)) OF PosSIB-ReqInfo-r16 OPTIONAL
+ } OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+SIB-ReqInfo-r16 ::= ENUMERATED { sib12, sib13, sib14, spare5, spare4, spare3, spare2, spare1 }
+
+PosSIB-ReqInfo-r16 ::= SEQUENCE {
+ gnss-id-r16 GNSS-ID-r16 OPTIONAL,
+ sbas-id-r16 SBAS-ID-r16 OPTIONAL,
+ posSibType-r16 ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+ posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+ posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+ posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+ posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+ posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+ posSibType5-1, posSibType6-1, posSibType6-2, posSibType6-3,... }
+}
+
+-- TAG-DEDICATEDSIBREQUEST-STOP
+-- TAG-DLDEDICATEDMESSAGESEGMENT-START
+
+
+DLDedicatedMessageSegment-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ dlDedicatedMessageSegment-r16 DLDedicatedMessageSegment-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+DLDedicatedMessageSegment-r16-IEs ::= SEQUENCE {
+ segmentNumber-r16 INTEGER(0..4),
+ rrc-MessageSegmentContainer-r16 OCTET STRING,
+ rrc-MessageSegmentType-r16 ENUMERATED {notLastSegment, lastSegment},
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-DLDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-DLINFORMATIONTRANSFER-START
+
+DLInformationTransfer ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ dlInformationTransfer DLInformationTransfer-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+DLInformationTransfer-IEs ::= SEQUENCE {
+ dedicatedNAS-Message DedicatedNAS-Message OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension DLInformationTransfer-v1610-IEs OPTIONAL
+}
+
+DLInformationTransfer-v1610-IEs ::= SEQUENCE {
+ referenceTimeInfo-r16 ReferenceTimeInfo-r16 OPTIONAL, -- Need R
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFER-STOP
+-- TAG-DLINFORMATIONTRANSFERMRDC-START
+
+DLInformationTransferMRDC-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ dlInformationTransferMRDC-r16 DLInformationTransferMRDC-r16-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+DLInformationTransferMRDC-r16-IEs::= SEQUENCE {
+ dl-DCCH-MessageNR-r16 OCTET STRING OPTIONAL, -- Need N
+ dl-DCCH-MessageEUTRA-r16 OCTET STRING OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFERMRDC-STOP
+-- TAG-FAILUREINFORMATION-START
+
+FailureInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ failureInformation FailureInformation-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+FailureInformation-IEs ::= SEQUENCE {
+ failureInfoRLC-Bearer FailureInfoRLC-Bearer OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension FailureInformation-v1610-IEs OPTIONAL
+}
+
+FailureInfoRLC-Bearer ::= SEQUENCE {
+ cellGroupId CellGroupId,
+ logicalChannelIdentity LogicalChannelIdentity,
+ failureType ENUMERATED {rlc-failure, spare3, spare2, spare1}
+}
+
+FailureInformation-v1610-IEs ::= SEQUENCE {
+ failureInfoDAPS-r16 FailureInfoDAPS-r16 OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+FailureInfoDAPS-r16 ::= SEQUENCE {
+ failureType-r16 ENUMERATED {daps-failure, spare3, spare2, spare1}
+}
+
+-- TAG-FAILUREINFORMATION-STOP
+-- TAG-IABOTHERINFORMATION-START
+
+IABOtherInformation-r16 ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ iabOtherInformation-r16 IABOtherInformation-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+IABOtherInformation-r16-IEs ::= SEQUENCE {
+ ip-InfoType CHOICE {
+ iab-IP-Request-r16 SEQUENCE {
+ iab-IPv4-AddressNumReq-r16 IAB-IPAddressNumReq-r16 OPTIONAL,
+ iab-IPv6-AddressReq-r16 CHOICE {
+ iab-IPv6-AddressNumReq-r16 IAB-IPAddressNumReq-r16,
+ iab-IPv6-AddressPrefixReq-r16 IAB-IPAddressPrefixReq-r16,
+ ...
+ } OPTIONAL
+ },
+ iab-IP-Report-r16 SEQUENCE {
+ iab-IPv4-AddressReport-r16 IAB-IP-AddressAndTraffic-r16 OPTIONAL,
+ iab-IPv6-Report-r16 CHOICE {
+ iab-IPv6-AddressReport-r16 IAB-IP-AddressAndTraffic-r16,
+ iab-IPv6-PrefixReport-r16 IAB-IP-PrefixAndTraffic-r16,
+ ...
+ } OPTIONAL
+ },
+ ...
+ },
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+IAB-IPAddressNumReq-r16 ::= SEQUENCE {
+ all-Traffic-NumReq-r16 INTEGER (1..8) OPTIONAL,
+ f1-C-Traffic-NumReq-r16 INTEGER (1..8) OPTIONAL,
+ f1-U-Traffic-NumReq-r16 INTEGER (1..8) OPTIONAL,
+ non-F1-Traffic-NumReq-r16 INTEGER (1..8) OPTIONAL,
+ ...
+}
+
+IAB-IPAddressPrefixReq-r16 ::= SEQUENCE {
+ all-Traffic-PrefixReq-r16 ENUMERATED {true} OPTIONAL,
+ f1-C-Traffic-PrefixReq-r16 ENUMERATED {true} OPTIONAL,
+ f1-U-Traffic-PrefixReq-r16 ENUMERATED {true} OPTIONAL,
+ non-F1-Traffic-PrefixReq-r16 ENUMERATED {true} OPTIONAL,
+ ...
+}
+
+IAB-IP-AddressAndTraffic-r16 ::= SEQUENCE {
+ all-Traffic-IAB-IP-Address-r16 SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16 OPTIONAL,
+ f1-C-Traffic-IP-Address-r16 SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16 OPTIONAL,
+ f1-U-Traffic-IP-Address-r16 SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16 OPTIONAL,
+ non-F1-Traffic-IP-Address-r16 SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16 OPTIONAL
+}
+
+IAB-IP-PrefixAndTraffic-r16 ::= SEQUENCE {
+ all-Traffic-IAB-IP-Address-r16 IAB-IP-Address-r16 OPTIONAL,
+ f1-C-Traffic-IP-Address-r16 IAB-IP-Address-r16 OPTIONAL,
+ f1-U-Traffic-IP-Address-r16 IAB-IP-Address-r16 OPTIONAL,
+ non-F1-Traffic-IP-Address-r16 IAB-IP-Address-r16 OPTIONAL
+}
+
+-- TAG-IABOTHERINFORMATION-STOP
+-- TAG-LOCATIONMEASUREMENTINDICATION-START
+
+LocationMeasurementIndication ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ locationMeasurementIndication LocationMeasurementIndication-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+LocationMeasurementIndication-IEs ::= SEQUENCE {
+ measurementIndication SetupRelease {LocationMeasurementInfo},
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-LOCATIONMEASUREMENTINDICATION-STOP
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-START
+
+LoggedMeasurementConfiguration-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ loggedMeasurementConfiguration-r16 LoggedMeasurementConfiguration-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+LoggedMeasurementConfiguration-r16-IEs ::= SEQUENCE {
+ traceReference-r16 TraceReference-r16,
+ traceRecordingSessionRef-r16 OCTET STRING (SIZE (2)),
+ tce-Id-r16 OCTET STRING (SIZE (1)),
+ absoluteTimeInfo-r16 AbsoluteTimeInfo-r16,
+ areaConfiguration-r16 AreaConfiguration-r16 OPTIONAL, --Need R
+ plmn-IdentityList-r16 PLMN-IdentityList2-r16 OPTIONAL, --Need R
+ bt-NameList-r16 SetupRelease {BT-NameList-r16} OPTIONAL, --Need M
+ wlan-NameList-r16 SetupRelease {WLAN-NameList-r16} OPTIONAL, --Need M
+ sensor-NameList-r16 SetupRelease {Sensor-NameList-r16} OPTIONAL, --Need M
+ loggingDuration-r16 LoggingDuration-r16,
+ reportType CHOICE {
+ periodical LoggedPeriodicalReportConfig-r16,
+ eventTriggered LoggedEventTriggerConfig-r16,
+ ...
+ },
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+LoggedPeriodicalReportConfig-r16 ::= SEQUENCE {
+ loggingInterval-r16 LoggingInterval-r16,
+ ...
+ }
+
+LoggedEventTriggerConfig-r16 ::= SEQUENCE {
+ eventType-r16 EventType-r16,
+ loggingInterval-r16 LoggingInterval-r16,
+ ...
+}
+
+EventType-r16 ::= CHOICE {
+ outOfCoverage NULL,
+ eventL1 SEQUENCE {
+ l1-Threshold MeasTriggerQuantity,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger
+ },
+ ...
+}
+
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-STOP
+-- TAG-MCGFAILUREINFORMATION-START
+
+MCGFailureInformation-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ mcgFailureInformation-r16 MCGFailureInformation-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+MCGFailureInformation-r16-IEs ::= SEQUENCE {
+ failureReportMCG-r16 FailureReportMCG-r16 OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+FailureReportMCG-r16 ::= SEQUENCE {
+ failureType-r16 ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+ t312-Expiry-r16, lbt-Failure-r16, beamFailureRecoveryFailure-r16,
+ bh-RLF-r16, spare1} OPTIONAL,
+ measResultFreqList-r16 MeasResultList2NR OPTIONAL,
+ measResultFreqListEUTRA-r16 MeasResultList2EUTRA OPTIONAL,
+ measResultSCG-r16 OCTET STRING (CONTAINING MeasResultSCG-Failure) OPTIONAL,
+ measResultSCG-EUTRA-r16 OCTET STRING OPTIONAL,
+ measResultFreqListUTRA-FDD-r16 MeasResultList2UTRA OPTIONAL,
+ ...
+}
+
+MeasResultList2UTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2UTRA-FDD-r16
+
+MeasResult2UTRA-FDD-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueUTRA-FDD-r16,
+ measResultNeighCellList-r16 MeasResultListUTRA-FDD-r16
+}
+
+MeasResultList2EUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+-- TAG-MCGFAILUREINFORMATION-STOP
+-- TAG-MEASUREMENTREPORT-START
+
+MeasurementReport ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ measurementReport MeasurementReport-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+MeasurementReport-IEs ::= SEQUENCE {
+ measResults MeasResults,
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-MEASUREMENTREPORT-STOP
+-- TAG-MIB-START
+
+MIB ::= SEQUENCE {
+ systemFrameNumber BIT STRING (SIZE (6)),
+ subCarrierSpacingCommon ENUMERATED {scs15or60, scs30or120},
+ ssb-SubcarrierOffset INTEGER (0..15),
+ dmrs-TypeA-Position ENUMERATED {pos2, pos3},
+ pdcch-ConfigSIB1 PDCCH-ConfigSIB1,
+ cellBarred ENUMERATED {barred, notBarred},
+ intraFreqReselection ENUMERATED {allowed, notAllowed},
+ spare BIT STRING (SIZE (1))
+}
+
+-- TAG-MIB-STOP
+-- TAG-MOBILITYFROMNRCOMMAND-START
+
+MobilityFromNRCommand ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ mobilityFromNRCommand MobilityFromNRCommand-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+MobilityFromNRCommand-IEs ::= SEQUENCE {
+ targetRAT-Type ENUMERATED { eutra, utra-fdd-v1610, spare2, spare1, ...},
+ targetRAT-MessageContainer OCTET STRING,
+ nas-SecurityParamFromNR OCTET STRING OPTIONAL, -- Cond HO-ToEPCUTRAN
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension MobilityFromNRCommand-v1610-IEs OPTIONAL
+}
+
+MobilityFromNRCommand-v1610-IEs ::= SEQUENCE {
+ voiceFallbackIndication-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-MOBILITYFROMNRCOMMAND-STOP
+-- TAG-PAGING-START
+
+Paging ::= SEQUENCE {
+ pagingRecordList PagingRecordList OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+PagingRecordList ::= SEQUENCE (SIZE(1..maxNrofPageRec)) OF PagingRecord
+
+PagingRecord ::= SEQUENCE {
+ ue-Identity PagingUE-Identity,
+ accessType ENUMERATED {non3GPP} OPTIONAL, -- Need N
+ ...
+}
+
+PagingUE-Identity ::= CHOICE {
+ ng-5G-S-TMSI NG-5G-S-TMSI,
+ fullI-RNTI I-RNTI-Value,
+ ...
+}
+
+-- TAG-PAGING-STOP
+-- TAG-RRCREESTABLISHMENT-START
+
+RRCReestablishment ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcReestablishment RRCReestablishment-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCReestablishment-IEs ::= SEQUENCE {
+ nextHopChainingCount NextHopChainingCount,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENT-STOP
+-- TAG-RRCREESTABLISHMENTCOMPLETE-START
+
+RRCReestablishmentComplete ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcReestablishmentComplete RRCReestablishmentComplete-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCReestablishmentComplete-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCReestablishmentComplete-v1610-IEs OPTIONAL
+}
+
+RRCReestablishmentComplete-v1610-IEs ::= SEQUENCE {
+ ueMeasurementsAvailable-r16 UEMeasurementsAvailable-r16 OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENTCOMPLETE-STOP
+-- TAG-RRCREESTABLISHMENTREQUEST-START
+
+
+RRCReestablishmentRequest ::= SEQUENCE {
+ rrcReestablishmentRequest RRCReestablishmentRequest-IEs
+}
+
+RRCReestablishmentRequest-IEs ::= SEQUENCE {
+ ue-Identity ReestabUE-Identity,
+ reestablishmentCause ReestablishmentCause,
+ spare BIT STRING (SIZE (1))
+}
+
+ReestabUE-Identity ::= SEQUENCE {
+ c-RNTI RNTI-Value,
+ physCellId PhysCellId,
+ shortMAC-I ShortMAC-I
+}
+
+ReestablishmentCause ::= ENUMERATED {reconfigurationFailure, handoverFailure, otherFailure, spare1}
+
+-- TAG-RRCREESTABLISHMENTREQUEST-STOP
+-- TAG-RRCRECONFIGURATION-START
+
+RRCReconfiguration ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcReconfiguration RRCReconfiguration-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCReconfiguration-IEs ::= SEQUENCE {
+ radioBearerConfig RadioBearerConfig OPTIONAL, -- Need M
+ secondaryCellGroup OCTET STRING (CONTAINING CellGroupConfig) OPTIONAL, -- Cond SCG
+ measConfig MeasConfig OPTIONAL, -- Need M
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCReconfiguration-v1530-IEs OPTIONAL
+}
+
+RRCReconfiguration-v1530-IEs ::= SEQUENCE {
+ masterCellGroup OCTET STRING (CONTAINING CellGroupConfig) OPTIONAL, -- Need M
+ fullConfig ENUMERATED {true} OPTIONAL, -- Cond FullConfig
+ dedicatedNAS-MessageList SEQUENCE (SIZE(1..maxDRB)) OF DedicatedNAS-Message OPTIONAL, -- Cond nonHO
+ masterKeyUpdate MasterKeyUpdate OPTIONAL, -- Cond MasterKeyChange
+ dedicatedSIB1-Delivery OCTET STRING (CONTAINING SIB1) OPTIONAL, -- Need N
+ dedicatedSystemInformationDelivery OCTET STRING (CONTAINING SystemInformation) OPTIONAL, -- Need N
+ otherConfig OtherConfig OPTIONAL, -- Need M
+ nonCriticalExtension RRCReconfiguration-v1540-IEs OPTIONAL
+}
+
+RRCReconfiguration-v1540-IEs ::= SEQUENCE {
+ otherConfig-v1540 OtherConfig-v1540 OPTIONAL, -- Need M
+ nonCriticalExtension RRCReconfiguration-v1560-IEs OPTIONAL
+}
+
+RRCReconfiguration-v1560-IEs ::= SEQUENCE {
+ mrdc-SecondaryCellGroupConfig SetupRelease { MRDC-SecondaryCellGroupConfig } OPTIONAL, -- Need M
+ radioBearerConfig2 OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL, -- Need M
+ sk-Counter SK-Counter OPTIONAL, -- Need N
+ nonCriticalExtension RRCReconfiguration-v1610-IEs OPTIONAL
+}
+RRCReconfiguration-v1610-IEs ::= SEQUENCE {
+ otherConfig-v1610 OtherConfig-v1610 OPTIONAL, -- Need M
+ bap-Config-r16 SetupRelease { BAP-Config-r16 } OPTIONAL, -- Need M
+ iab-IP-AddressConfigurationList-r16 IAB-IP-AddressConfigurationList-r16 OPTIONAL, -- Need M
+ conditionalReconfiguration-r16 ConditionalReconfiguration-r16 OPTIONAL, -- Need M
+ daps-SourceRelease-r16 ENUMERATED{true} OPTIONAL, -- Need N
+ t316-r16 SetupRelease {T316-r16} OPTIONAL, -- Need M
+ needForGapsConfigNR-r16 SetupRelease {NeedForGapsConfigNR-r16} OPTIONAL, -- Need M
+ onDemandSIB-Request-r16 SetupRelease { OnDemandSIB-Request-r16 } OPTIONAL, -- Need M
+ dedicatedPosSysInfoDelivery-r16 OCTET STRING (CONTAINING PosSystemInformation-r16-IEs) OPTIONAL, -- Need N
+ sl-ConfigDedicatedNR-r16 SetupRelease {SL-ConfigDedicatedNR-r16} OPTIONAL, -- Need M
+ sl-ConfigDedicatedEUTRA-Info-r16 SetupRelease {SL-ConfigDedicatedEUTRA-Info-r16} OPTIONAL, -- Need M
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+MRDC-SecondaryCellGroupConfig ::= SEQUENCE {
+ mrdc-ReleaseAndAdd ENUMERATED {true} OPTIONAL, -- Need N
+ mrdc-SecondaryCellGroup CHOICE {
+ nr-SCG OCTET STRING (CONTAINING RRCReconfiguration),
+ eutra-SCG OCTET STRING
+ }
+}
+
+BAP-Config-r16 ::= SEQUENCE {
+ bap-Address-r16 BIT STRING (SIZE (10)) OPTIONAL, -- Need M
+ defaultUL-BAProutingID-r16 BAP-Routing-ID-r16 OPTIONAL, -- Need M
+ defaultUL-BH-RLC-Channel-r16 BH-RLC-ChannelID-r16 OPTIONAL, -- Need M
+ flowControlFeedbackType-r16 ENUMERATED {perBH-RLC-Channel, perRoutingID, both} OPTIONAL, -- Need R
+ ...
+}
+
+MasterKeyUpdate ::= SEQUENCE {
+ keySetChangeIndicator BOOLEAN,
+ nextHopChainingCount NextHopChainingCount,
+ nas-Container OCTET STRING OPTIONAL, -- Cond securityNASC
+ ...
+}
+
+OnDemandSIB-Request-r16 ::= SEQUENCE {
+ onDemandSIB-RequestProhibitTimer-r16 ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30}
+}
+
+T316-r16 ::= ENUMERATED {ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms1000, ms1500, ms2000}
+
+IAB-IP-AddressConfigurationList-r16 ::= SEQUENCE {
+ iab-IP-AddressToAddModList-r16 SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressConfiguration-r16 OPTIONAL, -- Need N
+ iab-IP-AddressToReleaseList-r16 SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressIndex-r16 OPTIONAL, -- Need N
+ ...
+}
+
+IAB-IP-AddressConfiguration-r16 ::= SEQUENCE {
+ iab-IP-AddressIndex-r16 IAB-IP-AddressIndex-r16,
+ iab-IP-Address-r16 IAB-IP-Address-r16 OPTIONAL, -- Need M
+ iab-IP-Usage-r16 IAB-IP-Usage-r16 OPTIONAL, -- Need M
+ iab-donor-DU-BAP-Address-r16 BIT STRING (SIZE(10)) OPTIONAL, -- Need M
+...
+}
+
+SL-ConfigDedicatedEUTRA-Info-r16 ::= SEQUENCE {
+ sl-ConfigDedicatedEUTRA-r16 OCTET STRING OPTIONAL, -- Need M
+ sl-TimeOffsetEUTRA-List-r16 SEQUENCE (SIZE (8)) OF SL-TimeOffsetEUTRA-r16 OPTIONAL -- Need M
+}
+
+SL-TimeOffsetEUTRA-r16 ::= ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1, ms1dot25, ms1dot5, ms1dot75,
+ ms2, ms2dot5, ms3, ms4, ms5, ms6, ms8, ms10, ms20}
+
+-- TAG-RRCRECONFIGURATION-STOP
+-- TAG-RRCRECONFIGURATIONCOMPLETE-START
+
+RRCReconfigurationComplete ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcReconfigurationComplete RRCReconfigurationComplete-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCReconfigurationComplete-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCReconfigurationComplete-v1530-IEs OPTIONAL
+}
+
+RRCReconfigurationComplete-v1530-IEs ::= SEQUENCE {
+ uplinkTxDirectCurrentList UplinkTxDirectCurrentList OPTIONAL,
+ nonCriticalExtension RRCReconfigurationComplete-v1560-IEs OPTIONAL
+}
+
+RRCReconfigurationComplete-v1560-IEs ::= SEQUENCE {
+ scg-Response CHOICE {
+ nr-SCG-Response OCTET STRING (CONTAINING RRCReconfigurationComplete),
+ eutra-SCG-Response OCTET STRING
+ } OPTIONAL,
+ nonCriticalExtension RRCReconfigurationComplete-v1610-IEs OPTIONAL
+}
+
+RRCReconfigurationComplete-v1610-IEs ::= SEQUENCE {
+ ueMeasurementsAvailable-r16 UEMeasurementsAvailable-r16 OPTIONAL,
+ needForGapsInfoNR-r16 NeedForGapsInfoNR-r16 OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONCOMPLETE-STOP
+-- TAG-RRCREJECT-START
+
+RRCReject ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ rrcReject RRCReject-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCReject-IEs ::= SEQUENCE {
+ waitTime RejectWaitTime OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-RRCREJECT-STOP
+-- TAG-RRCRELEASE-START
+
+RRCRelease ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcRelease RRCRelease-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCRelease-IEs ::= SEQUENCE {
+ redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need N
+ cellReselectionPriorities CellReselectionPriorities OPTIONAL, -- Need R
+ suspendConfig SuspendConfig OPTIONAL, -- Need R
+ deprioritisationReq SEQUENCE {
+ deprioritisationType ENUMERATED {frequency, nr},
+ deprioritisationTimer ENUMERATED {min5, min10, min15, min30}
+ } OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCRelease-v1540-IEs OPTIONAL
+}
+
+RRCRelease-v1540-IEs ::= SEQUENCE {
+ waitTime RejectWaitTime OPTIONAL, -- Need N
+ nonCriticalExtension RRCRelease-v1610-IEs OPTIONAL
+}
+
+RRCRelease-v1610-IEs ::= SEQUENCE {
+ voiceFallbackIndication-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ measIdleConfig-r16 SetupRelease {MeasIdleConfigDedicated-r16} OPTIONAL, -- Need M
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+RedirectedCarrierInfo ::= CHOICE {
+ nr CarrierInfoNR,
+ eutra RedirectedCarrierInfo-EUTRA,
+ ...
+}
+
+RedirectedCarrierInfo-EUTRA ::= SEQUENCE {
+ eutraFrequency ARFCN-ValueEUTRA,
+ cnType ENUMERATED {epc,fiveGC} OPTIONAL -- Need N
+}
+
+CarrierInfoNR ::= SEQUENCE {
+ carrierFreq ARFCN-ValueNR,
+ ssbSubcarrierSpacing SubcarrierSpacing,
+ smtc SSB-MTC OPTIONAL, -- Need S
+ ...
+}
+
+SuspendConfig ::= SEQUENCE {
+ fullI-RNTI I-RNTI-Value,
+ shortI-RNTI ShortI-RNTI-Value,
+ ran-PagingCycle PagingCycle,
+ ran-NotificationAreaInfo RAN-NotificationAreaInfo OPTIONAL, -- Need M
+ t380 PeriodicRNAU-TimerValue OPTIONAL, -- Need R
+ nextHopChainingCount NextHopChainingCount,
+ ...
+}
+
+
+PeriodicRNAU-TimerValue ::= ENUMERATED { min5, min10, min20, min30, min60, min120, min360, min720}
+
+
+CellReselectionPriorities ::= SEQUENCE {
+ freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need M
+ freqPriorityListNR FreqPriorityListNR OPTIONAL, -- Need M
+ t320 ENUMERATED {min5, min10, min20, min30, min60, min120, min180, spare1} OPTIONAL, -- Need R
+ ...
+}
+
+PagingCycle ::= ENUMERATED {rf32, rf64, rf128, rf256}
+
+FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA
+
+FreqPriorityListNR ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityNR
+
+FreqPriorityEUTRA ::= SEQUENCE {
+ carrierFreq ARFCN-ValueEUTRA,
+ cellReselectionPriority CellReselectionPriority,
+ cellReselectionSubPriority CellReselectionSubPriority OPTIONAL -- Need R
+}
+
+FreqPriorityNR ::= SEQUENCE {
+ carrierFreq ARFCN-ValueNR,
+ cellReselectionPriority CellReselectionPriority,
+ cellReselectionSubPriority CellReselectionSubPriority OPTIONAL -- Need R
+}
+
+RAN-NotificationAreaInfo ::= CHOICE {
+ cellList PLMN-RAN-AreaCellList,
+ ran-AreaConfigList PLMN-RAN-AreaConfigList,
+ ...
+}
+
+PLMN-RAN-AreaCellList ::= SEQUENCE (SIZE (1.. maxPLMNIdentities)) OF PLMN-RAN-AreaCell
+
+PLMN-RAN-AreaCell ::= SEQUENCE {
+ plmn-Identity PLMN-Identity OPTIONAL, -- Need S
+ ran-AreaCells SEQUENCE (SIZE (1..32)) OF CellIdentity
+}
+
+PLMN-RAN-AreaConfigList ::= SEQUENCE (SIZE (1..maxPLMNIdentities)) OF PLMN-RAN-AreaConfig
+
+PLMN-RAN-AreaConfig ::= SEQUENCE {
+ plmn-Identity PLMN-Identity OPTIONAL, -- Need S
+ ran-Area SEQUENCE (SIZE (1..16)) OF RAN-AreaConfig
+}
+
+RAN-AreaConfig ::= SEQUENCE {
+ trackingAreaCode TrackingAreaCode,
+ ran-AreaCodeList SEQUENCE (SIZE (1..32)) OF RAN-AreaCode OPTIONAL -- Need R
+}
+
+-- TAG-RRCRELEASE-STOP
+-- TAG-RRCRESUME-START
+
+RRCResume ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcResume RRCResume-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCResume-IEs ::= SEQUENCE {
+ radioBearerConfig RadioBearerConfig OPTIONAL, -- Need M
+ masterCellGroup OCTET STRING (CONTAINING CellGroupConfig) OPTIONAL, -- Need M
+ measConfig MeasConfig OPTIONAL, -- Need M
+ fullConfig ENUMERATED {true} OPTIONAL, -- Need N
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCResume-v1560-IEs OPTIONAL
+}
+
+RRCResume-v1560-IEs ::= SEQUENCE {
+ radioBearerConfig2 OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL, -- Need M
+ sk-Counter SK-Counter OPTIONAL, -- Need N
+ nonCriticalExtension RRCResume-v1610-IEs OPTIONAL
+}
+
+RRCResume-v1610-IEs ::= SEQUENCE {
+ idleModeMeasurementReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ restoreMCG-SCells-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ restoreSCG-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ mrdc-SecondaryCellGroup-r16 CHOICE {
+ nr-SCG-r16 OCTET STRING (CONTAINING RRCReconfiguration),
+ eutra-SCG-r16 OCTET STRING
+ } OPTIONAL, -- Cond RestoreSCG
+ needForGapsConfigNR-r16 SetupRelease {NeedForGapsConfigNR-r16} OPTIONAL, -- Need M
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-RRCRESUME-STOP
+-- TAG-RRCRESUMECOMPLETE-START
+
+RRCResumeComplete ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcResumeComplete RRCResumeComplete-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCResumeComplete-IEs ::= SEQUENCE {
+ dedicatedNAS-Message DedicatedNAS-Message OPTIONAL,
+ selectedPLMN-Identity INTEGER (1..maxPLMN) OPTIONAL,
+ uplinkTxDirectCurrentList UplinkTxDirectCurrentList OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCResumeComplete-v1610-IEs OPTIONAL
+}
+
+RRCResumeComplete-v1610-IEs ::= SEQUENCE {
+ idleMeasAvailable-r16 ENUMERATED {true} OPTIONAL,
+ measResultIdleEUTRA-r16 MeasResultIdleEUTRA-r16 OPTIONAL,
+ measResultIdleNR-r16 MeasResultIdleNR-r16 OPTIONAL,
+ scg-Response-r16 CHOICE {
+ nr-SCG-Response OCTET STRING (CONTAINING RRCReconfigurationComplete),
+ eutra-SCG-Response OCTET STRING
+ } OPTIONAL,
+ ueMeasurementsAvailable-r16 UEMeasurementsAvailable-r16 OPTIONAL,
+ mobilityHistoryAvail-r16 ENUMERATED {true} OPTIONAL,
+ mobilityState-r16 ENUMERATED {normal, medium, high, spare} OPTIONAL,
+ needForGapsInfoNR-r16 NeedForGapsInfoNR-r16 OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-RRCRESUMECOMPLETE-STOP
+-- TAG-RRCRESUMEREQUEST-START
+
+RRCResumeRequest ::= SEQUENCE {
+ rrcResumeRequest RRCResumeRequest-IEs
+}
+
+RRCResumeRequest-IEs ::= SEQUENCE {
+ resumeIdentity ShortI-RNTI-Value,
+ resumeMAC-I BIT STRING (SIZE (16)),
+ resumeCause ResumeCause,
+ spare BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST-STOP
+-- TAG-RRCRESUMEREQUEST1-START
+
+RRCResumeRequest1 ::= SEQUENCE {
+ rrcResumeRequest1 RRCResumeRequest1-IEs
+}
+
+RRCResumeRequest1-IEs ::= SEQUENCE {
+ resumeIdentity I-RNTI-Value,
+ resumeMAC-I BIT STRING (SIZE (16)),
+ resumeCause ResumeCause,
+ spare BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST1-STOP
+-- TAG-RRCSETUP-START
+
+RRCSetup ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcSetup RRCSetup-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCSetup-IEs ::= SEQUENCE {
+ radioBearerConfig RadioBearerConfig,
+ masterCellGroup OCTET STRING (CONTAINING CellGroupConfig),
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-RRCSETUP-STOP
+-- TAG-RRCSETUPCOMPLETE-START
+
+RRCSetupComplete ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ rrcSetupComplete RRCSetupComplete-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+RRCSetupComplete-IEs ::= SEQUENCE {
+ selectedPLMN-Identity INTEGER (1..maxPLMN),
+ registeredAMF RegisteredAMF OPTIONAL,
+ guami-Type ENUMERATED {native, mapped} OPTIONAL,
+ s-NSSAI-List SEQUENCE (SIZE (1..maxNrofS-NSSAI)) OF S-NSSAI OPTIONAL,
+ dedicatedNAS-Message DedicatedNAS-Message,
+ ng-5G-S-TMSI-Value CHOICE {
+ ng-5G-S-TMSI NG-5G-S-TMSI,
+ ng-5G-S-TMSI-Part2 BIT STRING (SIZE (9))
+ } OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension RRCSetupComplete-v1610-IEs OPTIONAL
+}
+
+RRCSetupComplete-v1610-IEs ::= SEQUENCE {
+ iab-NodeIndication-r16 ENUMERATED {true} OPTIONAL,
+ idleMeasAvailable-r16 ENUMERATED {true} OPTIONAL,
+ ueMeasurementsAvailable-r16 UEMeasurementsAvailable-r16 OPTIONAL,
+ mobilityHistoryAvail-r16 ENUMERATED {true} OPTIONAL,
+ mobilityState-r16 ENUMERATED {normal, medium, high, spare} OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+RegisteredAMF ::= SEQUENCE {
+ plmn-Identity PLMN-Identity OPTIONAL,
+ amf-Identifier AMF-Identifier
+}
+
+-- TAG-RRCSETUPCOMPLETE-STOP
+-- TAG-RRCSETUPREQUEST-START
+
+RRCSetupRequest ::= SEQUENCE {
+ rrcSetupRequest RRCSetupRequest-IEs
+}
+
+RRCSetupRequest-IEs ::= SEQUENCE {
+ ue-Identity InitialUE-Identity,
+ establishmentCause EstablishmentCause,
+ spare BIT STRING (SIZE (1))
+}
+
+InitialUE-Identity ::= CHOICE {
+ ng-5G-S-TMSI-Part1 BIT STRING (SIZE (39)),
+ randomValue BIT STRING (SIZE (39))
+}
+
+EstablishmentCause ::= ENUMERATED {
+ emergency, highPriorityAccess, mt-Access, mo-Signalling,
+ mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, mps-PriorityAccess, mcs-PriorityAccess,
+ spare6, spare5, spare4, spare3, spare2, spare1}
+
+-- TAG-RRCSETUPREQUEST-STOP
+-- TAG-RRCSYSTEMINFOREQUEST-START
+
+RRCSystemInfoRequest ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ rrcSystemInfoRequest RRCSystemInfoRequest-IEs,
+ criticalExtensionsFuture-r16 CHOICE {
+ rrcPosSystemInfoRequest-r16 RRC-PosSystemInfoRequest-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+ }
+}
+
+RRCSystemInfoRequest-IEs ::= SEQUENCE {
+ requested-SI-List BIT STRING (SIZE (maxSI-Message)), --32bits
+ spare BIT STRING (SIZE (12))
+}
+
+RRC-PosSystemInfoRequest-r16-IEs ::= SEQUENCE {
+ requestedPosSI-List BIT STRING (SIZE (maxSI-Message)), --32bits
+ spare BIT STRING (SIZE (11))
+}
+
+-- TAG-RRCSYSTEMINFOREQUEST-STOP
+-- TAG-SCGFAILUREINFORMATION-START
+
+SCGFailureInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ scgFailureInformation SCGFailureInformation-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SCGFailureInformation-IEs ::= SEQUENCE {
+ failureReportSCG FailureReportSCG OPTIONAL,
+ nonCriticalExtension SCGFailureInformation-v1590-IEs OPTIONAL
+}
+
+SCGFailureInformation-v1590-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+FailureReportSCG ::= SEQUENCE {
+ failureType ENUMERATED {
+ t310-Expiry, randomAccessProblem,
+ rlc-MaxNumRetx,
+ synchReconfigFailureSCG, scg-ReconfigFailure,
+ srb3-IntegrityFailure, other-r16, spare1},
+ measResultFreqList MeasResultFreqList OPTIONAL,
+ measResultSCG-Failure OCTET STRING (CONTAINING MeasResultSCG-Failure) OPTIONAL,
+ ...,
+ [[
+ locationInfo-r16 LocationInfo-r16 OPTIONAL,
+ failureType-v1610 ENUMERATED {scg-lbtFailure-r16, beamFailureRecoveryFailure-r16, t312-Expiry-r16, bh-RLF-r16,
+ spare4, spare3, spare2, spare1} OPTIONAL
+ ]]
+}
+
+MeasResultFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+
+-- TAG-SCGFAILUREINFORMATION-STOP
+-- TAG-SCGFAILUREINFORMATIONEUTRA-START
+
+SCGFailureInformationEUTRA ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ scgFailureInformationEUTRA SCGFailureInformationEUTRA-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SCGFailureInformationEUTRA-IEs ::= SEQUENCE {
+ failureReportSCG-EUTRA FailureReportSCG-EUTRA OPTIONAL,
+ nonCriticalExtension SCGFailureInformationEUTRA-v1590-IEs OPTIONAL
+}
+
+SCGFailureInformationEUTRA-v1590-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+FailureReportSCG-EUTRA ::= SEQUENCE {
+ failureType ENUMERATED {
+ t313-Expiry, randomAccessProblem,
+ rlc-MaxNumRetx, scg-ChangeFailure,
+ scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+ t312-Expiry-r16, spare},
+ measResultFreqListMRDC MeasResultFreqListFailMRDC OPTIONAL,
+ measResultSCG-FailureMRDC OCTET STRING OPTIONAL,
+ ...,
+ [[
+ locationInfo-r16 LocationInfo-r16 OPTIONAL
+ ]]
+}
+
+MeasResultFreqListFailMRDC ::= SEQUENCE (SIZE (1.. maxFreq)) OF MeasResult2EUTRA
+
+-- TAG-SCGFAILUREINFORMATIONEUTRA-STOP
+-- TAG-SECURITYMODECOMMAND-START
+
+SecurityModeCommand ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ securityModeCommand SecurityModeCommand-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SecurityModeCommand-IEs ::= SEQUENCE {
+ securityConfigSMC SecurityConfigSMC,
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+SecurityConfigSMC ::= SEQUENCE {
+ securityAlgorithmConfig SecurityAlgorithmConfig,
+ ...
+}
+
+-- TAG-SECURITYMODECOMMAND-STOP
+-- TAG-SECURITYMODECOMPLETE-START
+
+SecurityModeComplete ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ securityModeComplete SecurityModeComplete-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SecurityModeComplete-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-SECURITYMODECOMPLETE-STOP
+-- TAG-SECURITYMODEFAILURE-START
+
+SecurityModeFailure ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ securityModeFailure SecurityModeFailure-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SecurityModeFailure-IEs ::= SEQUENCE {
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-SECURITYMODEFAILURE-STOP
+-- TAG-SIB1-START
+
+SIB1 ::= SEQUENCE {
+ cellSelectionInfo SEQUENCE {
+ q-RxLevMin Q-RxLevMin,
+ q-RxLevMinOffset INTEGER (1..8) OPTIONAL, -- Need S
+ q-RxLevMinSUL Q-RxLevMin OPTIONAL, -- Need R
+ q-QualMin Q-QualMin OPTIONAL, -- Need S
+ q-QualMinOffset INTEGER (1..8) OPTIONAL -- Need S
+ } OPTIONAL, -- Cond Standalone
+ cellAccessRelatedInfo CellAccessRelatedInfo,
+ connEstFailureControl ConnEstFailureControl OPTIONAL, -- Need R
+ si-SchedulingInfo SI-SchedulingInfo OPTIONAL, -- Need R
+ servingCellConfigCommon ServingCellConfigCommonSIB OPTIONAL, -- Need R
+ ims-EmergencySupport ENUMERATED {true} OPTIONAL, -- Need R
+ eCallOverIMS-Support ENUMERATED {true} OPTIONAL, -- Need R
+ ue-TimersAndConstants UE-TimersAndConstants OPTIONAL, -- Need R
+ uac-BarringInfo SEQUENCE {
+ uac-BarringForCommon UAC-BarringPerCatList OPTIONAL, -- Need S
+ uac-BarringPerPLMN-List UAC-BarringPerPLMN-List OPTIONAL, -- Need S
+ uac-BarringInfoSetList UAC-BarringInfoSetList,
+ uac-AccessCategory1-SelectionAssistanceInfo CHOICE {
+ plmnCommon UAC-AccessCategory1-SelectionAssistanceInfo,
+ individualPLMNList SEQUENCE (SIZE (2..maxPLMN)) OF UAC-AccessCategory1-SelectionAssistanceInfo
+ } OPTIONAL -- Need S
+ } OPTIONAL, -- Need R
+ useFullResumeID ENUMERATED {true} OPTIONAL, -- Need R
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SIB1-v1610-IEs OPTIONAL
+}
+
+SIB1-v1610-IEs ::= SEQUENCE {
+ idleModeMeasurementsEUTRA-r16 ENUMERATED{true} OPTIONAL, -- Need R
+ idleModeMeasurementsNR-r16 ENUMERATED{true} OPTIONAL, -- Need R
+ posSI-SchedulingInfo-r16 PosSI-SchedulingInfo-r16 OPTIONAL, -- Need R
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+UAC-AccessCategory1-SelectionAssistanceInfo ::= ENUMERATED {a, b, c}
+
+-- TAG-SIB1-STOP
+-- TAG-SIDELINKUEINFORMATIONNR-START
+
+SidelinkUEInformationNR-r16::= SEQUENCE {
+ criticalExtensions CHOICE {
+ sidelinkUEInformationNR-r16 SidelinkUEInformationNR-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+SidelinkUEInformationNR-r16-IEs ::= SEQUENCE {
+ sl-RxInterestedFreqList-r16 SL-InterestedFreqList-r16 OPTIONAL,
+ sl-TxResourceReqList-r16 SL-TxResourceReqList-r16 OPTIONAL,
+ sl-FailureList-r16 SL-FailureList-r16 OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+SL-InterestedFreqList-r16 ::= SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-TxResourceReqList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-TxResourceReq-r16
+
+SL-TxResourceReq-r16 ::= SEQUENCE {
+ sl-DestinationIdentity-r16 SL-DestinationIdentity-r16,
+ sl-CastType-r16 ENUMERATED {broadcast, groupcast, unicast, spare1},
+ sl-RLC-ModeIndicationList-r16 SEQUENCE (SIZE (1.. maxNrofSLRB-r16)) OF SL-RLC-ModeIndication-r16 OPTIONAL,
+ sl-QoS-InfoList-r16 SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16 OPTIONAL,
+ sl-TypeTxSyncList-r16 SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-TypeTxSync-r16 OPTIONAL,
+ sl-TxInterestedFreqList-r16 SL-TxInterestedFreqList-r16 OPTIONAL,
+ sl-CapabilityInformationSidelink-r16 OCTET STRING OPTIONAL
+}
+
+SL-TxInterestedFreqList-r16 ::= SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-QoS-Info-r16 ::= SEQUENCE {
+ sl-QoS-FlowIdentity-r16 SL-QoS-FlowIdentity-r16,
+ sl-QoS-Profile-r16 SL-QoS-Profile-r16 OPTIONAL
+}
+
+SL-RLC-ModeIndication-r16 ::= SEQUENCE {
+ sl-Mode-r16 CHOICE {
+ sl-AM-Mode-r16 NULL,
+ sl-UM-Mode-r16 NULL
+ },
+ sl-QoS-InfoList-r16 SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16
+}
+
+SL-FailureList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-Failure-r16
+
+SL-Failure-r16 ::= SEQUENCE {
+ sl-DestinationIdentity-r16 SL-DestinationIdentity-r16,
+ sl-Failure-r16 ENUMERATED {rlf,configFailure, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-SIDELINKUEINFORMATIONNR-STOP
+-- TAG-SYSTEMINFORMATION-START
+
+SystemInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ systemInformation SystemInformation-IEs,
+ criticalExtensionsFuture-r16 CHOICE {
+ posSystemInformation-r16 PosSystemInformation-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+ }
+}
+
+SystemInformation-IEs ::= SEQUENCE {
+ sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+ sib2 SIB2,
+ sib3 SIB3,
+ sib4 SIB4,
+ sib5 SIB5,
+ sib6 SIB6,
+ sib7 SIB7,
+ sib8 SIB8,
+ sib9 SIB9,
+ ...,
+ sib10-v1610 SIB10-r16,
+ sib11-v1610 SIB11-r16,
+ sib12-v1610 SIB12-r16,
+ sib13-v1610 SIB13-r16,
+ sib14-v1610 SIB14-r16
+ },
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-SYSTEMINFORMATION-STOP
+-- TAG-UEASSISTANCEINFORMATION-START
+
+UEAssistanceInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ ueAssistanceInformation UEAssistanceInformation-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UEAssistanceInformation-IEs ::= SEQUENCE {
+ delayBudgetReport DelayBudgetReport OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension UEAssistanceInformation-v1540-IEs OPTIONAL
+}
+
+DelayBudgetReport::= CHOICE {
+ type1 ENUMERATED {
+ msMinus1280, msMinus640, msMinus320, msMinus160,msMinus80, msMinus60, msMinus40,
+ msMinus20, ms0, ms20,ms40, ms60, ms80, ms160, ms320, ms640, ms1280},
+ ...
+}
+
+UEAssistanceInformation-v1540-IEs ::= SEQUENCE {
+ overheatingAssistance OverheatingAssistance OPTIONAL,
+ nonCriticalExtension UEAssistanceInformation-v1610-IEs OPTIONAL
+}
+
+OverheatingAssistance ::= SEQUENCE {
+ reducedMaxCCs ReducedMaxCCs-r16 OPTIONAL,
+ reducedMaxBW-FR1 ReducedMaxBW-FRx-r16 OPTIONAL,
+ reducedMaxBW-FR2 ReducedMaxBW-FRx-r16 OPTIONAL,
+ reducedMaxMIMO-LayersFR1 SEQUENCE {
+ reducedMIMO-LayersFR1-DL MIMO-LayersDL,
+ reducedMIMO-LayersFR1-UL MIMO-LayersUL
+ } OPTIONAL,
+ reducedMaxMIMO-LayersFR2 SEQUENCE {
+ reducedMIMO-LayersFR2-DL MIMO-LayersDL,
+ reducedMIMO-LayersFR2-UL MIMO-LayersUL
+ } OPTIONAL
+}
+
+ReducedAggregatedBandwidth ::= ENUMERATED {mhz0, mhz10, mhz20, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100, mhz200, mhz300, mhz400}
+
+UEAssistanceInformation-v1610-IEs ::= SEQUENCE {
+ idc-Assistance-r16 IDC-Assistance-r16 OPTIONAL,
+ drx-Preference-r16 DRX-Preference-r16 OPTIONAL,
+ maxBW-Preference-r16 MaxBW-Preference-r16 OPTIONAL,
+ maxCC-Preference-r16 MaxCC-Preference-r16 OPTIONAL,
+ maxMIMO-LayerPreference-r16 MaxMIMO-LayerPreference-r16 OPTIONAL,
+ minSchedulingOffsetPreference-r16 MinSchedulingOffsetPreference-r16 OPTIONAL,
+ releasePreference-r16 ReleasePreference-r16 OPTIONAL,
+ sl-UE-AssistanceInformationNR-r16 SL-UE-AssistanceInformationNR-r16 OPTIONAL,
+ referenceTimeInfoPreference-r16 BOOLEAN OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+IDC-Assistance-r16 ::= SEQUENCE {
+ affectedCarrierFreqList-r16 AffectedCarrierFreqList-r16 OPTIONAL,
+ affectedCarrierFreqCombList-r16 AffectedCarrierFreqCombList-r16 OPTIONAL,
+ ...
+}
+
+AffectedCarrierFreqList-r16 ::= SEQUENCE (SIZE (1.. maxFreqIDC-r16)) OF AffectedCarrierFreq-r16
+
+AffectedCarrierFreq-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueNR,
+ interferenceDirection-r16 ENUMERATED {nr, other, both, spare}
+}
+
+AffectedCarrierFreqCombList-r16 ::= SEQUENCE (SIZE (1..maxCombIDC-r16)) OF AffectedCarrierFreqComb-r16
+
+AffectedCarrierFreqComb-r16 ::= SEQUENCE {
+ affectedCarrierFreqComb-r16 SEQUENCE (SIZE (2..maxNrofServingCells)) OF ARFCN-ValueNR OPTIONAL,
+ victimSystemType-r16 VictimSystemType-r16
+}
+
+VictimSystemType-r16 ::= SEQUENCE {
+ gps-r16 ENUMERATED {true} OPTIONAL,
+ glonass-r16 ENUMERATED {true} OPTIONAL,
+ bds-r16 ENUMERATED {true} OPTIONAL,
+ galileo-r16 ENUMERATED {true} OPTIONAL,
+ navIC-r16 ENUMERATED {true} OPTIONAL,
+ wlan-r16 ENUMERATED {true} OPTIONAL,
+ bluetooth-r16 ENUMERATED {true} OPTIONAL,
+ ...
+}
+
+DRX-Preference-r16 ::= SEQUENCE {
+ preferredDRX-InactivityTimer-r16 ENUMERATED {
+ ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+ ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+ spare7, spare6, spare5, spare4, spare3, spare2, spare1} OPTIONAL,
+ preferredDRX-LongCycle-r16 ENUMERATED {
+ ms10, ms20, ms32, ms40, ms60, ms64, ms70, ms80, ms128, ms160, ms256, ms320, ms512,
+ ms640, ms1024, ms1280, ms2048, ms2560, ms5120, ms10240, spare12, spare11, spare10,
+ spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+ preferredDRX-ShortCycle-r16 ENUMERATED {
+ ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+ ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+ spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+ preferredDRX-ShortCycleTimer-r16 INTEGER (1..16) OPTIONAL
+}
+
+MaxBW-Preference-r16 ::= SEQUENCE {
+ reducedMaxBW-FR1-r16 ReducedMaxBW-FRx-r16 OPTIONAL,
+ reducedMaxBW-FR2-r16 ReducedMaxBW-FRx-r16 OPTIONAL
+}
+
+MaxCC-Preference-r16 ::= SEQUENCE {
+ reducedMaxCCs-r16 ReducedMaxCCs-r16 OPTIONAL
+}
+
+MaxMIMO-LayerPreference-r16 ::= SEQUENCE {
+ reducedMaxMIMO-LayersFR1-r16 SEQUENCE {
+ reducedMIMO-LayersFR1-DL-r16 INTEGER (1..8),
+ reducedMIMO-LayersFR1-UL-r16 INTEGER (1..4)
+ } OPTIONAL,
+ reducedMaxMIMO-LayersFR2-r16 SEQUENCE {
+ reducedMIMO-LayersFR2-DL-r16 INTEGER (1..8),
+ reducedMIMO-LayersFR2-UL-r16 INTEGER (1..4)
+ } OPTIONAL
+}
+
+MinSchedulingOffsetPreference-r16 ::= SEQUENCE {
+ preferredK0-r16 SEQUENCE {
+ preferredK0-SCS-15kHz-r16 ENUMERATED {sl1, sl2, sl4, sl6} OPTIONAL,
+ preferredK0-SCS-30kHz-r16 ENUMERATED {sl1, sl2, sl4, sl6} OPTIONAL,
+ preferredK0-SCS-60kHz-r16 ENUMERATED {sl2, sl4, sl8, sl12} OPTIONAL,
+ preferredK0-SCS-120kHz-r16 ENUMERATED {sl2, sl4, sl8, sl12} OPTIONAL
+ } OPTIONAL,
+ preferredK2-r16 SEQUENCE {
+ preferredK2-SCS-15kHz-r16 ENUMERATED {sl1, sl2, sl4, sl6} OPTIONAL,
+ preferredK2-SCS-30kHz-r16 ENUMERATED {sl1, sl2, sl4, sl6} OPTIONAL,
+ preferredK2-SCS-60kHz-r16 ENUMERATED {sl2, sl4, sl8, sl12} OPTIONAL,
+ preferredK2-SCS-120kHz-r16 ENUMERATED {sl2, sl4, sl8, sl12} OPTIONAL
+ } OPTIONAL
+}
+
+ReleasePreference-r16 ::= SEQUENCE {
+ preferredRRC-State-r16 ENUMERATED {idle, inactive, connected, outOfConnected}
+}
+
+ReducedMaxBW-FRx-r16 ::= SEQUENCE {
+ reducedBW-DL-r16 ReducedAggregatedBandwidth,
+ reducedBW-UL-r16 ReducedAggregatedBandwidth
+}
+
+ReducedMaxCCs-r16 ::= SEQUENCE {
+ reducedCCsDL-r16 INTEGER (0..31),
+ reducedCCsUL-r16 INTEGER (0..31)
+}
+
+SL-UE-AssistanceInformationNR-r16 ::= SEQUENCE (SIZE (1..maxNrofTrafficPattern-r16)) OF SL-TrafficPatternInfo-r16
+
+SL-TrafficPatternInfo-r16::= SEQUENCE {
+ trafficPeriodicity-r16 ENUMERATED {ms20,ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+ timingOffset-r16 INTEGER (0..10239),
+ messageSize-r16 BIT STRING (SIZE (8)),
+ sl-QoS-FlowIdentity-r16 SL-QoS-FlowIdentity-r16
+}
+
+-- TAG-UEASSISTANCEINFORMATION-STOP
+-- TAG-UECAPABILITYENQUIRY-START
+
+UECapabilityEnquiry ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ ueCapabilityEnquiry UECapabilityEnquiry-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UECapabilityEnquiry-IEs ::= SEQUENCE {
+ ue-CapabilityRAT-RequestList UE-CapabilityRAT-RequestList,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ue-CapabilityEnquiryExt OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs) OPTIONAL
+}
+
+UECapabilityEnquiry-v1560-IEs ::= SEQUENCE {
+ capabilityRequestFilterCommon UE-CapabilityRequestFilterCommon OPTIONAL, -- Need N
+ nonCriticalExtension UECapabilityEnquiry-v1610-IEs OPTIONAL
+}
+
+UECapabilityEnquiry-v1610-IEs ::= SEQUENCE {
+ rrc-SegAllowed-r16 ENUMERATED {enabled} OPTIONAL, -- Need N
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-UECAPABILITYENQUIRY-STOP
+-- TAG-UECAPABILITYINFORMATION-START
+
+UECapabilityInformation ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ ueCapabilityInformation UECapabilityInformation-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UECapabilityInformation-IEs ::= SEQUENCE {
+ ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList OPTIONAL,
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE{} OPTIONAL
+}
+
+-- TAG-UECAPABILITYINFORMATION-STOP
+-- TAG-UEINFORMATIONREQUEST-START
+
+UEInformationRequest-r16 ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ ueInformationRequest-r16 UEInformationRequest-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UEInformationRequest-r16-IEs ::= SEQUENCE {
+ idleModeMeasurementReq-r16 ENUMERATED{true} OPTIONAL, -- Need N
+ logMeasReportReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ connEstFailReportReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ ra-ReportReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ rlf-ReportReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ mobilityHistoryReportReq-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-UEINFORMATIONREQUEST-STOP
+-- TAG-UEINFORMATIONRESPONSE-START
+
+UEInformationResponse-r16 ::= SEQUENCE {
+ rrc-TransactionIdentifier RRC-TransactionIdentifier,
+ criticalExtensions CHOICE {
+ ueInformationResponse-r16 UEInformationResponse-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UEInformationResponse-r16-IEs ::= SEQUENCE {
+ measResultIdleEUTRA-r16 MeasResultIdleEUTRA-r16 OPTIONAL,
+ measResultIdleNR-r16 MeasResultIdleNR-r16 OPTIONAL,
+ logMeasReport-r16 LogMeasReport-r16 OPTIONAL,
+ connEstFailReport-r16 ConnEstFailReport-r16 OPTIONAL,
+ ra-ReportList-r16 RA-ReportList-r16 OPTIONAL,
+ rlf-Report-r16 RLF-Report-r16 OPTIONAL,
+ mobilityHistoryReport-r16 MobilityHistoryReport-r16 OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+LogMeasReport-r16 ::= SEQUENCE {
+ absoluteTimeStamp-r16 AbsoluteTimeInfo-r16,
+ traceReference-r16 TraceReference-r16,
+ traceRecordingSessionRef-r16 OCTET STRING (SIZE (2)),
+ tce-Id-r16 OCTET STRING (SIZE (1)),
+ logMeasInfoList-r16 LogMeasInfoList-r16,
+ logMeasAvailable-r16 ENUMERATED {true} OPTIONAL,
+ logMeasAvailableBT-r16 ENUMERATED {true} OPTIONAL,
+ logMeasAvailableWLAN-r16 ENUMERATED {true} OPTIONAL,
+ ...
+}
+
+LogMeasInfoList-r16 ::= SEQUENCE (SIZE (1..maxLogMeasReport-r16)) OF LogMeasInfo-r16
+
+LogMeasInfo-r16 ::= SEQUENCE {
+ locationInfo-r16 LocationInfo-r16 OPTIONAL,
+ relativeTimeStamp-r16 INTEGER (0..7200),
+ servCellIdentity-r16 CGI-Info-Logging-r16 OPTIONAL,
+ measResultServingCell-r16 MeasResultServingCell-r16 OPTIONAL,
+ measResultNeighCells-r16 SEQUENCE {
+ measResultNeighCellListNR MeasResultListLogging2NR-r16 OPTIONAL,
+ measResultNeighCellListEUTRA MeasResultList2EUTRA-r16 OPTIONAL
+ },
+ anyCellSelectionDetected-r16 ENUMERATED {true} OPTIONAL
+}
+
+ConnEstFailReport-r16 ::= SEQUENCE {
+ measResultFailedCell-r16 MeasResultFailedCell-r16,
+ locationInfo-r16 LocationInfo-r16 OPTIONAL,
+ measResultNeighCells-r16 SEQUENCE {
+ measResultNeighCellListNR MeasResultList2NR-r16 OPTIONAL,
+ measResultNeighCellListEUTRA MeasResultList2EUTRA-r16 OPTIONAL
+ },
+ numberOfConnFail-r16 INTEGER (1..8),
+ perRAInfoList-r16 PerRAInfoList-r16,
+ timeSinceFailure-r16 TimeSinceFailure-r16,
+ ...
+}
+
+MeasResultServingCell-r16 ::= SEQUENCE {
+ resultsSSB-Cell MeasQuantityResults,
+ resultsSSB SEQUENCE{
+ best-ssb-Index SSB-Index,
+ best-ssb-Results MeasQuantityResults,
+ numberOfGoodSSB INTEGER (1..maxNrofSSBs-r16)
+ } OPTIONAL
+}
+
+MeasResultFailedCell-r16 ::= SEQUENCE {
+ cgi-Info CGI-Info-Logging-r16,
+ measResult-r16 SEQUENCE {
+ cellResults-r16 SEQUENCE{
+ resultsSSB-Cell-r16 MeasQuantityResults
+ },
+ rsIndexResults-r16 SEQUENCE{
+ resultsSSB-Indexes-r16 ResultsPerSSB-IndexList
+ }
+ }
+}
+
+RA-ReportList-r16 ::= SEQUENCE (SIZE (1..maxRAReport-r16)) OF RA-Report-r16
+
+RA-Report-r16 ::= SEQUENCE {
+ cellId-r16 CGI-Info-Logging-r16,
+ ra-InformationCommon-r16 RA-InformationCommon-r16,
+ raPurpose-r16 ENUMERATED {accessRelated, beamFailureRecovery, reconfigurationWithSync, ulUnSynchronized,
+ schedulingRequestFailure, noPUCCHResourceAvailable, requestForOtherSI,
+ spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+RA-InformationCommon-r16 ::= SEQUENCE {
+ absoluteFrequencyPointA-r16 ARFCN-ValueNR,
+ locationAndBandwidth-r16 INTEGER (0..37949),
+ subcarrierSpacing-r16 SubcarrierSpacing,
+ msg1-FrequencyStart-r16 INTEGER (0..maxNrofPhysicalResourceBlocks-1) OPTIONAL,
+ msg1-FrequencyStartCFRA-r16 INTEGER (0..maxNrofPhysicalResourceBlocks-1) OPTIONAL,
+ msg1-SubcarrierSpacing-r16 SubcarrierSpacing OPTIONAL,
+ msg1-SubcarrierSpacingCFRA-r16 SubcarrierSpacing OPTIONAL,
+ msg1-FDM-r16 ENUMERATED {one, two, four, eight} OPTIONAL,
+ msg1-FDMCFRA-r16 ENUMERATED {one, two, four, eight} OPTIONAL,
+ perRAInfoList-r16 PerRAInfoList-r16
+}
+
+PerRAInfoList-r16 ::= SEQUENCE (SIZE (1..200)) OF PerRAInfo-r16
+
+PerRAInfo-r16 ::= CHOICE {
+ perRASSBInfoList-r16 PerRASSBInfo-r16,
+ perRACSI-RSInfoList-r16 PerRACSI-RSInfo-r16
+}
+
+PerRASSBInfo-r16 ::= SEQUENCE {
+ ssb-Index-r16 SSB-Index,
+ numberOfPreamblesSentOnSSB-r16 INTEGER (1..200),
+ perRAAttemptInfoList-r16 PerRAAttemptInfoList-r16
+}
+
+PerRACSI-RSInfo-r16 ::= SEQUENCE {
+ csi-RS-Index-r16 CSI-RS-Index,
+ numberOfPreamblesSentOnCSI-RS-r16 INTEGER (1..200)
+}
+
+PerRAAttemptInfoList-r16 ::= SEQUENCE (SIZE (1..200)) OF PerRAAttemptInfo-r16
+
+PerRAAttemptInfo-r16 ::= SEQUENCE {
+ contentionDetected-r16 BOOLEAN OPTIONAL,
+ dlRSRPAboveThreshold-r16 BOOLEAN OPTIONAL,
+ ...
+}
+
+RLF-Report-r16 ::= CHOICE {
+ nr-RLF-Report-r16 SEQUENCE {
+ measResultLastServCell-r16 MeasResultRLFNR-r16,
+ measResultNeighCells-r16 SEQUENCE {
+ measResultListNR-r16 MeasResultList2NR-r16 OPTIONAL,
+ measResultListEUTRA-r16 MeasResultList2EUTRA-r16 OPTIONAL
+ } OPTIONAL,
+ c-RNTI-r16 RNTI-Value,
+ previousPCellId-r16 CHOICE {
+ nrPreviousCell-r16 CGI-Info-Logging-r16,
+ eutraPreviousCell-r16 CGI-InfoEUTRALogging
+ } OPTIONAL,
+ failedPCellId-r16 CHOICE {
+ nrFailedPCellId-r16 CHOICE {
+ cellGlobalId-r16 CGI-Info-Logging-r16,
+ pci-arfcn-r16 SEQUENCE {
+ physCellId-r16 PhysCellId,
+ carrierFreq-r16 ARFCN-ValueNR
+ }
+ },
+ eutraFailedPCellId-r16 CHOICE {
+ cellGlobalId-r16 CGI-InfoEUTRALogging,
+ pci-arfcn-r16 SEQUENCE {
+ physCellId-r16 EUTRA-PhysCellId,
+ carrierFreq-r16 ARFCN-ValueEUTRA
+ }
+ }
+ },
+ reconnectCellId-r16 CHOICE {
+ nrReconnectCellId-r16 CGI-Info-Logging-r16,
+ eutraReconnectCellId-r16 CGI-InfoEUTRALogging
+ } OPTIONAL,
+ timeUntilReconnection-16 TimeUntilReconnection-16 OPTIONAL,
+ reestablishmentCellId-r16 CGI-Info-Logging-r16 OPTIONAL,
+ timeConnFailure-r16 INTEGER (0..1023) OPTIONAL,
+ timeSinceFailure-r16 TimeSinceFailure-r16,
+ connectionFailureType-r16 ENUMERATED {rlf, hof},
+ rlf-Cause-r16 ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+ beamFailureRecoveryFailure, lbtFailure-r16,
+ bh-rlfRecoveryFailure, spare2, spare1},
+ locationInfo-r16 LocationInfo-r16 OPTIONAL,
+ noSuitableCellFound-r16 ENUMERATED {true} OPTIONAL,
+ ra-InformationCommon-r16 RA-InformationCommon-r16 OPTIONAL
+ },
+ eutra-RLF-Report-r16 SEQUENCE {
+ failedPCellId-EUTRA CGI-InfoEUTRALogging,
+ measResult-RLF-Report-EUTRA-r16 OCTET STRING
+ }
+}
+
+MeasResultList2NR-r16 ::= SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2NR-r16
+MeasResultList2EUTRA-r16 ::= SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+MeasResult2NR-r16 ::= SEQUENCE {
+ ssbFrequency-r16 ARFCN-ValueNR OPTIONAL,
+ refFreqCSI-RS-r16 ARFCN-ValueNR OPTIONAL,
+ measResultList-r16 MeasResultListNR
+}
+
+MeasResultListLogging2NR-r16 ::= SEQUENCE(SIZE (1..maxFreq)) OF MeasResultListLoggingNR-r16
+
+MeasResultLogging2NR-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueNR,
+ measResultListLoggingNR-r16 MeasResultListLoggingNR-r16
+}
+
+MeasResultListLoggingNR-r16 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultLoggingNR-r16
+
+MeasResultLoggingNR-r16 ::= SEQUENCE {
+ physCellId-r16 PhysCellId,
+ resultsSSB-Cell-r16 MeasQuantityResults,
+ numberOfGoodSSB-r16 INTEGER (1..maxNrofSSBs-r16) OPTIONAL
+}
+
+MeasResult2EUTRA-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueEUTRA,
+ measResultList-r16 MeasResultListEUTRA
+}
+
+MeasResultRLFNR-r16 ::= SEQUENCE {
+ measResult-r16 SEQUENCE {
+ cellResults-r16 SEQUENCE{
+ resultsSSB-Cell-r16 MeasQuantityResults OPTIONAL,
+ resultsCSI-RS-Cell-r16 MeasQuantityResults OPTIONAL
+ },
+ rsIndexResults-r16 SEQUENCE{
+ resultsSSB-Indexes-r16 ResultsPerSSB-IndexList OPTIONAL,
+ ssbRLMConfigBitmap-r16 BIT STRING (SIZE (64)) OPTIONAL,
+ resultsCSI-RS-Indexes-r16 ResultsPerCSI-RS-IndexList OPTIONAL,
+ csi-rsRLMConfigBitmap-r16 BIT STRING (SIZE (96)) OPTIONAL
+ } OPTIONAL
+ }
+}
+
+TimeSinceFailure-r16 ::= INTEGER (0..172800)
+
+MobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+TimeUntilReconnection-16 ::= INTEGER (0..172800)
+
+-- TAG-UEINFORMATIONRESPONSE-STOP
+-- TAG-ULDEDICATEDMESSAGESEGMENT-START
+
+ULDedicatedMessageSegment-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ ulDedicatedMessageSegment-r16 ULDedicatedMessageSegment-r16-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ULDedicatedMessageSegment-r16-IEs ::= SEQUENCE {
+ segmentNumber-r16 INTEGER (0..15),
+ rrc-MessageSegmentContainer-r16 OCTET STRING,
+ rrc-MessageSegmentType-r16 ENUMERATED {notLastSegment, lastSegment},
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-ULDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-ULINFORMATIONTRANSFER-START
+
+ULInformationTransfer ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ ulInformationTransfer ULInformationTransfer-IEs,
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ULInformationTransfer-IEs ::= SEQUENCE {
+ dedicatedNAS-Message DedicatedNAS-Message OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFER-STOP
+-- TAG-ULINFORMATIONTRANSFERIRAT-START
+
+ULInformationTransferIRAT-r16 ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ ulInformationTransferIRAT-r16 ULInformationTransferIRAT-r16-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ULInformationTransferIRAT-r16-IEs ::= SEQUENCE {
+ ul-DCCH-MessageEUTRA-r16 OCTET STRING OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERIRAT-STOP
+-- TAG-ULINFORMATIONTRANSFERMRDC-START
+
+ULInformationTransferMRDC ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE {
+ ulInformationTransferMRDC ULInformationTransferMRDC-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+ULInformationTransferMRDC-IEs::= SEQUENCE {
+ ul-DCCH-MessageNR OCTET STRING OPTIONAL,
+ ul-DCCH-MessageEUTRA OCTET STRING OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERMRDC-STOP
+-- TAG-SETUPRELEASE-START
+
+SetupRelease { ElementTypeParam } ::= CHOICE {
+ release NULL,
+ setup ElementTypeParam
+}
+
+-- TAG-SETUPRELEASE-STOP
+-- TAG-SIB2-START
+
+SIB2 ::= SEQUENCE {
+ cellReselectionInfoCommon SEQUENCE {
+ nrofSS-BlocksToAverage INTEGER (2..maxNrofSS-BlocksToAverage) OPTIONAL, -- Need S
+ absThreshSS-BlocksConsolidation ThresholdNR OPTIONAL, -- Need S
+ rangeToBestCell RangeToBestCell OPTIONAL, -- Need R
+ q-Hyst ENUMERATED {
+ dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10,
+ dB12, dB14, dB16, dB18, dB20, dB22, dB24},
+ speedStateReselectionPars SEQUENCE {
+ mobilityStateParameters MobilityStateParameters,
+ q-HystSF SEQUENCE {
+ sf-Medium ENUMERATED {dB-6, dB-4, dB-2, dB0},
+ sf-High ENUMERATED {dB-6, dB-4, dB-2, dB0}
+ }
+ } OPTIONAL, -- Need R
+ ...
+ },
+ cellReselectionServingFreqInfo SEQUENCE {
+ s-NonIntraSearchP ReselectionThreshold OPTIONAL, -- Need S
+ s-NonIntraSearchQ ReselectionThresholdQ OPTIONAL, -- Need S
+ threshServingLowP ReselectionThreshold,
+ threshServingLowQ ReselectionThresholdQ OPTIONAL, -- Need R
+ cellReselectionPriority CellReselectionPriority,
+ cellReselectionSubPriority CellReselectionSubPriority OPTIONAL, -- Need R
+ ...
+ },
+ intraFreqCellReselectionInfo SEQUENCE {
+ q-RxLevMin Q-RxLevMin,
+ q-RxLevMinSUL Q-RxLevMin OPTIONAL, -- Need R
+ q-QualMin Q-QualMin OPTIONAL, -- Need S
+ s-IntraSearchP ReselectionThreshold,
+ s-IntraSearchQ ReselectionThresholdQ OPTIONAL, -- Need S
+ t-ReselectionNR T-Reselection,
+ frequencyBandList MultiFrequencyBandListNR-SIB OPTIONAL, -- Need S
+ frequencyBandListSUL MultiFrequencyBandListNR-SIB OPTIONAL, -- Need R
+ p-Max P-Max OPTIONAL, -- Need S
+ smtc SSB-MTC OPTIONAL, -- Need S
+ ss-RSSI-Measurement SS-RSSI-Measurement OPTIONAL, -- Need R
+ ssb-ToMeasure SSB-ToMeasure OPTIONAL, -- Need S
+ deriveSSB-IndexFromCell BOOLEAN,
+ ...,
+ [[
+ t-ReselectionNR-SF SpeedStateScaleFactors OPTIONAL -- Need N
+ ]],
+ [[
+ smtc2-LP-r16 SSB-MTC2-LP-r16 OPTIONAL, -- Need R
+ ssb-PositionQCL-Common-r16 SSB-PositionQCL-Relation-r16 OPTIONAL -- Cond SharedSpectrum
+ ]]
+ },
+ ...,
+ [[
+ relaxedMeasurement-r16 SEQUENCE {
+ lowMobilityEvaluation-r16 SEQUENCE {
+ s-SearchDeltaP-r16 ENUMERATED {
+ dB3, dB6, dB9, dB12, dB15,
+ spare3, spare2, spare1},
+ t-SearchDeltaP-r16 ENUMERATED {
+ s5, s10, s20, s30, s60, s120, s180,
+ s240, s300, spare7, spare6, spare5,
+ spare4, spare3, spare2, spare1}
+ } OPTIONAL, -- Need R
+ cellEdgeEvaluation-r16 SEQUENCE {
+ s-SearchThresholdP-r16 ReselectionThreshold,
+ s-SearchThresholdQ-r16 ReselectionThresholdQ OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ combineRelaxedMeasCondition-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ highPriorityMeasRelax-r16 ENUMERATED {true} OPTIONAL -- Need R
+ } OPTIONAL -- Need R
+ ]]
+}
+
+RangeToBestCell ::= Q-OffsetRange
+
+-- TAG-SIB2-STOP
+-- TAG-SIB3-START
+
+SIB3 ::= SEQUENCE {
+ intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need R
+ intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need R
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...,
+ [[
+ intraFreqNeighCellList-v1610 IntraFreqNeighCellList-v1610 OPTIONAL, -- Need R
+ intraFreqWhiteCellList-r16 IntraFreqWhiteCellList-r16 OPTIONAL, -- Cond SharedSpectrum2
+ intraFreqCAG-CellList-r16 SEQUENCE (SIZE (1..maxPLMN)) OF IntraFreqCAG-CellPerPLMN-r16 OPTIONAL -- Need R
+ ]]
+}
+
+
+IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo
+
+IntraFreqNeighCellList-v1610::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo-v1610
+
+IntraFreqNeighCellInfo ::= SEQUENCE {
+ physCellId PhysCellId,
+ q-OffsetCell Q-OffsetRange,
+ q-RxLevMinOffsetCell INTEGER (1..8) OPTIONAL, -- Need R
+ q-RxLevMinOffsetCellSUL INTEGER (1..8) OPTIONAL, -- Need R
+ q-QualMinOffsetCell INTEGER (1..8) OPTIONAL, -- Need R
+ ...
+}
+
+IntraFreqNeighCellInfo-v1610 ::= SEQUENCE {
+ ssb-PositionQCL-r16 SSB-PositionQCL-Relation-r16 OPTIONAL -- Cond SharedSpectrum2
+}
+
+IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+IntraFreqWhiteCellList-r16 ::= SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+IntraFreqCAG-CellPerPLMN-r16 ::= SEQUENCE {
+ plmn-IdentityIndex-r16 INTEGER (1..maxPLMN),
+ cag-CellList-r16 SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB3-STOP
+-- TAG-SIB4-START
+
+SIB4 ::= SEQUENCE {
+ interFreqCarrierFreqList InterFreqCarrierFreqList,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...,
+ interFreqCarrierFreqList-v1610 InterFreqCarrierFreqList-v1610 OPTIONAL -- Need R
+}
+
+InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo
+
+InterFreqCarrierFreqList-v1610 ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v1610
+
+InterFreqCarrierFreqInfo ::= SEQUENCE {
+ dl-CarrierFreq ARFCN-ValueNR,
+ frequencyBandList MultiFrequencyBandListNR-SIB OPTIONAL, -- Cond Mandatory
+ frequencyBandListSUL MultiFrequencyBandListNR-SIB OPTIONAL, -- Need R
+ nrofSS-BlocksToAverage INTEGER (2..maxNrofSS-BlocksToAverage) OPTIONAL, -- Need S
+ absThreshSS-BlocksConsolidation ThresholdNR OPTIONAL, -- Need S
+ smtc SSB-MTC OPTIONAL, -- Need S
+ ssbSubcarrierSpacing SubcarrierSpacing,
+ ssb-ToMeasure SSB-ToMeasure OPTIONAL, -- Need S
+ deriveSSB-IndexFromCell BOOLEAN,
+ ss-RSSI-Measurement SS-RSSI-Measurement OPTIONAL,
+ q-RxLevMin Q-RxLevMin,
+ q-RxLevMinSUL Q-RxLevMin OPTIONAL, -- Need R
+ q-QualMin Q-QualMin OPTIONAL, -- Need S
+ p-Max P-Max OPTIONAL, -- Need S
+ t-ReselectionNR T-Reselection,
+ t-ReselectionNR-SF SpeedStateScaleFactors OPTIONAL, -- Need S
+ threshX-HighP ReselectionThreshold,
+ threshX-LowP ReselectionThreshold,
+ threshX-Q SEQUENCE {
+ threshX-HighQ ReselectionThresholdQ,
+ threshX-LowQ ReselectionThresholdQ
+ } OPTIONAL, -- Cond RSRQ
+ cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need R
+ cellReselectionSubPriority CellReselectionSubPriority OPTIONAL, -- Need R
+ q-OffsetFreq Q-OffsetRange DEFAULT dB0,
+ interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need R
+ interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need R
+ ...
+}
+
+InterFreqCarrierFreqInfo-v1610 ::= SEQUENCE {
+ interFreqNeighCellList-v1610 InterFreqNeighCellList-v1610 OPTIONAL, -- Need R
+ smtc2-LP-r16 SSB-MTC2-LP-r16 OPTIONAL, -- Need R
+ interFreqWhiteCellList-r16 InterFreqWhiteCellList-r16 OPTIONAL, -- Cond SharedSpectrum2
+ ssb-PositionQCL-Common-r16 SSB-PositionQCL-Relation-r16 OPTIONAL, -- Cond SharedSpectrum
+ interFreqCAG-CellList-r16 SEQUENCE (SIZE (1..maxPLMN)) OF InterFreqCAG-CellList-r16 OPTIONAL -- Need R
+}
+
+InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo
+
+InterFreqNeighCellList-v1610 ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo-v1610
+
+InterFreqNeighCellInfo ::= SEQUENCE {
+ physCellId PhysCellId,
+ q-OffsetCell Q-OffsetRange,
+ q-RxLevMinOffsetCell INTEGER (1..8) OPTIONAL, -- Need R
+ q-RxLevMinOffsetCellSUL INTEGER (1..8) OPTIONAL, -- Need R
+
+ ...
+}
+
+InterFreqNeighCellInfo-v1610 ::= SEQUENCE {
+ ssb-PositionQCL-r16 SSB-PositionQCL-Relation-r16 OPTIONAL -- Cond SharedSpectrum2
+}
+
+InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+InterFreqWhiteCellList-r16 ::= SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+InterFreqCAG-CellList-r16 ::= SEQUENCE {
+ plmn-IdentityIndex-r16 INTEGER (1..maxPLMN),
+ cag-CellList-r16 SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB4-STOP
+-- TAG-SIB5-START
+
+SIB5 ::= SEQUENCE {
+ carrierFreqListEUTRA CarrierFreqListEUTRA OPTIONAL, -- Need R
+ t-ReselectionEUTRA T-Reselection,
+ t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need S
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...,
+ [[
+ carrierFreqListEUTRA-v1610 CarrierFreqListEUTRA-v1610 OPTIONAL -- Need R
+ ]]
+}
+
+CarrierFreqListEUTRA ::= SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA
+
+CarrierFreqListEUTRA-v1610 ::= SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA-v1610
+
+CarrierFreqEUTRA ::= SEQUENCE {
+ carrierFreq ARFCN-ValueEUTRA,
+ eutra-multiBandInfoList EUTRA-MultiBandInfoList OPTIONAL, -- Need R
+ eutra-FreqNeighCellList EUTRA-FreqNeighCellList OPTIONAL, -- Need R
+ eutra-BlackCellList EUTRA-FreqBlackCellList OPTIONAL, -- Need R
+ allowedMeasBandwidth EUTRA-AllowedMeasBandwidth,
+ presenceAntennaPort1 EUTRA-PresenceAntennaPort1,
+ cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need R
+ cellReselectionSubPriority CellReselectionSubPriority OPTIONAL, -- Need R
+ threshX-High ReselectionThreshold,
+ threshX-Low ReselectionThreshold,
+ q-RxLevMin INTEGER (-70..-22),
+ q-QualMin INTEGER (-34..-3),
+ p-MaxEUTRA INTEGER (-30..33),
+ threshX-Q SEQUENCE {
+ threshX-HighQ ReselectionThresholdQ,
+ threshX-LowQ ReselectionThresholdQ
+ } OPTIONAL -- Cond RSRQ
+}
+
+CarrierFreqEUTRA-v1610 ::= SEQUENCE {
+ highSpeedEUTRACarrier-r16 ENUMERATED {true} OPTIONAL -- Need R
+}
+
+EUTRA-FreqBlackCellList ::= SEQUENCE (SIZE (1..maxEUTRA-CellBlack)) OF EUTRA-PhysCellIdRange
+
+EUTRA-FreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellEUTRA)) OF EUTRA-FreqNeighCellInfo
+
+EUTRA-FreqNeighCellInfo ::= SEQUENCE {
+ physCellId EUTRA-PhysCellId,
+ dummy EUTRA-Q-OffsetRange,
+ q-RxLevMinOffsetCell INTEGER (1..8) OPTIONAL, -- Need R
+ q-QualMinOffsetCell INTEGER (1..8) OPTIONAL -- Need R
+}
+
+-- TAG-SIB5-STOP
+-- TAG-SIB6-START
+
+SIB6 ::= SEQUENCE {
+ messageIdentifier BIT STRING (SIZE (16)),
+ serialNumber BIT STRING (SIZE (16)),
+ warningType OCTET STRING (SIZE (2)),
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB6-STOP
+-- TAG-SIB7-START
+
+SIB7 ::= SEQUENCE {
+ messageIdentifier BIT STRING (SIZE (16)),
+ serialNumber BIT STRING (SIZE (16)),
+ warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment},
+ warningMessageSegmentNumber INTEGER (0..63),
+ warningMessageSegment OCTET STRING,
+ dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB7-STOP
+-- TAG-SIB8-START
+
+SIB8 ::= SEQUENCE {
+ messageIdentifier BIT STRING (SIZE (16)),
+ serialNumber BIT STRING (SIZE (16)),
+ warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment},
+ warningMessageSegmentNumber INTEGER (0..63),
+ warningMessageSegment OCTET STRING,
+ dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1
+ warningAreaCoordinatesSegment OCTET STRING OPTIONAL, -- Need R
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB8-STOP
+-- TAG-SIB9-START
+
+SIB9 ::= SEQUENCE {
+ timeInfo SEQUENCE {
+ timeInfoUTC INTEGER (0..549755813887),
+ dayLightSavingTime BIT STRING (SIZE (2)) OPTIONAL, -- Need R
+ leapSeconds INTEGER (-127..128) OPTIONAL, -- Need R
+ localTimeOffset INTEGER (-63..64) OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...,
+ [[
+ referenceTimeInfo-r16 ReferenceTimeInfo-r16 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-SIB9-STOP
+-- TAG-SIB10-START
+
+SIB10-r16 ::= SEQUENCE {
+ hrnn-List-r16 HRNN-List-r16 OPTIONAL, -- Need R
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+HRNN-List-r16 ::= SEQUENCE (SIZE (1..maxNPN-r16)) OF HRNN-r16
+
+HRNN-r16 ::= SEQUENCE {
+ hrnn-r16 OCTET STRING (SIZE(1.. maxHRNN-Len-r16)) OPTIONAL -- Need R
+}
+
+-- TAG-SIB10-STOP
+-- TAG-SIB11-START
+
+SIB11-r16 ::= SEQUENCE {
+ measIdleConfigSIB-r16 MeasIdleConfigSIB-r16 OPTIONAL, -- Need S
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB11-STOP
+-- TAG-SIB12-START
+
+SIB12-r16 ::= SEQUENCE {
+ segmentNumber-r16 INTEGER (0..63),
+ segmentType-r16 ENUMERATED {notLastSegment, lastSegment},
+ segmentContainer-r16 OCTET STRING
+}
+
+SIB12-IEs-r16 ::= SEQUENCE {
+ sl-ConfigCommonNR-r16 SL-ConfigCommonNR-r16,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+SL-ConfigCommonNR-r16 ::= SEQUENCE {
+ sl-FreqInfoList-r16 SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfigCommon-r16 OPTIONAL, -- Need R
+ sl-UE-SelectedConfig-r16 SL-UE-SelectedConfig-r16 OPTIONAL, -- Need R
+ sl-NR-AnchorCarrierFreqList-r16 SL-NR-AnchorCarrierFreqList-r16 OPTIONAL, -- Need R
+ sl-EUTRA-AnchorCarrierFreqList-r16 SL-EUTRA-AnchorCarrierFreqList-r16 OPTIONAL, -- Need R
+ sl-RadioBearerConfigList-r16 SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16 OPTIONAL, -- Need R
+ sl-RLC-BearerConfigList-r16 SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16 OPTIONAL, -- Need R
+ sl-MeasConfigCommon-r16 SL-MeasConfigCommon-r16 OPTIONAL, -- Need R
+ sl-CSI-Acquisition-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ sl-OffsetDFN-r16 INTEGER (1..1000) OPTIONAL, -- Need R
+ t400-r16 ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL, -- Need R
+ sl-MaxNumConsecutiveDTX-r16 ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32} OPTIONAL, -- Need R
+ sl-SSB-PriorityNR-r16 INTEGER (1..8) OPTIONAL -- Need R
+}
+
+SL-NR-AnchorCarrierFreqList-r16 ::= SEQUENCE (SIZE (1..maxFreqSL-NR-r16)) OF ARFCN-ValueNR
+
+SL-EUTRA-AnchorCarrierFreqList-r16 ::= SEQUENCE (SIZE (1..maxFreqSL-EUTRA-r16)) OF ARFCN-ValueEUTRA
+
+-- TAG-SIB12-STOP
+-- TAG-SIB13-START
+
+SIB13-r16 ::= SEQUENCE {
+ sl-V2X-ConfigCommon-r16 OCTET STRING,
+ sl-Bandwidth-r16 OCTET STRING,
+ tdd-Config-r16 OCTET STRING,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB13-STOP
+-- TAG-SIB14-START
+
+SIB14-r16 ::= SEQUENCE {
+ sl-V2X-ConfigCommonExt-r16 OCTET STRING,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIB14-STOP
+-- TAG-POSSYSTEMINFORMATION-R16-IES-START
+
+PosSystemInformation-r16-IEs ::= SEQUENCE {
+ posSIB-TypeAndInfo-r16 SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+ posSib1-1-r16 SIBpos-r16,
+ posSib1-2-r16 SIBpos-r16,
+ posSib1-3-r16 SIBpos-r16,
+ posSib1-4-r16 SIBpos-r16,
+ posSib1-5-r16 SIBpos-r16,
+ posSib1-6-r16 SIBpos-r16,
+ posSib1-7-r16 SIBpos-r16,
+ posSib1-8-r16 SIBpos-r16,
+ posSib2-1-r16 SIBpos-r16,
+ posSib2-2-r16 SIBpos-r16,
+ posSib2-3-r16 SIBpos-r16,
+ posSib2-4-r16 SIBpos-r16,
+ posSib2-5-r16 SIBpos-r16,
+ posSib2-6-r16 SIBpos-r16,
+ posSib2-7-r16 SIBpos-r16,
+ posSib2-8-r16 SIBpos-r16,
+ posSib2-9-r16 SIBpos-r16,
+ posSib2-10-r16 SIBpos-r16,
+ posSib2-11-r16 SIBpos-r16,
+ posSib2-12-r16 SIBpos-r16,
+ posSib2-13-r16 SIBpos-r16,
+ posSib2-14-r16 SIBpos-r16,
+ posSib2-15-r16 SIBpos-r16,
+ posSib2-16-r16 SIBpos-r16,
+ posSib2-17-r16 SIBpos-r16,
+ posSib2-18-r16 SIBpos-r16,
+ posSib2-19-r16 SIBpos-r16,
+ posSib2-20-r16 SIBpos-r16,
+ posSib2-21-r16 SIBpos-r16,
+ posSib2-22-r16 SIBpos-r16,
+ posSib2-23-r16 SIBpos-r16,
+ posSib3-1-r16 SIBpos-r16,
+ posSib4-1-r16 SIBpos-r16,
+ posSib5-1-r16 SIBpos-r16,
+ posSib6-1-r16 SIBpos-r16,
+ posSib6-2-r16 SIBpos-r16,
+ posSib6-3-r16 SIBpos-r16,
+ ...
+ },
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-POSSYSTEMINFORMATION-R16-IES-STOP
+-- TAG-POSSI-SCHEDULINGINFO-START
+
+PosSI-SchedulingInfo-r16 ::= SEQUENCE {
+ posSchedulingInfoList-r16 SEQUENCE (SIZE (1..maxSI-Message)) OF PosSchedulingInfo-r16,
+ posSI-RequestConfig-r16 SI-RequestConfig OPTIONAL, -- Cond MSG-1
+ posSI-RequestConfigSUL-r16 SI-RequestConfig OPTIONAL, -- Cond SUL-MSG-1
+ ...
+}
+
+PosSchedulingInfo-r16 ::= SEQUENCE {
+ offsetToSI-Used-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ posSI-Periodicity-r16 ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+ posSI-BroadcastStatus-r16 ENUMERATED {broadcasting, notBroadcasting},
+ posSIB-MappingInfo-r16 PosSIB-MappingInfo-r16,
+ ...
+}
+
+PosSIB-MappingInfo-r16 ::= SEQUENCE (SIZE (1..maxSIB)) OF PosSIB-Type-r16
+
+PosSIB-Type-r16 ::= SEQUENCE {
+ encrypted-r16 ENUMERATED { true } OPTIONAL, -- Need R
+ gnss-id-r16 GNSS-ID-r16 OPTIONAL, -- Need R
+ sbas-id-r16 SBAS-ID-r16 OPTIONAL, -- Need R
+ posSibType-r16 ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+ posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+ posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+ posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+ posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+ posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+ posSibType5-1,posSibType6-1, posSibType6-2, posSibType6-3,... },
+ areaScope-r16 ENUMERATED {true} OPTIONAL -- Need S
+}
+
+GNSS-ID-r16 ::= SEQUENCE {
+ gnss-id-r16 ENUMERATED{gps, sbas, qzss, galileo, glonass, bds, ...},
+ ...
+}
+
+SBAS-ID-r16 ::= SEQUENCE {
+ sbas-id-r16 ENUMERATED { waas, egnos, msas, gagan, ...},
+ ...
+}
+
+-- TAG-POSSI-SCHEDULINGINFO-STOP
+-- TAG-SIPOS-START
+
+SIBpos-r16 ::= SEQUENCE {
+ assistanceDataSIB-Element-r16 OCTET STRING,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SIPOS-STOP
+-- TAG-ADDITIONALSPECTRUMEMISSION-START
+
+AdditionalSpectrumEmission ::= INTEGER (0..7)
+
+-- TAG-ADDITIONALSPECTRUMEMISSION-STOP
+-- TAG-ALPHA-START
+
+Alpha ::= ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}
+
+-- TAG-ALPHA-STOP
+-- TAG-AMF-IDENTIFIER-START
+
+AMF-Identifier ::= BIT STRING (SIZE (24))
+
+-- TAG-AMF-IDENTIFIER-STOP
+-- TAG-ARFCN-VALUEEUTRA-START
+
+ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN)
+
+-- TAG-ARFCN-VALUEEUTRA-STOP
+-- TAG-ARFCN-VALUENR-START
+
+ARFCN-ValueNR ::= INTEGER (0..maxNARFCN)
+
+-- TAG-ARFCN-VALUENR-STOP
+-- TAG-ARFCN-ValueUTRA-FDD-START
+
+ARFCN-ValueUTRA-FDD-r16 ::= INTEGER (0..16383)
+
+-- TAG-ARFCN-ValueUTRA-FDD-STOP
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-START
+
+AvailabilityCombinationsPerCell-r16 ::= SEQUENCE {
+ availabilityCombinationsPerCellIndex-r16 AvailabilityCombinationsPerCellIndex-r16,
+ iab-DU-CellIdentity-r16 CellIdentity,
+ positionInDCI-AI-r16 INTEGER(0..maxAI-DCI-PayloadSize-r16-1) OPTIONAL, -- Need M
+ availabilityCombinations-r16 SEQUENCE (SIZE (1..maxNrofAvailabilityCombinationsPerSet-r16)) OF AvailabilityCombination-r16,
+ ...
+}
+
+AvailabilityCombinationsPerCellIndex-r16 ::= INTEGER(0..maxNrofDUCells-r16)
+
+AvailabilityCombination-r16 ::= SEQUENCE {
+ availabilityCombinationId-r16 AvailabilityCombinationId-r16,
+ resourceAvailability-r16 SEQUENCE (SIZE (1..maxNrofResourceAvailabilityPerCombination-r16)) OF INTEGER (0..7)
+}
+
+AvailabilityCombinationId-r16 ::= INTEGER (0..maxNrofAvailabilityCombinationsPerSet-r16-1)
+
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-STOP
+-- TAG-AVAILABILITYINDICATOR-START
+
+AvailabilityIndicator-r16 ::= SEQUENCE {
+ ai-RNTI-r16 AI-RNTI-r16,
+ dci-PayloadSizeAI-r16 INTEGER (1..maxAI-DCI-PayloadSize-r16),
+ availableCombToAddModList-r16 SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCell-r16 OPTIONAL, -- Need N
+ availableCombToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCellIndex-r16 OPTIONAL, -- Need N
+ ...
+}
+
+AI-RNTI-r16 ::= RNTI-Value
+
+-- TAG-AVAILABILITYINDICATOR-STOP
+-- TAG-BAPROUTINGID-START
+
+BAP-Routing-ID-r16::= SEQUENCE{
+ bap-Address-r16 BIT STRING (SIZE (10)),
+ bap-PathId-r16 BIT STRING (SIZE (10))
+}
+
+-- TAG-BAPROUTINGID-STOP
+-- TAG-BEAMFAILURERECOVERYCONFIG-START
+
+BeamFailureRecoveryConfig ::= SEQUENCE {
+ rootSequenceIndex-BFR INTEGER (0..137) OPTIONAL, -- Need M
+ rach-ConfigBFR RACH-ConfigGeneric OPTIONAL, -- Need M
+ rsrp-ThresholdSSB RSRP-Range OPTIONAL, -- Need M
+ candidateBeamRSList SEQUENCE (SIZE(1..maxNrofCandidateBeams)) OF PRACH-ResourceDedicatedBFR OPTIONAL, -- Need M
+ ssb-perRACH-Occasion ENUMERATED {oneEighth, oneFourth, oneHalf, one, two,
+ four, eight, sixteen} OPTIONAL, -- Need M
+ ra-ssb-OccasionMaskIndex INTEGER (0..15) OPTIONAL, -- Need M
+ recoverySearchSpaceId SearchSpaceId OPTIONAL, -- Need R
+ ra-Prioritization RA-Prioritization OPTIONAL, -- Need R
+ beamFailureRecoveryTimer ENUMERATED {ms10, ms20, ms40, ms60, ms80, ms100, ms150, ms200} OPTIONAL, -- Need M
+ ...,
+ [[
+ msg1-SubcarrierSpacing SubcarrierSpacing OPTIONAL -- Need M
+ ]],
+ [[
+ ra-PrioritizationTwoStep-r16 RA-Prioritization OPTIONAL, -- Need R
+ candidateBeamRSListExt-v1610 SetupRelease{ CandidateBeamRSListExt-r16 } OPTIONAL -- Need M
+ ]]
+}
+
+PRACH-ResourceDedicatedBFR ::= CHOICE {
+ ssb BFR-SSB-Resource,
+ csi-RS BFR-CSIRS-Resource
+}
+
+BFR-SSB-Resource ::= SEQUENCE {
+ ssb SSB-Index,
+ ra-PreambleIndex INTEGER (0..63),
+ ...
+}
+
+BFR-CSIRS-Resource ::= SEQUENCE {
+ csi-RS NZP-CSI-RS-ResourceId,
+ ra-OccasionList SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1) OPTIONAL, -- Need R
+ ra-PreambleIndex INTEGER (0..63) OPTIONAL, -- Need R
+ ...
+}
+
+CandidateBeamRSListExt-r16::= SEQUENCE (SIZE(1.. maxNrofCandidateBeamsExt-r16)) OF PRACH-ResourceDedicatedBFR
+
+-- TAG-BEAMFAILURERECOVERYCONFIG-STOP
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-START
+
+BeamFailureRecoverySCellConfig-r16 ::= SEQUENCE {
+ rsrp-ThresholdBFR-r16 RSRP-Range OPTIONAL, -- Need M
+ candidateBeamRSSCellList-r16 SEQUENCE (SIZE(1..maxNrofCandidateBeams-r16)) OF CandidateBeamRS-r16 OPTIONAL, -- Need M
+ ...
+}
+
+CandidateBeamRS-r16 ::= SEQUENCE {
+ candidateBeamConfig-r16 CHOICE {
+ ssb-r16 SSB-Index,
+ csi-RS-r16 NZP-CSI-RS-ResourceId
+ },
+ servingCellId ServCellIndex OPTIONAL -- Need R
+}
+
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-STOP
+-- TAG-BETAOFFSETS-START
+
+BetaOffsets ::= SEQUENCE {
+ betaOffsetACK-Index1 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetACK-Index2 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetACK-Index3 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetCSI-Part1-Index1 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetCSI-Part1-Index2 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetCSI-Part2-Index1 INTEGER(0..31) OPTIONAL, -- Need S
+ betaOffsetCSI-Part2-Index2 INTEGER(0..31) OPTIONAL -- Need S
+}
+
+-- TAG-BETAOFFSETS-STOP
+-- TAG-BH-RLCCHANNELCONFIG-START
+
+BH-RLC-ChannelConfig-r16::= SEQUENCE {
+ bh-LogicalChannelIdentity-r16 BH-LogicalChannelIdentity-r16 OPTIONAL, -- Cond LCH-SetupOnly
+ bh-RLC-ChannelID-r16 BH-RLC-ChannelID-r16,
+ reestablishRLC-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ rlc-Config-r16 RLC-Config OPTIONAL, -- Cond LCH-Setup
+ mac-LogicalChannelConfig-r16 LogicalChannelConfig OPTIONAL, -- Cond LCH-Setup
+ ...
+}
+
+-- TAG-BH-RLCCHANNELCONFIG-STOP
+-- TAG-BH-LOGICALCHANNELIDENTITY-START
+
+BH-LogicalChannelIdentity-r16 ::= CHOICE {
+ bh-LogicalChannelIdentity-r16 LogicalChannelIdentity,
+ bh-LogicalChannelIdentityExt-r16 BH-LogicalChannelIdentity-Ext-r16
+}
+
+-- TAG-BH-LOGICALCHANNELIDENTITY-STOP
+-- TAG-BH-LOGICALCHANNELIDENTITY-Ext-START
+
+BH-LogicalChannelIdentity-Ext-r16 ::= INTEGER (33.. maxLC-ID-Iab-r16)
+
+-- TAG-BH-LOGICALCHANNELIDENTITY-Ext-STOP
+-- TAG-BHRLCCHANNELID-START
+
+BH-RLC-ChannelID-r16 ::= BIT STRING (SIZE (16))
+
+-- TAG-BHRLCCHANNELID-STOP
+-- TAG-BSR-CONFIG-START
+
+BSR-Config ::= SEQUENCE {
+ periodicBSR-Timer ENUMERATED { sf1, sf5, sf10, sf16, sf20, sf32, sf40, sf64,
+ sf80, sf128, sf160, sf320, sf640, sf1280, sf2560, infinity },
+ retxBSR-Timer ENUMERATED { sf10, sf20, sf40, sf80, sf160, sf320, sf640, sf1280, sf2560,
+ sf5120, sf10240, spare5, spare4, spare3, spare2, spare1},
+ logicalChannelSR-DelayTimer ENUMERATED { sf20, sf40, sf64, sf128, sf512, sf1024, sf2560, spare1} OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-BSR-CONFIG-STOP
+-- TAG-BWP-START
+
+BWP ::= SEQUENCE {
+ locationAndBandwidth INTEGER (0..37949),
+ subcarrierSpacing SubcarrierSpacing,
+ cyclicPrefix ENUMERATED { extended } OPTIONAL -- Need R
+}
+
+
+-- TAG-BWP-STOP
+-- TAG-BWP-DOWNLINK-START
+
+BWP-Downlink ::= SEQUENCE {
+ bwp-Id BWP-Id,
+ bwp-Common BWP-DownlinkCommon OPTIONAL, -- Cond SetupOtherBWP
+ bwp-Dedicated BWP-DownlinkDedicated OPTIONAL, -- Cond SetupOtherBWP
+ ...
+}
+
+-- TAG-BWP-DOWNLINK-STOP
+-- TAG-BWP-DOWNLINKCOMMON-START
+
+BWP-DownlinkCommon ::= SEQUENCE {
+ genericParameters BWP,
+ pdcch-ConfigCommon SetupRelease { PDCCH-ConfigCommon } OPTIONAL, -- Need M
+ pdsch-ConfigCommon SetupRelease { PDSCH-ConfigCommon } OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-BWP-DOWNLINKCOMMON-STOP
+-- TAG-BWP-DOWNLINKDEDICATED-START
+
+BWP-DownlinkDedicated ::= SEQUENCE {
+ pdcch-Config SetupRelease { PDCCH-Config } OPTIONAL, -- Need M
+ pdsch-Config SetupRelease { PDSCH-Config } OPTIONAL, -- Need M
+ sps-Config SetupRelease { SPS-Config } OPTIONAL, -- Need M
+ radioLinkMonitoringConfig SetupRelease { RadioLinkMonitoringConfig } OPTIONAL, -- Need M
+ ...,
+ [[
+ sps-ConfigToAddModList-r16 SPS-ConfigToAddModList-r16 OPTIONAL, -- Need N
+ sps-ConfigToReleaseList-r16 SPS-ConfigToReleaseList-r16 OPTIONAL, -- Need N
+ sps-ConfigDeactivationStateList-r16 SPS-ConfigDeactivationStateList-r16 OPTIONAL, -- Need R
+ beamFailureRecoverySCellConfig-r16 SetupRelease {BeamFailureRecoverySCellConfig-r16} OPTIONAL, -- Cond SCellOnly
+ sl-PDCCH-Config-r16 SetupRelease { PDCCH-Config } OPTIONAL, -- Need M
+ sl-V2X-PDCCH-Config-r16 SetupRelease { PDCCH-Config } OPTIONAL -- Need M
+ ]]
+}
+
+SPS-ConfigToAddModList-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-Config
+
+SPS-ConfigToReleaseList-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationState-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationStateList-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-DeactivationState)) OF SPS-ConfigDeactivationState-r16
+
+-- TAG-BWP-DOWNLINKDEDICATED-STOP
+-- TAG-BWP-ID-START
+
+BWP-Id ::= INTEGER (0..maxNrofBWPs)
+
+-- TAG-BWP-ID-STOP
+-- TAG-BWP-UPLINK-START
+
+BWP-Uplink ::= SEQUENCE {
+ bwp-Id BWP-Id,
+ bwp-Common BWP-UplinkCommon OPTIONAL, -- Cond SetupOtherBWP
+ bwp-Dedicated BWP-UplinkDedicated OPTIONAL, -- Cond SetupOtherBWP
+ ...
+}
+
+-- TAG-BWP-UPLINK-STOP
+-- TAG-BWP-UPLINKCOMMON-START
+
+BWP-UplinkCommon ::= SEQUENCE {
+ genericParameters BWP,
+ rach-ConfigCommon SetupRelease { RACH-ConfigCommon } OPTIONAL, -- Need M
+ pusch-ConfigCommon SetupRelease { PUSCH-ConfigCommon } OPTIONAL, -- Need M
+ pucch-ConfigCommon SetupRelease { PUCCH-ConfigCommon } OPTIONAL, -- Need M
+ ...,
+ [[
+ rach-ConfigCommonIAB-r16 SetupRelease { RACH-ConfigCommon } OPTIONAL, -- Need M
+ useInterlacePUCCH-PUSCH-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ msgA-ConfigCommon-r16 SetupRelease { MsgA-ConfigCommon-r16 } OPTIONAL -- Cond SpCellOnly2
+ ]]
+}
+
+-- TAG-BWP-UPLINKCOMMON-STOP
+-- TAG-BWP-UPLINKDEDICATED-START
+
+BWP-UplinkDedicated ::= SEQUENCE {
+ pucch-Config SetupRelease { PUCCH-Config } OPTIONAL, -- Need M
+ pusch-Config SetupRelease { PUSCH-Config } OPTIONAL, -- Need M
+ configuredGrantConfig SetupRelease { ConfiguredGrantConfig } OPTIONAL, -- Need M
+ srs-Config SetupRelease { SRS-Config } OPTIONAL, -- Need M
+ beamFailureRecoveryConfig SetupRelease { BeamFailureRecoveryConfig } OPTIONAL, -- Cond SpCellOnly
+ ...,
+ [[
+ sl-PUCCH-Config-r16 SetupRelease { PUCCH-Config } OPTIONAL, -- Need M
+ cp-ExtensionC2-r16 INTEGER (1..28) OPTIONAL, -- Need R
+ cp-ExtensionC3-r16 INTEGER (1..28) OPTIONAL, -- Need R
+ useInterlacePUCCH-PUSCH-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ pucch-ConfigurationList-r16 SetupRelease { PUCCH-ConfigurationList-r16 } OPTIONAL, -- Need M
+ lbt-FailureRecoveryConfig-r16 SetupRelease { LBT-FailureRecoveryConfig-r16 } OPTIONAL, -- Need M
+ configuredGrantConfigToAddModList-r16 ConfiguredGrantConfigToAddModList-r16 OPTIONAL, -- Need N
+ configuredGrantConfigToReleaseList-r16 ConfiguredGrantConfigToReleaseList-r16 OPTIONAL, -- Need N
+ configuredGrantConfigType2DeactivationStateList-r16 ConfiguredGrantConfigType2DeactivationStateList-r16 OPTIONAL -- Need R
+ ]]
+
+}
+
+ConfiguredGrantConfigToAddModList-r16 ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfig
+
+ConfiguredGrantConfigToReleaseList-r16 ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationState-r16 ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationStateList-r16 ::=
+ SEQUENCE (SIZE (1..maxNrofCG-Type2DeactivationState)) OF ConfiguredGrantConfigType2DeactivationState-r16
+
+-- TAG-BWP-UPLINKDEDICATED-STOP
+-- TAG-CELLACCESSRELATEDINFO-START
+
+CellAccessRelatedInfo ::= SEQUENCE {
+ plmn-IdentityList PLMN-IdentityInfoList,
+ cellReservedForOtherUse ENUMERATED {true} OPTIONAL, -- Need R
+ ...,
+ [[
+ cellReservedForFutureUse-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ npn-IdentityInfoList-r16 NPN-IdentityInfoList-r16 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-CELLACCESSRELATEDINFO-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-START
+
+CellAccessRelatedInfo-EUTRA-5GC ::= SEQUENCE {
+ plmn-IdentityList-eutra-5gc PLMN-IdentityList-EUTRA-5GC,
+ trackingAreaCode-eutra-5gc TrackingAreaCode,
+ ranac-5gc RAN-AreaCode OPTIONAL,
+ cellIdentity-eutra-5gc CellIdentity-EUTRA-5GC
+}
+
+PLMN-IdentityList-EUTRA-5GC::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity-EUTRA-5GC
+
+PLMN-Identity-EUTRA-5GC ::= CHOICE {
+ plmn-Identity-EUTRA-5GC PLMN-Identity,
+ plmn-index INTEGER (1..maxPLMN)
+}
+
+CellIdentity-EUTRA-5GC ::= CHOICE {
+ cellIdentity-EUTRA BIT STRING (SIZE (28)),
+ cellId-index INTEGER (1..maxPLMN)
+}
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-START
+
+CellAccessRelatedInfo-EUTRA-EPC ::= SEQUENCE {
+ plmn-IdentityList-eutra-epc PLMN-IdentityList-EUTRA-EPC,
+ trackingAreaCode-eutra-epc BIT STRING (SIZE (16)),
+ cellIdentity-eutra-epc BIT STRING (SIZE (28))
+}
+
+PLMN-IdentityList-EUTRA-EPC::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-STOP
+-- TAG-CELLGROUPCONFIG-START
+
+-- Configuration of one Cell-Group:
+CellGroupConfig ::= SEQUENCE {
+ cellGroupId CellGroupId,
+ rlc-BearerToAddModList SEQUENCE (SIZE(1..maxLC-ID)) OF RLC-BearerConfig OPTIONAL, -- Need N
+ rlc-BearerToReleaseList SEQUENCE (SIZE(1..maxLC-ID)) OF LogicalChannelIdentity OPTIONAL, -- Need N
+ mac-CellGroupConfig MAC-CellGroupConfig OPTIONAL, -- Need M
+ physicalCellGroupConfig PhysicalCellGroupConfig OPTIONAL, -- Need M
+ spCellConfig SpCellConfig OPTIONAL, -- Need M
+ sCellToAddModList SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellConfig OPTIONAL, -- Need N
+ sCellToReleaseList SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellIndex OPTIONAL, -- Need N
+ ...,
+ [[
+ reportUplinkTxDirectCurrent ENUMERATED {true} OPTIONAL -- Cond BWP-Reconfig
+ ]],
+ [[
+ bap-Address-r16 BIT STRING (SIZE (10)) OPTIONAL, -- Need M
+ bh-RLC-ChannelToAddModList-r16 SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelConfig-r16 OPTIONAL, -- Need N
+ bh-RLC-ChannelToReleaseList-r16 SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelID-r16 OPTIONAL, -- Need N
+ f1c-TransferPath-r16 ENUMERATED {lte, nr, both} OPTIONAL, -- Need M
+ simultaneousTCI-UpdateList1-r16 SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex OPTIONAL, -- Need R
+ simultaneousTCI-UpdateList2-r16 SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex OPTIONAL, -- Need R
+ simultaneousSpatial-UpdatedList1-r16 SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex OPTIONAL, -- Need R
+ simultaneousSpatial-UpdatedList2-r16 SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex OPTIONAL, -- Need R
+ uplinkTxSwitchingOption-r16 ENUMERATED {switchedUL, dualUL} OPTIONAL -- Need R
+ ]]
+}
+
+-- Serving cell specific MAC and PHY parameters for a SpCell:
+SpCellConfig ::= SEQUENCE {
+ servCellIndex ServCellIndex OPTIONAL, -- Cond SCG
+ reconfigurationWithSync ReconfigurationWithSync OPTIONAL, -- Cond ReconfWithSync
+ rlf-TimersAndConstants SetupRelease { RLF-TimersAndConstants } OPTIONAL, -- Need M
+ rlmInSyncOutOfSyncThreshold ENUMERATED {n1} OPTIONAL, -- Need S
+ spCellConfigDedicated ServingCellConfig OPTIONAL, -- Need M
+ ...
+}
+
+ReconfigurationWithSync ::= SEQUENCE {
+ spCellConfigCommon ServingCellConfigCommon OPTIONAL, -- Need M
+ newUE-Identity RNTI-Value,
+ t304 ENUMERATED {ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000},
+ rach-ConfigDedicated CHOICE {
+ uplink RACH-ConfigDedicated,
+ supplementaryUplink RACH-ConfigDedicated
+ } OPTIONAL, -- Need N
+ ...,
+ [[
+ smtc SSB-MTC OPTIONAL -- Need S
+ ]],
+ [[
+ daps-UplinkPowerConfig-r16 DAPS-UplinkPowerConfig-r16 OPTIONAL -- Need N
+ ]]
+}
+
+DAPS-UplinkPowerConfig-r16 ::= SEQUENCE {
+ p-DAPS-Source-r16 P-Max,
+ p-DAPS-Target-r16 P-Max,
+ uplinkPowerSharingDAPS-Mode-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+}
+
+SCellConfig ::= SEQUENCE {
+ sCellIndex SCellIndex,
+ sCellConfigCommon ServingCellConfigCommon OPTIONAL, -- Cond SCellAdd
+ sCellConfigDedicated ServingCellConfig OPTIONAL, -- Cond SCellAddMod
+ ...,
+ [[
+ smtc SSB-MTC OPTIONAL -- Need S
+ ]],
+ [[
+ sCellState-r16 ENUMERATED {activated} OPTIONAL, -- Cond SCellAddSync
+ secondaryDRX-GroupConfig-r16 ENUMERATED {true} OPTIONAL -- Cond DRX-Config2
+ ]]}
+
+-- TAG-CELLGROUPCONFIG-STOP
+-- TAG-CELLGROUPID-START
+
+CellGroupId ::= INTEGER (0.. maxSecondaryCellGroups)
+
+-- TAG-CELLGROUPID-STOP
+-- TAG-CELLIDENTITY-START
+
+CellIdentity ::= BIT STRING (SIZE (36))
+
+-- TAG-CELLIDENTITY-STOP
+-- TAG-CELLRESELECTIONPRIORITY-START
+
+CellReselectionPriority ::= INTEGER (0..7)
+
+-- TAG-CELLRESELECTIONPRIORITY-STOP
+-- TAG-CELLRESELECTIONSUBPRIORITY-START
+
+CellReselectionSubPriority ::= ENUMERATED {oDot2, oDot4, oDot6, oDot8}
+
+-- TAG-CELLRESELECTIONSUBPRIORITY-STOP
+-- TAG-CGI-INFOEUTRA-START
+
+CGI-InfoEUTRA ::= SEQUENCE {
+ cgi-info-EPC SEQUENCE {
+ cgi-info-EPC-legacy CellAccessRelatedInfo-EUTRA-EPC,
+ cgi-info-EPC-list SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-EPC OPTIONAL
+ } OPTIONAL,
+ cgi-info-5GC SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-5GC OPTIONAL,
+ freqBandIndicator FreqBandIndicatorEUTRA,
+ multiBandInfoList MultiBandInfoListEUTRA OPTIONAL,
+ freqBandIndicatorPriority ENUMERATED {true} OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRA-STOP
+-- TAG-CGI-INFOEUTRALOGGING-START
+
+CGI-InfoEUTRALogging ::= SEQUENCE {
+ plmn-Identity-eutra-5gc PLMN-Identity OPTIONAL,
+ trackingAreaCode-eutra-5gc TrackingAreaCode OPTIONAL,
+ cellIdentity-eutra-5gc BIT STRING (SIZE (28)) OPTIONAL,
+ plmn-Identity-eutra-epc PLMN-Identity OPTIONAL,
+ trackingAreaCode-eutra-epc BIT STRING (SIZE (16)) OPTIONAL,
+ cellIdentity-eutra-epc BIT STRING (SIZE (28)) OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRALOGGING-STOP
+-- TAG-CGI-INFO-NR-START
+
+CGI-InfoNR ::= SEQUENCE {
+ plmn-IdentityInfoList PLMN-IdentityInfoList OPTIONAL,
+ frequencyBandList MultiFrequencyBandListNR OPTIONAL,
+ noSIB1 SEQUENCE {
+ ssb-SubcarrierOffset INTEGER (0..15),
+ pdcch-ConfigSIB1 PDCCH-ConfigSIB1
+ } OPTIONAL,
+ ...,
+ [[
+ npn-IdentityInfoList-r16 NPN-IdentityInfoList-r16 OPTIONAL
+ ]]
+}
+
+-- TAG-CGI-INFO-NR-STOP
+-- TAG-CGI-INFO-LOGGING-START
+
+CGI-Info-Logging-r16 ::= SEQUENCE {
+ plmn-Identity-r16 PLMN-Identity,
+ cellIdentity-r16 CellIdentity,
+ trackingAreaCode-r16 TrackingAreaCode OPTIONAL
+}
+
+-- TAG-CGI-INFO-LOGGING-STOP
+-- TAG-CLI-RSSI-RANGE-START
+
+CLI-RSSI-Range-r16 ::= INTEGER(0..76)
+
+-- TAG-CLI-RSSI-RANGE-STOP
+-- TAG-CODEBOOKCONFIG-START
+
+CodebookConfig ::= SEQUENCE {
+ codebookType CHOICE {
+ type1 SEQUENCE {
+ subType CHOICE {
+ typeI-SinglePanel SEQUENCE {
+ nrOfAntennaPorts CHOICE {
+ two SEQUENCE {
+ twoTX-CodebookSubsetRestriction BIT STRING (SIZE (6))
+ },
+ moreThanTwo SEQUENCE {
+ n1-n2 CHOICE {
+ two-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (8)),
+ two-two-TypeI-SinglePanel-Restriction BIT STRING (SIZE (64)),
+ four-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (16)),
+ three-two-TypeI-SinglePanel-Restriction BIT STRING (SIZE (96)),
+ six-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (24)),
+ four-two-TypeI-SinglePanel-Restriction BIT STRING (SIZE (128)),
+ eight-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (32)),
+ four-three-TypeI-SinglePanel-Restriction BIT STRING (SIZE (192)),
+ six-two-TypeI-SinglePanel-Restriction BIT STRING (SIZE (192)),
+ twelve-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (48)),
+ four-four-TypeI-SinglePanel-Restriction BIT STRING (SIZE (256)),
+ eight-two-TypeI-SinglePanel-Restriction BIT STRING (SIZE (256)),
+ sixteen-one-TypeI-SinglePanel-Restriction BIT STRING (SIZE (64))
+ },
+ typeI-SinglePanel-codebookSubsetRestriction-i2 BIT STRING (SIZE (16)) OPTIONAL -- Need R
+ }
+ },
+ typeI-SinglePanel-ri-Restriction BIT STRING (SIZE (8))
+ },
+ typeI-MultiPanel SEQUENCE {
+ ng-n1-n2 CHOICE {
+ two-two-one-TypeI-MultiPanel-Restriction BIT STRING (SIZE (8)),
+ two-four-one-TypeI-MultiPanel-Restriction BIT STRING (SIZE (16)),
+ four-two-one-TypeI-MultiPanel-Restriction BIT STRING (SIZE (8)),
+ two-two-two-TypeI-MultiPanel-Restriction BIT STRING (SIZE (64)),
+ two-eight-one-TypeI-MultiPanel-Restriction BIT STRING (SIZE (32)),
+ four-four-one-TypeI-MultiPanel-Restriction BIT STRING (SIZE (16)),
+ two-four-two-TypeI-MultiPanel-Restriction BIT STRING (SIZE (128)),
+ four-two-two-TypeI-MultiPanel-Restriction BIT STRING (SIZE (64))
+ },
+ ri-Restriction BIT STRING (SIZE (4))
+ }
+ },
+ codebookMode INTEGER (1..2)
+
+ },
+ type2 SEQUENCE {
+ subType CHOICE {
+ typeII SEQUENCE {
+ n1-n2-codebookSubsetRestriction CHOICE {
+ two-one BIT STRING (SIZE (16)),
+ two-two BIT STRING (SIZE (43)),
+ four-one BIT STRING (SIZE (32)),
+ three-two BIT STRING (SIZE (59)),
+ six-one BIT STRING (SIZE (48)),
+ four-two BIT STRING (SIZE (75)),
+ eight-one BIT STRING (SIZE (64)),
+ four-three BIT STRING (SIZE (107)),
+ six-two BIT STRING (SIZE (107)),
+ twelve-one BIT STRING (SIZE (96)),
+ four-four BIT STRING (SIZE (139)),
+ eight-two BIT STRING (SIZE (139)),
+ sixteen-one BIT STRING (SIZE (128))
+ },
+ typeII-RI-Restriction BIT STRING (SIZE (2))
+ },
+ typeII-PortSelection SEQUENCE {
+ portSelectionSamplingSize ENUMERATED {n1, n2, n3, n4} OPTIONAL, -- Need R
+ typeII-PortSelectionRI-Restriction BIT STRING (SIZE (2))
+ }
+ },
+ phaseAlphabetSize ENUMERATED {n4, n8},
+ subbandAmplitude BOOLEAN,
+ numberOfBeams ENUMERATED {two, three, four}
+ }
+ }
+}
+
+CodebookConfig-r16 ::= SEQUENCE {
+ codebookType CHOICE {
+ type2 SEQUENCE {
+ subType CHOICE {
+ typeII-r16 SEQUENCE {
+ n1-n2-codebookSubsetRestriction-r16 CHOICE {
+ two-one BIT STRING (SIZE (16)),
+ two-two BIT STRING (SIZE (43)),
+ four-one BIT STRING (SIZE (32)),
+ three-two BIT STRING (SIZE (59)),
+ six-one BIT STRING (SIZE (48)),
+ four-two BIT STRING (SIZE (75)),
+ eight-one BIT STRING (SIZE (64)),
+ four-three BIT STRING (SIZE (107)),
+ six-two BIT STRING (SIZE (107)),
+ twelve-one BIT STRING (SIZE (96)),
+ four-four BIT STRING (SIZE (139)),
+ eight-two BIT STRING (SIZE (139)),
+ sixteen-one BIT STRING (SIZE (128))
+ },
+ typeII-RI-Restriction-r16 BIT STRING (SIZE(4))
+ },
+ typeII-PortSelection-r16 SEQUENCE {
+ portSelectionSamplingSize-r16 ENUMERATED {n1, n2, n3, n4},
+ typeII-PortSelectionRI-Restriction-r16 BIT STRING (SIZE (4))
+ }
+ },
+ numberOfPMI-SubbandsPerCQI-Subband-r16 INTEGER (1..2),
+ paramCombination-r16 INTEGER (1..8)
+ }
+ }
+}
+
+-- TAG-CODEBOOKCONFIG-STOP
+-- TAG-COMMONLOCATIONINFO-START
+
+CommonLocationInfo-r16 ::= SEQUENCE {
+ gnss-TOD-msec-r16 OCTET STRING OPTIONAL,
+ locationTimestamp-r16 OCTET STRING OPTIONAL,
+ locationCoordinate-r16 OCTET STRING OPTIONAL,
+ locationError-r16 OCTET STRING OPTIONAL,
+ locationSource-r16 OCTET STRING OPTIONAL,
+ velocityEstimate-r16 OCTET STRING OPTIONAL
+}
+
+-- TAG-COMMONLOCATIONINFO-STOP
+-- TAG-CONDRECONFIGID-START
+
+CondReconfigId-r16 ::= INTEGER (1.. maxNrofCondCells-r16)
+
+-- TAG-CONDRECONFIGID-STOP
+-- TAG-CONDRECONFIGTOADDMODLIST-START
+
+CondReconfigToAddModList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigToAddMod-r16
+
+CondReconfigToAddMod-r16 ::= SEQUENCE {
+ condReconfigId-r16 CondReconfigId-r16,
+ condExecutionCond-r16 SEQUENCE (SIZE (1..2)) OF MeasId OPTIONAL, -- Cond condReconfigAdd
+ condRRCReconfig-r16 OCTET STRING (CONTAINING RRCReconfiguration) OPTIONAL, -- Cond condReconfigAdd
+ ...
+}
+
+-- TAG-CONDRECONFIGTOADDMODLIST-STOP
+-- TAG-CONDITIONALRECONFIGURATION-START
+
+ConditionalReconfiguration-r16 ::= SEQUENCE {
+ attemptCondReconfig-r16 ENUMERATED {true} OPTIONAL, -- Cond PCell
+ condReconfigToRemoveList-r16 CondReconfigToRemoveList-r16 OPTIONAL, -- Need N
+ condReconfigToAddModList-r16 CondReconfigToAddModList-r16 OPTIONAL, -- Need N
+ ...
+}
+
+CondReconfigToRemoveList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigId-r16
+
+-- TAG-CONDITIONALRECONFIGURATION-STOP
+-- TAG-CONFIGUREDGRANTCONFIG-START
+
+ConfiguredGrantConfig ::= SEQUENCE {
+ frequencyHopping ENUMERATED {intraSlot, interSlot} OPTIONAL, -- Need S
+ cg-DMRS-Configuration DMRS-UplinkConfig,
+ mcs-Table ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ mcs-TableTransformPrecoder ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ uci-OnPUSCH SetupRelease { CG-UCI-OnPUSCH } OPTIONAL, -- Need M
+ resourceAllocation ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch },
+ rbg-Size ENUMERATED {config2} OPTIONAL, -- Need S
+ powerControlLoopToUse ENUMERATED {n0, n1},
+ p0-PUSCH-Alpha P0-PUSCH-AlphaSetId,
+ transformPrecoder ENUMERATED {enabled, disabled} OPTIONAL, -- Need S
+ nrofHARQ-Processes INTEGER(1..16),
+ repK ENUMERATED {n1, n2, n4, n8},
+ repK-RV ENUMERATED {s1-0231, s2-0303, s3-0000} OPTIONAL, -- Need R
+ periodicity ENUMERATED {
+ sym2, sym7, sym1x14, sym2x14, sym4x14, sym5x14, sym8x14, sym10x14, sym16x14, sym20x14,
+ sym32x14, sym40x14, sym64x14, sym80x14, sym128x14, sym160x14, sym256x14, sym320x14, sym512x14,
+ sym640x14, sym1024x14, sym1280x14, sym2560x14, sym5120x14,
+ sym6, sym1x12, sym2x12, sym4x12, sym5x12, sym8x12, sym10x12, sym16x12, sym20x12, sym32x12,
+ sym40x12, sym64x12, sym80x12, sym128x12, sym160x12, sym256x12, sym320x12, sym512x12, sym640x12,
+ sym1280x12, sym2560x12
+ },
+ configuredGrantTimer INTEGER (1..64) OPTIONAL, -- Need R
+ rrc-ConfiguredUplinkGrant SEQUENCE {
+ timeDomainOffset INTEGER (0..5119),
+ timeDomainAllocation INTEGER (0..15),
+ frequencyDomainAllocation BIT STRING (SIZE(18)),
+ antennaPort INTEGER (0..31),
+ dmrs-SeqInitialization INTEGER (0..1) OPTIONAL, -- Need R
+ precodingAndNumberOfLayers INTEGER (0..63),
+ srs-ResourceIndicator INTEGER (0..15) OPTIONAL, -- Need R
+ mcsAndTBS INTEGER (0..31),
+ frequencyHoppingOffset INTEGER (1.. maxNrofPhysicalResourceBlocks-1) OPTIONAL, -- Need R
+ pathlossReferenceIndex INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1),
+ ...,
+ [[
+ pusch-RepTypeIndicator-r16 ENUMERATED {pusch-RepTypeA,pusch-RepTypeB} OPTIONAL, -- Need M
+ frequencyHoppingPUSCH-RepTypeB-r16 ENUMERATED {interRepetition, interSlot} OPTIONAL, -- Cond RepTypeB
+ timeReferenceSFN-r16 ENUMERATED {sfn512} OPTIONAL -- Need S
+ ]]
+ } OPTIONAL, -- Need R
+ ...,
+ [[
+ cg-RetransmissionTimer-r16 INTEGER (1..64) OPTIONAL, -- Need R
+ cg-minDFI-Delay-r16 ENUMERATED
+ {sym7, sym1x14, sym2x14, sym3x14, sym4x14, sym5x14, sym6x14, sym7x14, sym8x14,
+ sym9x14, sym10x14, sym11x14, sym12x14, sym13x14, sym14x14,sym15x14, sym16x14
+ } OPTIONAL, -- Need R
+ cg-nrofPUSCH-InSlot-r16 INTEGER (1..7) OPTIONAL, -- Need R
+ cg-nrofSlots-r16 INTEGER (1..40) OPTIONAL, -- Need R
+ cg-StartingOffsets-r16 CG-StartingOffsets-r16 OPTIONAL, -- Need R
+ cg-UCI-Multiplexing ENUMERATED {enabled} OPTIONAL, -- Need R
+ cg-COT-SharingOffset-r16 INTEGER (1..39) OPTIONAL, -- Need R
+ betaOffsetCG-UCI-r16 INTEGER (0.. 31) OPTIONAL, -- Need R
+ cg-COT-SharingList-r16 SEQUENCE (SIZE (1..1709)) OF CG-COT-Sharing-r16 OPTIONAL, -- Need R
+ harq-ProcID-Offset-r16 INTEGER (0..15) OPTIONAL, -- Need M
+ harq-ProcID-Offset2-r16 INTEGER (0..15) OPTIONAL, -- Need M
+ configuredGrantConfigIndex-r16 ConfiguredGrantConfigIndex-r16 OPTIONAL, -- Cond CG-List
+ configuredGrantConfigIndexMAC-r16 ConfiguredGrantConfigIndexMAC-r16 OPTIONAL, -- Cond CG-List
+ periodicityExt-r16 INTEGER (1..5120) OPTIONAL, -- Need R
+ startingFromRV0-r16 ENUMERATED {on, off} OPTIONAL, -- Need R
+ phy-PriorityIndex-r16 ENUMERATED {p0, p1} OPTIONAL, -- Need R
+ autonomousTx-r16 ENUMERATED {enabled} OPTIONAL -- Cond LCH-BasedPrioritization
+ ]]
+
+}
+
+CG-UCI-OnPUSCH ::= CHOICE {
+ dynamic SEQUENCE (SIZE (1..4)) OF BetaOffsets,
+ semiStatic BetaOffsets
+}
+
+CG-COT-Sharing-r16 ::= CHOICE {
+ noCOT-Sharing-r16 NULL,
+ cot-Sharing-r16 SEQUENCE {
+ duration-r16 INTEGER (1.. 39),
+ offset-r16 INTEGER (1.. 39),
+ channelAccessPriority-r16 INTEGER (1..4)
+ }
+}
+
+CG-StartingOffsets-r16 ::= SEQUENCE {
+ cg-StartingFullBW-InsideCOT-r16 SEQUENCE (SIZE (1..7)) OF INTEGER (0..6) OPTIONAL, -- Need R
+ cg-StartingFullBW-OutsideCOT-r16 SEQUENCE (SIZE (1..7)) OF INTEGER (0..6) OPTIONAL, -- Need R
+ cg-StartingPartialBW-InsideCOT-r16 INTEGER (0..6) OPTIONAL, -- Need R
+ cg-StartingPartialBW-OutsideCOT-r16 INTEGER (0..6) OPTIONAL -- Need R
+}
+
+-- TAG-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-START
+
+ConfiguredGrantConfigIndex-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfig-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-START
+
+ConfiguredGrantConfigIndexMAC-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfigMAC-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-STOP
+-- TAG-CONNESTFAILURECONTROL-START
+
+ConnEstFailureControl ::= SEQUENCE {
+ connEstFailCount ENUMERATED {n1, n2, n3, n4},
+ connEstFailOffsetValidity ENUMERATED {s30, s60, s120, s240, s300, s420, s600, s900},
+ connEstFailOffset INTEGER (0..15) OPTIONAL -- Need S
+}
+
+-- TAG-CONNESTFAILURECONTROL-STOP
+-- TAG-CONTROLRESOURCESET-START
+
+ControlResourceSet ::= SEQUENCE {
+ controlResourceSetId ControlResourceSetId,
+
+ frequencyDomainResources BIT STRING (SIZE (45)),
+ duration INTEGER (1..maxCoReSetDuration),
+ cce-REG-MappingType CHOICE {
+ interleaved SEQUENCE {
+ reg-BundleSize ENUMERATED {n2, n3, n6},
+ interleaverSize ENUMERATED {n2, n3, n6},
+ shiftIndex INTEGER(0..maxNrofPhysicalResourceBlocks-1) OPTIONAL -- Need S
+ },
+ nonInterleaved NULL
+ },
+ precoderGranularity ENUMERATED {sameAsREG-bundle, allContiguousRBs},
+ tci-StatesPDCCH-ToAddList SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+ tci-StatesPDCCH-ToReleaseList SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+ tci-PresentInDCI ENUMERATED {enabled} OPTIONAL, -- Need S
+ pdcch-DMRS-ScramblingID INTEGER (0..65535) OPTIONAL, -- Need S
+ ...,
+ [[
+ rb-Offset-r16 INTEGER (0..5) OPTIONAL, -- Need S
+ tci-PresentForDCI-Format1-2-r16 INTEGER (1..3) OPTIONAL, -- Need S
+ coresetPoolIndex-r16 INTEGER (0..1) OPTIONAL, -- Need S
+ controlResourceSetId-v1610 ControlResourceSetId-v1610 OPTIONAL -- Need S
+ ]]
+}
+
+-- TAG-CONTROLRESOURCESET-STOP
+-- TAG-CONTROLRESOURCESETID-START
+
+ControlResourceSetId ::= INTEGER (0..maxNrofControlResourceSets-1)
+
+ControlResourceSetId-r16 ::= INTEGER (0..maxNrofControlResourceSets-1-r16)
+
+ControlResourceSetId-v1610 ::= INTEGER (maxNrofControlResourceSets..maxNrofControlResourceSets-1-r16)
+
+-- TAG-CONTROLRESOURCESETID-STOP
+-- TAG-CONTROLRESOURCESETZERO-START
+
+ControlResourceSetZero ::= INTEGER (0..15)
+
+-- TAG-CONTROLRESOURCESETZERO-STOP
+-- TAG-CrossCarrierSchedulingConfig-START
+
+CrossCarrierSchedulingConfig ::= SEQUENCE {
+ schedulingCellInfo CHOICE {
+ own SEQUENCE { -- Cross carrier scheduling: scheduling cell
+ cif-Presence BOOLEAN
+ },
+ other SEQUENCE { -- Cross carrier scheduling: scheduled cell
+ schedulingCellId ServCellIndex,
+ cif-InSchedulingCell INTEGER (1..7)
+ }
+ },
+ ...,
+ [[
+ carrierIndicatorSize SEQUENCE {
+ carrierIndicatorSizeForDCI-Format1-2-r16 INTEGER (0..3),
+ carrierIndicatorSizeForDCI-Format0-2-r16 INTEGER (0..3)
+ } OPTIONAL -- Cond CIF-PRESENCE
+ ]]
+}
+
+-- TAG-CrossCarrierSchedulingConfig-STOP
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-START
+
+CSI-AperiodicTriggerStateList ::= SEQUENCE (SIZE (1..maxNrOfCSI-AperiodicTriggers)) OF CSI-AperiodicTriggerState
+
+CSI-AperiodicTriggerState ::= SEQUENCE {
+ associatedReportConfigInfoList SEQUENCE (SIZE(1..maxNrofReportConfigPerAperiodicTrigger)) OF CSI-AssociatedReportConfigInfo,
+ ...
+}
+
+CSI-AssociatedReportConfigInfo ::= SEQUENCE {
+ reportConfigId CSI-ReportConfigId,
+ resourcesForChannel CHOICE {
+ nzp-CSI-RS SEQUENCE {
+ resourceSet INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig),
+ qcl-info SEQUENCE (SIZE(1..maxNrofAP-CSI-RS-ResourcesPerSet)) OF TCI-StateId
+ OPTIONAL -- Cond Aperiodic
+ },
+ csi-SSB-ResourceSet INTEGER (1..maxNrofCSI-SSB-ResourceSetsPerConfig)
+ },
+ csi-IM-ResourcesForInterference INTEGER(1..maxNrofCSI-IM-ResourceSetsPerConfig)
+ OPTIONAL, -- Cond CSI-IM-ForInterference
+ nzp-CSI-RS-ResourcesForInterference INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)
+ OPTIONAL, -- Cond NZP-CSI-RS-ForInterference
+ ...
+}
+
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-STOP
+-- TAG-CSI-FREQUENCYOCCUPATION-START
+
+CSI-FrequencyOccupation ::= SEQUENCE {
+ startingRB INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+ nrofRBs INTEGER (24..maxNrofPhysicalResourceBlocksPlus1),
+ ...
+}
+
+-- TAG-CSI-FREQUENCYOCCUPATION-STOP
+-- TAG-CSI-IM-RESOURCE-START
+
+CSI-IM-Resource ::= SEQUENCE {
+ csi-IM-ResourceId CSI-IM-ResourceId,
+ csi-IM-ResourceElementPattern CHOICE {
+ pattern0 SEQUENCE {
+ subcarrierLocation-p0 ENUMERATED { s0, s2, s4, s6, s8, s10 },
+ symbolLocation-p0 INTEGER (0..12)
+ },
+ pattern1 SEQUENCE {
+ subcarrierLocation-p1 ENUMERATED { s0, s4, s8 },
+ symbolLocation-p1 INTEGER (0..13)
+ }
+ } OPTIONAL, -- Need M
+ freqBand CSI-FrequencyOccupation OPTIONAL, -- Need M
+ periodicityAndOffset CSI-ResourcePeriodicityAndOffset OPTIONAL, -- Cond PeriodicOrSemiPersistent
+ ...
+}
+
+-- TAG-CSI-IM-RESOURCE-STOP
+-- TAG-CSI-IM-RESOURCEID-START
+
+CSI-IM-ResourceId ::= INTEGER (0..maxNrofCSI-IM-Resources-1)
+
+-- TAG-CSI-IM-RESOURCEID-STOP
+-- TAG-CSI-IM-RESOURCESET-START
+
+CSI-IM-ResourceSet ::= SEQUENCE {
+ csi-IM-ResourceSetId CSI-IM-ResourceSetId,
+ csi-IM-Resources SEQUENCE (SIZE(1..maxNrofCSI-IM-ResourcesPerSet)) OF CSI-IM-ResourceId,
+ ...
+}
+-- TAG-CSI-IM-RESOURCESET-STOP
+-- TAG-CSI-IM-RESOURCESETID-START
+
+CSI-IM-ResourceSetId ::= INTEGER (0..maxNrofCSI-IM-ResourceSets-1)
+
+-- TAG-CSI-IM-RESOURCESETID-STOP
+-- TAG-CSI-MEASCONFIG-START
+
+CSI-MeasConfig ::= SEQUENCE {
+ nzp-CSI-RS-ResourceToAddModList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-Resource OPTIONAL, -- Need N
+ nzp-CSI-RS-ResourceToReleaseList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-ResourceId OPTIONAL, -- Need N
+ nzp-CSI-RS-ResourceSetToAddModList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSet
+ OPTIONAL, -- Need N
+ nzp-CSI-RS-ResourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSetId
+ OPTIONAL, -- Need N
+ csi-IM-ResourceToAddModList SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-Resource OPTIONAL, -- Need N
+ csi-IM-ResourceToReleaseList SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-ResourceId OPTIONAL, -- Need N
+ csi-IM-ResourceSetToAddModList SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSet OPTIONAL, -- Need N
+ csi-IM-ResourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSetId OPTIONAL, -- Need N
+ csi-SSB-ResourceSetToAddModList SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSet OPTIONAL, -- Need N
+ csi-SSB-ResourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSetId OPTIONAL, -- Need N
+ csi-ResourceConfigToAddModList SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfig
+ OPTIONAL, -- Need N
+ csi-ResourceConfigToReleaseList SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfigId
+ OPTIONAL, -- Need N
+ csi-ReportConfigToAddModList SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfig OPTIONAL, -- Need N
+ csi-ReportConfigToReleaseList SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfigId
+ OPTIONAL, -- Need N
+ reportTriggerSize INTEGER (0..6) OPTIONAL, -- Need M
+ aperiodicTriggerStateList SetupRelease { CSI-AperiodicTriggerStateList } OPTIONAL, -- Need M
+ semiPersistentOnPUSCH-TriggerStateList SetupRelease { CSI-SemiPersistentOnPUSCH-TriggerStateList } OPTIONAL, -- Need M
+ ...,
+ [[
+ reportTriggerSizeForDCI-Format0-2-r16 INTEGER (0..6) OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-CSI-MEASCONFIG-STOP
+-- TAG-CSI-REPORTCONFIG-START
+
+CSI-ReportConfig ::= SEQUENCE {
+ reportConfigId CSI-ReportConfigId,
+ carrier ServCellIndex OPTIONAL, -- Need S
+ resourcesForChannelMeasurement CSI-ResourceConfigId,
+ csi-IM-ResourcesForInterference CSI-ResourceConfigId OPTIONAL, -- Need R
+ nzp-CSI-RS-ResourcesForInterference CSI-ResourceConfigId OPTIONAL, -- Need R
+ reportConfigType CHOICE {
+ periodic SEQUENCE {
+ reportSlotConfig CSI-ReportPeriodicityAndOffset,
+ pucch-CSI-ResourceList SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+ },
+ semiPersistentOnPUCCH SEQUENCE {
+ reportSlotConfig CSI-ReportPeriodicityAndOffset,
+ pucch-CSI-ResourceList SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+ },
+ semiPersistentOnPUSCH SEQUENCE {
+ reportSlotConfig ENUMERATED {sl5, sl10, sl20, sl40, sl80, sl160, sl320},
+ reportSlotOffsetList SEQUENCE (SIZE (1.. maxNrofUL-Allocations)) OF INTEGER(0..32),
+ p0alpha P0-PUSCH-AlphaSetId
+ },
+ aperiodic SEQUENCE {
+ reportSlotOffsetList SEQUENCE (SIZE (1..maxNrofUL-Allocations)) OF INTEGER(0..32)
+ }
+ },
+ reportQuantity CHOICE {
+ none NULL,
+ cri-RI-PMI-CQI NULL,
+ cri-RI-i1 NULL,
+ cri-RI-i1-CQI SEQUENCE {
+ pdsch-BundleSizeForCSI ENUMERATED {n2, n4} OPTIONAL -- Need S
+ },
+ cri-RI-CQI NULL,
+ cri-RSRP NULL,
+ ssb-Index-RSRP NULL,
+ cri-RI-LI-PMI-CQI NULL
+ },
+ reportFreqConfiguration SEQUENCE {
+ cqi-FormatIndicator ENUMERATED { widebandCQI, subbandCQI } OPTIONAL, -- Need R
+ pmi-FormatIndicator ENUMERATED { widebandPMI, subbandPMI } OPTIONAL, -- Need R
+ csi-ReportingBand CHOICE {
+ subbands3 BIT STRING(SIZE(3)),
+ subbands4 BIT STRING(SIZE(4)),
+ subbands5 BIT STRING(SIZE(5)),
+ subbands6 BIT STRING(SIZE(6)),
+ subbands7 BIT STRING(SIZE(7)),
+ subbands8 BIT STRING(SIZE(8)),
+ subbands9 BIT STRING(SIZE(9)),
+ subbands10 BIT STRING(SIZE(10)),
+ subbands11 BIT STRING(SIZE(11)),
+ subbands12 BIT STRING(SIZE(12)),
+ subbands13 BIT STRING(SIZE(13)),
+ subbands14 BIT STRING(SIZE(14)),
+ subbands15 BIT STRING(SIZE(15)),
+ subbands16 BIT STRING(SIZE(16)),
+ subbands17 BIT STRING(SIZE(17)),
+ subbands18 BIT STRING(SIZE(18)),
+ ...,
+ subbands19-v1530 BIT STRING(SIZE(19))
+ } OPTIONAL -- Need S
+
+ } OPTIONAL, -- Need R
+ timeRestrictionForChannelMeasurements ENUMERATED {configured, notConfigured},
+ timeRestrictionForInterferenceMeasurements ENUMERATED {configured, notConfigured},
+ codebookConfig CodebookConfig OPTIONAL, -- Need R
+ dummy ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ groupBasedBeamReporting CHOICE {
+ enabled NULL,
+ disabled SEQUENCE {
+ nrofReportedRS ENUMERATED {n1, n2, n3, n4} OPTIONAL -- Need S
+ }
+ },
+ cqi-Table ENUMERATED {table1, table2, table3, spare1} OPTIONAL, -- Need R
+ subbandSize ENUMERATED {value1, value2},
+ non-PMI-PortIndication SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerConfig)) OF PortIndexFor8Ranks OPTIONAL, -- Need R
+ ...,
+ [[
+ semiPersistentOnPUSCH-v1530 SEQUENCE {
+ reportSlotConfig-v1530 ENUMERATED {sl4, sl8, sl16}
+ } OPTIONAL -- Need R
+ ]],
+ [[
+ semiPersistentOnPUSCH-v1610 SEQUENCE {
+ reportSlotOffsetListForDCI-Format0-2-r16 SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)
+ OPTIONAL, -- Need R
+ reportSlotOffsetListForDCI-Format0-1-r16 SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)
+ OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ aperiodic-v1610 SEQUENCE {
+ reportSlotOffsetListForDCI-Format0-2-r16 SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)
+ OPTIONAL, -- Need R
+ reportSlotOffsetListForDCI-Format0-1-r16 SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)
+ OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ reportQuantity-r16 CHOICE {
+ cri-SINR-r16 NULL,
+ ssb-Index-SINR-r16 NULL
+ } OPTIONAL, -- Need R
+ codebookConfig-r16 CodebookConfig-r16 OPTIONAL -- Need R
+ ]]
+}
+
+CSI-ReportPeriodicityAndOffset ::= CHOICE {
+ slots4 INTEGER(0..3),
+ slots5 INTEGER(0..4),
+ slots8 INTEGER(0..7),
+ slots10 INTEGER(0..9),
+ slots16 INTEGER(0..15),
+ slots20 INTEGER(0..19),
+ slots40 INTEGER(0..39),
+ slots80 INTEGER(0..79),
+ slots160 INTEGER(0..159),
+ slots320 INTEGER(0..319)
+}
+
+PUCCH-CSI-Resource ::= SEQUENCE {
+ uplinkBandwidthPartId BWP-Id,
+ pucch-Resource PUCCH-ResourceId
+}
+
+PortIndexFor8Ranks ::= CHOICE {
+ portIndex8 SEQUENCE{
+ rank1-8 PortIndex8 OPTIONAL, -- Need R
+ rank2-8 SEQUENCE(SIZE(2)) OF PortIndex8 OPTIONAL, -- Need R
+ rank3-8 SEQUENCE(SIZE(3)) OF PortIndex8 OPTIONAL, -- Need R
+ rank4-8 SEQUENCE(SIZE(4)) OF PortIndex8 OPTIONAL, -- Need R
+ rank5-8 SEQUENCE(SIZE(5)) OF PortIndex8 OPTIONAL, -- Need R
+ rank6-8 SEQUENCE(SIZE(6)) OF PortIndex8 OPTIONAL, -- Need R
+ rank7-8 SEQUENCE(SIZE(7)) OF PortIndex8 OPTIONAL, -- Need R
+ rank8-8 SEQUENCE(SIZE(8)) OF PortIndex8 OPTIONAL -- Need R
+ },
+ portIndex4 SEQUENCE{
+ rank1-4 PortIndex4 OPTIONAL, -- Need R
+ rank2-4 SEQUENCE(SIZE(2)) OF PortIndex4 OPTIONAL, -- Need R
+ rank3-4 SEQUENCE(SIZE(3)) OF PortIndex4 OPTIONAL, -- Need R
+ rank4-4 SEQUENCE(SIZE(4)) OF PortIndex4 OPTIONAL -- Need R
+ },
+ portIndex2 SEQUENCE{
+ rank1-2 PortIndex2 OPTIONAL, -- Need R
+ rank2-2 SEQUENCE(SIZE(2)) OF PortIndex2 OPTIONAL -- Need R
+ },
+ portIndex1 NULL
+}
+
+PortIndex8::= INTEGER (0..7)
+PortIndex4::= INTEGER (0..3)
+PortIndex2::= INTEGER (0..1)
+
+-- TAG-CSI-REPORTCONFIG-STOP
+-- TAG-CSI-REPORTCONFIGID-START
+
+CSI-ReportConfigId ::= INTEGER (0..maxNrofCSI-ReportConfigurations-1)
+
+-- TAG-CSI-REPORTCONFIGID-STOP
+-- TAG-CSI-RESOURCECONFIG-START
+
+CSI-ResourceConfig ::= SEQUENCE {
+ csi-ResourceConfigId CSI-ResourceConfigId,
+ csi-RS-ResourceSetList CHOICE {
+ nzp-CSI-RS-SSB SEQUENCE {
+ nzp-CSI-RS-ResourceSetList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)) OF NZP-CSI-RS-ResourceSetId OPTIONAL, -- Need R
+ csi-SSB-ResourceSetList SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSetsPerConfig)) OF CSI-SSB-ResourceSetId OPTIONAL -- Need R
+ },
+ csi-IM-ResourceSetList SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSetsPerConfig)) OF CSI-IM-ResourceSetId
+ },
+
+ bwp-Id BWP-Id,
+ resourceType ENUMERATED { aperiodic, semiPersistent, periodic },
+ ...
+}
+
+-- TAG-CSI-RESOURCECONFIG-STOP
+-- TAG-CSI-RESOURCECONFIGID-START
+
+CSI-ResourceConfigId ::= INTEGER (0..maxNrofCSI-ResourceConfigurations-1)
+
+-- TAG-CSI-RESOURCECONFIGID-STOP
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-START
+
+CSI-ResourcePeriodicityAndOffset ::= CHOICE {
+ slots4 INTEGER (0..3),
+ slots5 INTEGER (0..4),
+ slots8 INTEGER (0..7),
+ slots10 INTEGER (0..9),
+ slots16 INTEGER (0..15),
+ slots20 INTEGER (0..19),
+ slots32 INTEGER (0..31),
+ slots40 INTEGER (0..39),
+ slots64 INTEGER (0..63),
+ slots80 INTEGER (0..79),
+ slots160 INTEGER (0..159),
+ slots320 INTEGER (0..319),
+ slots640 INTEGER (0..639)
+}
+
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-STOP
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-START
+
+CSI-RS-ResourceConfigMobility ::= SEQUENCE {
+ subcarrierSpacing SubcarrierSpacing,
+ csi-RS-CellList-Mobility SEQUENCE (SIZE (1..maxNrofCSI-RS-CellsRRM)) OF CSI-RS-CellMobility,
+ ...,
+ [[
+ refServCellIndex ServCellIndex OPTIONAL -- Need S
+ ]]
+
+
+}
+
+CSI-RS-CellMobility ::= SEQUENCE {
+ cellId PhysCellId,
+ csi-rs-MeasurementBW SEQUENCE {
+ nrofPRBs ENUMERATED { size24, size48, size96, size192, size264},
+ startPRB INTEGER(0..2169)
+ },
+ density ENUMERATED {d1,d3} OPTIONAL, -- Need R
+ csi-rs-ResourceList-Mobility SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesRRM)) OF CSI-RS-Resource-Mobility
+}
+
+CSI-RS-Resource-Mobility ::= SEQUENCE {
+ csi-RS-Index CSI-RS-Index,
+ slotConfig CHOICE {
+ ms4 INTEGER (0..31),
+ ms5 INTEGER (0..39),
+ ms10 INTEGER (0..79),
+ ms20 INTEGER (0..159),
+ ms40 INTEGER (0..319)
+ },
+ associatedSSB SEQUENCE {
+ ssb-Index SSB-Index,
+ isQuasiColocated BOOLEAN
+ } OPTIONAL, -- Need R
+ frequencyDomainAllocation CHOICE {
+ row1 BIT STRING (SIZE (4)),
+ row2 BIT STRING (SIZE (12))
+ },
+ firstOFDMSymbolInTimeDomain INTEGER (0..13),
+ sequenceGenerationConfig INTEGER (0..1023),
+ ...
+}
+
+CSI-RS-Index ::= INTEGER (0..maxNrofCSI-RS-ResourcesRRM-1)
+
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-STOP
+-- TAG-CSI-RS-RESOURCEMAPPING-START
+
+CSI-RS-ResourceMapping ::= SEQUENCE {
+ frequencyDomainAllocation CHOICE {
+ row1 BIT STRING (SIZE (4)),
+ row2 BIT STRING (SIZE (12)),
+ row4 BIT STRING (SIZE (3)),
+ other BIT STRING (SIZE (6))
+ },
+ nrofPorts ENUMERATED {p1,p2,p4,p8,p12,p16,p24,p32},
+ firstOFDMSymbolInTimeDomain INTEGER (0..13),
+ firstOFDMSymbolInTimeDomain2 INTEGER (2..12) OPTIONAL, -- Need R
+ cdm-Type ENUMERATED {noCDM, fd-CDM2, cdm4-FD2-TD2, cdm8-FD2-TD4},
+ density CHOICE {
+ dot5 ENUMERATED {evenPRBs, oddPRBs},
+ one NULL,
+ three NULL,
+ spare NULL
+ },
+ freqBand CSI-FrequencyOccupation,
+ ...
+}
+
+-- TAG-CSI-RS-RESOURCEMAPPING-STOP
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-START
+
+CSI-SemiPersistentOnPUSCH-TriggerStateList ::= SEQUENCE(SIZE (1..maxNrOfSemiPersistentPUSCH-Triggers)) OF CSI-SemiPersistentOnPUSCH-TriggerState
+
+CSI-SemiPersistentOnPUSCH-TriggerState ::= SEQUENCE {
+ associatedReportConfigInfo CSI-ReportConfigId,
+ ...
+}
+
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-STOP
+-- TAG-CSI-SSB-RESOURCESET-START
+
+CSI-SSB-ResourceSet ::= SEQUENCE {
+ csi-SSB-ResourceSetId CSI-SSB-ResourceSetId,
+ csi-SSB-ResourceList SEQUENCE (SIZE(1..maxNrofCSI-SSB-ResourcePerSet)) OF SSB-Index,
+ ...
+}
+
+-- TAG-CSI-SSB-RESOURCESET-STOP
+-- TAG-CSI-SSB-RESOURCESETID-START
+
+CSI-SSB-ResourceSetId ::= INTEGER (0..maxNrofCSI-SSB-ResourceSets-1)
+
+-- TAG-CSI-SSB-RESOURCESETID-STOP
+-- TAG-DEDICATED-NAS-MESSAGE-START
+
+DedicatedNAS-Message ::= OCTET STRING
+
+-- TAG-DEDICATED-NAS-MESSAGE-STOP
+-- TAG-DMRS-DOWNLINKCONFIG-START
+
+DMRS-DownlinkConfig ::= SEQUENCE {
+ dmrs-Type ENUMERATED {type2} OPTIONAL, -- Need S
+ dmrs-AdditionalPosition ENUMERATED {pos0, pos1, pos3} OPTIONAL, -- Need S
+ maxLength ENUMERATED {len2} OPTIONAL, -- Need S
+ scramblingID0 INTEGER (0..65535) OPTIONAL, -- Need S
+ scramblingID1 INTEGER (0..65535) OPTIONAL, -- Need S
+ phaseTrackingRS SetupRelease { PTRS-DownlinkConfig } OPTIONAL, -- Need M
+ ...,
+ [[
+ dmrs-Downlink-r16 ENUMERATED {enabled} OPTIONAL -- Need R
+ ]]
+
+}
+
+-- TAG-DMRS-DOWNLINKCONFIG-STOP
+-- TAG-DMRS-UPLINKCONFIG-START
+
+DMRS-UplinkConfig ::= SEQUENCE {
+ dmrs-Type ENUMERATED {type2} OPTIONAL, -- Need S
+ dmrs-AdditionalPosition ENUMERATED {pos0, pos1, pos3} OPTIONAL, -- Need S
+ phaseTrackingRS SetupRelease { PTRS-UplinkConfig } OPTIONAL, -- Need M
+ maxLength ENUMERATED {len2} OPTIONAL, -- Need S
+ transformPrecodingDisabled SEQUENCE {
+ scramblingID0 INTEGER (0..65535) OPTIONAL, -- Need S
+ scramblingID1 INTEGER (0..65535) OPTIONAL, -- Need S
+ ...,
+ [[
+ dmrs-Uplink-r16 ENUMERATED {enabled} OPTIONAL -- Need R
+ ]]
+ } OPTIONAL, -- Need R
+ transformPrecodingEnabled SEQUENCE {
+ nPUSCH-Identity INTEGER(0..1007) OPTIONAL, -- Need S
+ sequenceGroupHopping ENUMERATED {disabled} OPTIONAL, -- Need S
+ sequenceHopping ENUMERATED {enabled} OPTIONAL, -- Need S
+ ...,
+ [[
+ dmrs-UplinkTransformPrecoding-r16 SetupRelease {DMRS-UplinkTransformPrecoding-r16} OPTIONAL -- Need M
+ ]]
+ } OPTIONAL, -- Need R
+ ...
+}
+
+DMRS-UplinkTransformPrecoding-r16 ::= SEQUENCE {
+ pi2BPSK-ScramblingID0 INTEGER(0..65535) OPTIONAL, -- Need S
+ pi2BPSK-ScramblingID1 INTEGER(0..65535) OPTIONAL -- Need S
+}
+
+-- TAG-DMRS-UPLINKCONFIG-STOP
+-- TAG-DOWNLINKCONFIGCOMMON-START
+
+DownlinkConfigCommon ::= SEQUENCE {
+ frequencyInfoDL FrequencyInfoDL OPTIONAL, -- Cond InterFreqHOAndServCellAdd
+ initialDownlinkBWP BWP-DownlinkCommon OPTIONAL, -- Cond ServCellAdd
+ ...
+}
+
+-- TAG-DOWNLINKCONFIGCOMMON-STOP
+-- TAG-DOWNLINKCONFIGCOMMONSIB-START
+
+DownlinkConfigCommonSIB ::= SEQUENCE {
+ frequencyInfoDL FrequencyInfoDL-SIB,
+ initialDownlinkBWP BWP-DownlinkCommon,
+ bcch-Config BCCH-Config,
+ pcch-Config PCCH-Config,
+ ...
+}
+
+
+BCCH-Config ::= SEQUENCE {
+ modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16},
+ ...
+}
+
+
+PCCH-Config ::= SEQUENCE {
+ defaultPagingCycle PagingCycle,
+ nAndPagingFrameOffset CHOICE {
+ oneT NULL,
+ halfT INTEGER (0..1),
+ quarterT INTEGER (0..3),
+ oneEighthT INTEGER (0..7),
+ oneSixteenthT INTEGER (0..15)
+ },
+ ns ENUMERATED {four, two, one},
+ firstPDCCH-MonitoringOccasionOfPO CHOICE {
+ sCS15KHZoneT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+ sCS30KHZoneT-SCS15KHZhalfT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+ sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+ sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+ sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+ sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+ sCS120KHZoneEighthT-SCS60KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+ sCS120KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+ } OPTIONAL, -- Need R
+ ...,
+ [[
+ nrofPDCCH-MonitoringOccasionPerSSB-InPO-r16 INTEGER (2..4) OPTIONAL -- Cond SharedSpectrum2
+ ]]
+}
+
+-- TAG-DOWNLINKCONFIGCOMMONSIB-STOP
+-- TAG-DOWNLINKPREEMPTION-START
+
+DownlinkPreemption ::= SEQUENCE {
+ int-RNTI RNTI-Value,
+ timeFrequencySet ENUMERATED {set0, set1},
+ dci-PayloadSize INTEGER (0..maxINT-DCI-PayloadSize),
+ int-ConfigurationPerServingCell SEQUENCE (SIZE (1..maxNrofServingCells)) OF INT-ConfigurationPerServingCell,
+ ...
+}
+
+INT-ConfigurationPerServingCell ::= SEQUENCE {
+ servingCellId ServCellIndex,
+ positionInDCI INTEGER (0..maxINT-DCI-PayloadSize-1)
+}
+
+-- TAG-DOWNLINKPREEMPTION-STOP
+-- TAG-DRB-IDENTITY-START
+
+DRB-Identity ::= INTEGER (1..32)
+
+-- TAG-DRB-IDENTITY-STOP
+-- TAG-DRX-CONFIG-START
+
+DRX-Config ::= SEQUENCE {
+ drx-onDurationTimer CHOICE {
+ subMilliSeconds INTEGER (1..31),
+ milliSeconds ENUMERATED {
+ ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+ ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+ ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+ },
+ drx-InactivityTimer ENUMERATED {
+ ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+ ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+ spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+ drx-HARQ-RTT-TimerDL INTEGER (0..56),
+ drx-HARQ-RTT-TimerUL INTEGER (0..56),
+ drx-RetransmissionTimerDL ENUMERATED {
+ sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+ sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+ spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+ drx-RetransmissionTimerUL ENUMERATED {
+ sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+ sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+ spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+ drx-LongCycleStartOffset CHOICE {
+ ms10 INTEGER(0..9),
+ ms20 INTEGER(0..19),
+ ms32 INTEGER(0..31),
+ ms40 INTEGER(0..39),
+ ms60 INTEGER(0..59),
+ ms64 INTEGER(0..63),
+ ms70 INTEGER(0..69),
+ ms80 INTEGER(0..79),
+ ms128 INTEGER(0..127),
+ ms160 INTEGER(0..159),
+ ms256 INTEGER(0..255),
+ ms320 INTEGER(0..319),
+ ms512 INTEGER(0..511),
+ ms640 INTEGER(0..639),
+ ms1024 INTEGER(0..1023),
+ ms1280 INTEGER(0..1279),
+ ms2048 INTEGER(0..2047),
+ ms2560 INTEGER(0..2559),
+ ms5120 INTEGER(0..5119),
+ ms10240 INTEGER(0..10239)
+ },
+ shortDRX SEQUENCE {
+ drx-ShortCycle ENUMERATED {
+ ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+ ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+ spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+ drx-ShortCycleTimer INTEGER (1..16)
+ } OPTIONAL, -- Need R
+ drx-SlotOffset INTEGER (0..31)
+}
+
+-- TAG-DRX-CONFIG-STOP
+-- TAG-DRX-CONFIGSECONDARYGROUP-START
+
+DRX-ConfigSecondaryGroup ::= SEQUENCE {
+ drx-onDurationTimer CHOICE {
+ subMilliSeconds INTEGER (1..31),
+ milliSeconds ENUMERATED {
+ ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+ ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+ ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+ },
+ drx-InactivityTimer ENUMERATED {
+ ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+ ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+ spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-DRX-CONFIGSECONDARYGROUP-STOP
+-- TAG-FILTERCOEFFICIENT-START
+
+FilterCoefficient ::= ENUMERATED { fc0, fc1, fc2, fc3, fc4, fc5, fc6, fc7, fc8, fc9, fc11, fc13, fc15, fc17, fc19, spare1, ...}
+
+-- TAG-FILTERCOEFFICIENT-STOP
+-- TAG-FREQBANDINDICATORNR-START
+
+FreqBandIndicatorNR ::= INTEGER (1..1024)
+
+-- TAG-FREQBANDINDICATORNR-STOP
+-- TAG-FREQUENCYINFODL-START
+
+FrequencyInfoDL ::= SEQUENCE {
+ absoluteFrequencySSB ARFCN-ValueNR OPTIONAL, -- Cond SpCellAdd
+ frequencyBandList MultiFrequencyBandListNR,
+ absoluteFrequencyPointA ARFCN-ValueNR,
+ scs-SpecificCarrierList SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+ ...
+}
+
+-- TAG-FREQUENCYINFODL-STOP
+-- TAG-FREQUENCYINFODL-SIB-START
+
+FrequencyInfoDL-SIB ::= SEQUENCE {
+ frequencyBandList MultiFrequencyBandListNR-SIB,
+ offsetToPointA INTEGER (0..2199),
+ scs-SpecificCarrierList SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier
+}
+
+-- TAG-FREQUENCYINFODL-SIB-STOP
+-- TAG-FREQUENCYINFOUL-START
+
+FrequencyInfoUL ::= SEQUENCE {
+ frequencyBandList MultiFrequencyBandListNR OPTIONAL, -- Cond FDD-OrSUL
+ absoluteFrequencyPointA ARFCN-ValueNR OPTIONAL, -- Cond FDD-OrSUL
+ scs-SpecificCarrierList SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+ additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Need S
+ p-Max P-Max OPTIONAL, -- Need S
+ frequencyShift7p5khz ENUMERATED {true} OPTIONAL, -- Cond FDD-TDD-OrSUL-Optional
+ ...
+}
+
+-- TAG-FREQUENCYINFOUL-STOP
+-- TAG-FREQUENCYINFOUL-SIB-START
+
+FrequencyInfoUL-SIB ::= SEQUENCE {
+ frequencyBandList MultiFrequencyBandListNR-SIB OPTIONAL, -- Cond FDD-OrSUL
+ absoluteFrequencyPointA ARFCN-ValueNR OPTIONAL, -- Cond FDD-OrSUL
+ scs-SpecificCarrierList SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+ p-Max P-Max OPTIONAL, -- Need S
+ frequencyShift7p5khz ENUMERATED {true} OPTIONAL, -- Cond FDD-TDD-OrSUL-Optional
+ ...
+}
+
+-- TAG-FREQUENCYINFOUL-SIB-STOP
+-- TAG-HIGHSPEEDCONFIG-START
+
+HighSpeedConfig-r16 ::= SEQUENCE {
+ highSpeedMeasFlag-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ highSpeedDemodFlag-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-HIGHSPEEDCONFIG-STOP
+-- TAG-HYSTERESIS-START
+
+Hysteresis ::= INTEGER (0..30)
+
+-- TAG-HYSTERESIS-STOP
+-- TAG-INVALIDSYMBOLPATTERN-START
+
+InvalidSymbolPattern-r16 ::= SEQUENCE {
+ symbols-r16 CHOICE {
+ oneSlot BIT STRING (SIZE (14)),
+ twoSlots BIT STRING (SIZE (28))
+ },
+ periodicityAndPattern-r16 CHOICE {
+ n2 BIT STRING (SIZE (2)),
+ n4 BIT STRING (SIZE (4)),
+ n5 BIT STRING (SIZE (5)),
+ n8 BIT STRING (SIZE (8)),
+ n10 BIT STRING (SIZE (10)),
+ n20 BIT STRING (SIZE (20)),
+ n40 BIT STRING (SIZE (40))
+ } OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-INVALIDSYMBOLPATTERN-STOP
+-- TAG-I-RNTI-VALUE-START
+
+I-RNTI-Value ::= BIT STRING (SIZE(40))
+
+-- TAG-I-RNTI-VALUE-STOP
+-- TAG-LBT-FAILURERECOVERYCONFIG-START
+
+LBT-FailureRecoveryConfig-r16 ::= SEQUENCE {
+ lbt-FailureInstanceMaxCount-r16 ENUMERATED {n4, n8, n16, n32, n64, n128},
+ lbt-FailureDetectionTimer-r16 ENUMERATED {ms10, ms20, ms40, ms80, ms160, ms320},
+ ...
+}
+
+-- TAG-LBT-FAILURERECOVERYCONFIG-STOP
+-- TAG-LOCATIONINFO-START
+
+LocationInfo-r16 ::= SEQUENCE {
+ commonLocationInfo-r16 CommonLocationInfo-r16 OPTIONAL,
+ bt-LocationInfo-r16 LogMeasResultListBT-r16 OPTIONAL,
+ wlan-LocationInfo-r16 LogMeasResultListWLAN-r16 OPTIONAL,
+ sensor-LocationInfo-r16 Sensor-LocationInfo-r16 OPTIONAL,
+ ...
+}
+
+-- TAG-LOCATIONINFO-STOP
+-- TAG-LOCATIONMEASUREMENTINFO-START
+
+LocationMeasurementInfo ::= CHOICE {
+ eutra-RSTD EUTRA-RSTD-InfoList,
+ ...,
+ eutra-FineTimingDetection NULL,
+ nr-PRS-Measurement-r16 NR-PRS-MeasurementInfoList-r16
+}
+
+EUTRA-RSTD-InfoList ::= SEQUENCE (SIZE (1..maxInterRAT-RSTD-Freq)) OF EUTRA-RSTD-Info
+
+EUTRA-RSTD-Info ::= SEQUENCE {
+ carrierFreq ARFCN-ValueEUTRA,
+ measPRS-Offset INTEGER (0..39),
+ ...
+}
+
+NR-PRS-MeasurementInfoList-r16 ::= SEQUENCE (SIZE (1..maxFreqLayers)) OF NR-PRS-MeasurementInfo-r16
+
+NR-PRS-MeasurementInfo-r16 ::= SEQUENCE {
+ dl-PRS-ARFCN-PointA-r16 ARFCN-ValueNR,
+ nr-MeasPRS-RepetitionAndOffset-r16 CHOICE {
+ ms20-r16 INTEGER (0..19),
+ ms40-r16 INTEGER (0..39),
+ ms80-r16 INTEGER (0..79),
+ ms160-r16 INTEGER (0..159),
+ ...
+ },
+ nr-MeasPRS-length-r16 ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6, spare2, spare1},
+ ...
+}
+
+-- TAG-LOCATIONMEASUREMENTINFO-STOP
+-- TAG-LOGICALCHANNELCONFIG-START
+
+LogicalChannelConfig ::= SEQUENCE {
+ ul-SpecificParameters SEQUENCE {
+ priority INTEGER (1..16),
+ prioritisedBitRate ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+ kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+ bucketSizeDuration ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+ spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+ allowedServingCells SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF ServCellIndex
+ OPTIONAL, -- PDCP-CADuplication
+ allowedSCS-List SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing OPTIONAL, -- Need R
+ maxPUSCH-Duration ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+ OPTIONAL, -- Need R
+ configuredGrantType1Allowed ENUMERATED {true} OPTIONAL, -- Need R
+ logicalChannelGroup INTEGER (0..maxLCG-ID) OPTIONAL, -- Need R
+ schedulingRequestID SchedulingRequestId OPTIONAL, -- Need R
+ logicalChannelSR-Mask BOOLEAN,
+ logicalChannelSR-DelayTimerApplied BOOLEAN,
+ ...,
+ bitRateQueryProhibitTimer ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30} OPTIONAL, -- Need R
+ [[
+ allowedCG-List-r16 SEQUENCE (SIZE (0.. maxNrofConfiguredGrantConfigMAC-r16-1)) OF ConfiguredGrantConfigIndexMAC-r16
+ OPTIONAL, -- Need S
+ allowedPHY-PriorityIndex-r16 ENUMERATED {p0, p1} OPTIONAL -- Need S
+ ]]
+ } OPTIONAL, -- Cond UL
+ ...,
+ [[
+ channelAccessPriority-r16 INTEGER (1..4) OPTIONAL, -- Need R
+ bitRateMultiplier-r16 ENUMERATED {x40, x70, x100, x200} OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-LOGICALCHANNELCONFIG-STOP
+-- TAG-LOGICALCHANNELIDENTITY-START
+
+LogicalChannelIdentity ::= INTEGER (1..maxLC-ID)
+
+-- TAG-LOGICALCHANNELIDENTITY-STOP
+-- TAG-MAC-CELLGROUPCONFIG-START
+
+MAC-CellGroupConfig ::= SEQUENCE {
+ drx-Config SetupRelease { DRX-Config } OPTIONAL, -- Need M
+ schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need M
+ bsr-Config BSR-Config OPTIONAL, -- Need M
+ tag-Config TAG-Config OPTIONAL, -- Need M
+ phr-Config SetupRelease { PHR-Config } OPTIONAL, -- Need M
+ skipUplinkTxDynamic BOOLEAN,
+ ...,
+ [[
+ csi-Mask BOOLEAN OPTIONAL, -- Need M
+ dataInactivityTimer SetupRelease { DataInactivityTimer } OPTIONAL -- Cond MCG-Only
+ ]],
+ [[
+ usePreBSR-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ schedulingRequestID-LBT-SCell-r16 SchedulingRequestId OPTIONAL, -- Need M
+ lch-BasedPrioritization-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ schedulingRequestID-BFR-SCell-r16 SchedulingRequestId OPTIONAL, -- Need R
+ drx-ConfigSecondaryGroup-r16 SetupRelease { DRX-ConfigSecondaryGroup } OPTIONAL -- Need M
+ ]]
+}
+
+DataInactivityTimer ::= ENUMERATED {s1, s2, s3, s5, s7, s10, s15, s20, s40, s50, s60, s80, s100, s120, s150, s180}
+
+-- TAG-MAC-CELLGROUPCONFIG-STOP
+-- TAG-MEASCONFIG-START
+
+MeasConfig ::= SEQUENCE {
+ measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need N
+ measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need N
+ reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need N
+ reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need N
+ measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need N
+ measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need N
+ s-MeasureConfig CHOICE {
+ ssb-RSRP RSRP-Range,
+ csi-RSRP RSRP-Range
+ } OPTIONAL, -- Need M
+ quantityConfig QuantityConfig OPTIONAL, -- Need M
+ measGapConfig MeasGapConfig OPTIONAL, -- Need M
+ measGapSharingConfig MeasGapSharingConfig OPTIONAL, -- Need M
+ ...,
+ [[
+ interFrequencyConfig-NoGap-r16 ENUMERATED {true} OPTIONAL -- Need R
+ ]]
+}
+
+MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectId
+
+MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasId
+
+ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId
+
+-- TAG-MEASCONFIG-STOP
+-- TAG-MEASGAPCONFIG-START
+
+MeasGapConfig ::= SEQUENCE {
+ gapFR2 SetupRelease { GapConfig } OPTIONAL, -- Need M
+ ...,
+ [[
+ gapFR1 SetupRelease { GapConfig } OPTIONAL, -- Need M
+ gapUE SetupRelease { GapConfig } OPTIONAL -- Need M
+ ]]
+
+}
+
+GapConfig ::= SEQUENCE {
+ gapOffset INTEGER (0..159),
+ mgl ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6},
+ mgrp ENUMERATED {ms20, ms40, ms80, ms160},
+ mgta ENUMERATED {ms0, ms0dot25, ms0dot5},
+ ...,
+ [[
+ refServCellIndicator ENUMERATED {pCell, pSCell, mcg-FR2} OPTIONAL -- Cond NEDCorNRDC
+ ]],
+ [[
+ refFR2ServCellAsyncCA-r16 ServCellIndex OPTIONAL -- Cond AsyncCA
+ ]]
+
+}
+
+-- TAG-MEASGAPCONFIG-STOP
+-- TAG-MEASGAPSHARINGCONFIG-START
+
+MeasGapSharingConfig ::= SEQUENCE {
+ gapSharingFR2 SetupRelease { MeasGapSharingScheme } OPTIONAL, -- Need M
+ ...,
+ [[
+ gapSharingFR1 SetupRelease { MeasGapSharingScheme } OPTIONAL, --Need M
+ gapSharingUE SetupRelease { MeasGapSharingScheme } OPTIONAL --Need M
+ ]]
+
+}
+
+MeasGapSharingScheme::= ENUMERATED {scheme00, scheme01, scheme10, scheme11}
+
+-- TAG-MEASGAPSHARINGCONFIG-STOP
+-- TAG-MEASID-START
+
+MeasId ::= INTEGER (1..maxNrofMeasId)
+
+-- TAG-MEASID-STOP
+-- TAG-MEASIDLECONFIG-START
+
+MeasIdleConfigSIB-r16 ::= SEQUENCE {
+ measIdleCarrierListNR-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16 OPTIONAL, -- Need S
+ measIdleCarrierListEUTRA-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16 OPTIONAL, -- Need S
+ ...
+}
+
+MeasIdleConfigDedicated-r16 ::= SEQUENCE {
+ measIdleCarrierListNR-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16 OPTIONAL, -- Need N
+ measIdleCarrierListEUTRA-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16 OPTIONAL, -- Need N
+ measIdleDuration-r16 ENUMERATED{sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+ validityAreaList-r16 ValidityAreaList-r16 OPTIONAL, -- Need N
+ ...
+}
+
+ValidityAreaList-r16 ::= SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF ValidityArea-r16
+
+ValidityArea-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueNR,
+ validityCellList-r16 ValidityCellList OPTIONAL -- Need N
+}
+
+ValidityCellList ::= SEQUENCE (SIZE (1.. maxCellMeasIdle-r16)) OF PCI-Range
+
+MeasIdleCarrierNR-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueNR,
+ ssbSubcarrierSpacing-r16 SubcarrierSpacing,
+ frequencyBandList MultiFrequencyBandListNR OPTIONAL, -- Need R
+ measCellListNR-r16 CellListNR-r16 OPTIONAL, -- Need R
+ reportQuantities-r16 ENUMERATED {rsrp, rsrq, both},
+ qualityThreshold-r16 SEQUENCE {
+ idleRSRP-Threshold-NR-r16 RSRP-Range OPTIONAL, -- Need R
+ idleRSRQ-Threshold-NR-r16 RSRQ-Range OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ ssb-MeasConfig-r16 SEQUENCE {
+ nrofSS-BlocksToAverage-r16 INTEGER (2..maxNrofSS-BlocksToAverage) OPTIONAL, -- Need S
+ absThreshSS-BlocksConsolidation-r16 ThresholdNR OPTIONAL, -- Need S
+ smtc-r16 SSB-MTC OPTIONAL, -- Need S
+ ssb-ToMeasure-r16 SSB-ToMeasure OPTIONAL, -- Need S
+ deriveSSB-IndexFromCell-r16 BOOLEAN,
+ ss-RSSI-Measurement-r16 SS-RSSI-Measurement OPTIONAL -- Need S
+ } OPTIONAL, -- Need S
+ beamMeasConfigIdle-r16 BeamMeasConfigIdle-NR-r16 OPTIONAL, -- Need R
+ ...
+}
+
+MeasIdleCarrierEUTRA-r16 ::= SEQUENCE {
+ carrierFreqEUTRA-r16 ARFCN-ValueEUTRA,
+ allowedMeasBandwidth-r16 EUTRA-AllowedMeasBandwidth,
+ measCellListEUTRA-r16 CellListEUTRA-r16 OPTIONAL, -- Need R
+ reportQuantitiesEUTRA-r16 ENUMERATED {rsrp, rsrq, both},
+ qualityThresholdEUTRA-r16 SEQUENCE {
+ idleRSRP-Threshold-EUTRA-r16 RSRP-RangeEUTRA OPTIONAL, -- Need R
+ idleRSRQ-Threshold-EUTRA-r16 RSRQ-RangeEUTRA-r16 OPTIONAL -- Need R
+ } OPTIONAL, -- Need S
+ ...
+}
+
+CellListNR-r16 ::= SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF PCI-Range
+
+CellListEUTRA-r16 ::= SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF EUTRA-PhysCellIdRange
+
+BeamMeasConfigIdle-NR-r16 ::= SEQUENCE {
+ reportQuantityRS-Indexes-r16 ENUMERATED {rsrp, rsrq, both},
+ maxNrofRS-IndexesToReport-r16 INTEGER (1.. maxNrofIndexesToReport),
+ includeBeamMeasurements-r16 BOOLEAN
+}
+
+RSRQ-RangeEUTRA-r16 ::= INTEGER (-30..46)
+
+-- TAG-MEASIDLECONFIG-STOP
+-- TAG-MEASIDTOADDMODLIST-START
+
+MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasIdToAddMod
+
+MeasIdToAddMod ::= SEQUENCE {
+ measId MeasId,
+ measObjectId MeasObjectId,
+ reportConfigId ReportConfigId
+}
+
+-- TAG-MEASIDTOADDMODLIST-STOP
+-- TAG-MEASOBJECTCLI-START
+
+MeasObjectCLI-r16 ::= SEQUENCE {
+ cli-ResourceConfig-r16 CLI-ResourceConfig-r16,
+ ...
+}
+
+CLI-ResourceConfig-r16 ::= SEQUENCE {
+ srs-ResourceConfig-r16 SetupRelease { SRS-ResourceListConfigCLI-r16 } OPTIONAL, -- Need M
+ rssi-ResourceConfig-r16 SetupRelease { RSSI-ResourceListConfigCLI-r16 } OPTIONAL -- Need M
+}
+
+SRS-ResourceListConfigCLI-r16 ::= SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceConfigCLI-r16
+
+RSSI-ResourceListConfigCLI-r16 ::= SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceConfigCLI-r16
+
+SRS-ResourceConfigCLI-r16 ::= SEQUENCE {
+ srs-Resource-r16 SRS-Resource,
+ srs-SCS-r16 SubcarrierSpacing,
+ ...
+}
+
+RSSI-ResourceConfigCLI-r16 ::= SEQUENCE {
+ rssi-ResourceId-r16 RSSI-ResourceId-r16,
+ rssi-SCS-r16 SubcarrierSpacing,
+ startPRB-r16 INTEGER (0..2169),
+ nrofPRBs-r16 INTEGER (4..maxNrofPhysicalResourceBlocksPlus1),
+ startPosition-r16 INTEGER (0..13),
+ nrofSymbols-r16 INTEGER (1..14),
+ rssi-PeriodicityAndOffset-r16 RSSI-PeriodicityAndOffset-r16,
+ ...
+}
+
+RSSI-ResourceId-r16 ::= INTEGER (0.. maxNrofCLI-RSSI-Resources-r16-1)
+
+RSSI-PeriodicityAndOffset-r16 ::= CHOICE {
+ sl10 INTEGER(0..9),
+ sl20 INTEGER(0..19),
+ sl40 INTEGER(0..39),
+ sl80 INTEGER(0..79),
+ sl160 INTEGER(0..159),
+ sl320 INTEGER(0..319),
+ s1640 INTEGER(0..639),
+ ...
+}
+
+-- TAG-MEASOBJECTCLI-STOP
+-- TAG-MEASOBJECTEUTRA-START
+
+MeasObjectEUTRA::= SEQUENCE {
+ carrierFreq ARFCN-ValueEUTRA,
+ allowedMeasBandwidth EUTRA-AllowedMeasBandwidth,
+ cellsToRemoveListEUTRAN EUTRA-CellIndexList OPTIONAL, -- Need N
+ cellsToAddModListEUTRAN SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-Cell OPTIONAL, -- Need N
+ blackCellsToRemoveListEUTRAN EUTRA-CellIndexList OPTIONAL, -- Need N
+ blackCellsToAddModListEUTRAN SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-BlackCell OPTIONAL, -- Need N
+ eutra-PresenceAntennaPort1 EUTRA-PresenceAntennaPort1,
+ eutra-Q-OffsetRange EUTRA-Q-OffsetRange OPTIONAL, -- Need R
+ widebandRSRQ-Meas BOOLEAN,
+ ...
+}
+
+EUTRA-CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-CellIndex
+
+EUTRA-CellIndex ::= INTEGER (1..maxCellMeasEUTRA)
+
+
+EUTRA-Cell ::= SEQUENCE {
+ cellIndexEUTRA EUTRA-CellIndex,
+ physCellId EUTRA-PhysCellId,
+ cellIndividualOffset EUTRA-Q-OffsetRange
+}
+
+
+EUTRA-BlackCell ::= SEQUENCE {
+ cellIndexEUTRA EUTRA-CellIndex,
+ physCellIdRange EUTRA-PhysCellIdRange
+}
+
+-- TAG-MEASOBJECTEUTRA-STOP
+-- TAG-MEASOBJECTID-START
+
+MeasObjectId ::= INTEGER (1..maxNrofObjectId)
+
+-- TAG-MEASOBJECTID-STOP
+-- TAG-MEASOBJECTNR-START
+
+MeasObjectNR ::= SEQUENCE {
+ ssbFrequency ARFCN-ValueNR OPTIONAL, -- Cond SSBorAssociatedSSB
+ ssbSubcarrierSpacing SubcarrierSpacing OPTIONAL, -- Cond SSBorAssociatedSSB
+ smtc1 SSB-MTC OPTIONAL, -- Cond SSBorAssociatedSSB
+ smtc2 SSB-MTC2 OPTIONAL, -- Cond IntraFreqConnected
+ refFreqCSI-RS ARFCN-ValueNR OPTIONAL, -- Cond CSI-RS
+ referenceSignalConfig ReferenceSignalConfig,
+ absThreshSS-BlocksConsolidation ThresholdNR OPTIONAL, -- Need R
+ absThreshCSI-RS-Consolidation ThresholdNR OPTIONAL, -- Need R
+ nrofSS-BlocksToAverage INTEGER (2..maxNrofSS-BlocksToAverage) OPTIONAL, -- Need R
+ nrofCSI-RS-ResourcesToAverage INTEGER (2..maxNrofCSI-RS-ResourcesToAverage) OPTIONAL, -- Need R
+ quantityConfigIndex INTEGER (1..maxNrofQuantityConfig),
+ offsetMO Q-OffsetRangeList,
+ cellsToRemoveList PCI-List OPTIONAL, -- Need N
+ cellsToAddModList CellsToAddModList OPTIONAL, -- Need N
+ blackCellsToRemoveList PCI-RangeIndexList OPTIONAL, -- Need N
+ blackCellsToAddModList SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement OPTIONAL, -- Need N
+ whiteCellsToRemoveList PCI-RangeIndexList OPTIONAL, -- Need N
+ whiteCellsToAddModList SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement OPTIONAL, -- Need N
+ ...,
+ [[
+ freqBandIndicatorNR FreqBandIndicatorNR OPTIONAL, -- Need R
+ measCycleSCell ENUMERATED {sf160, sf256, sf320, sf512, sf640, sf1024, sf1280} OPTIONAL -- Need R
+ ]],
+ [[
+
+ smtc3list-r16 SSB-MTC3List-r16 OPTIONAL, -- Need R
+ rmtc-Config-r16 SetupRelease {RMTC-Config-r16} OPTIONAL, -- Need M
+ t312-r16 SetupRelease { T312-r16 } OPTIONAL -- Need M
+ ]]
+}
+
+SSB-MTC3List-r16::= SEQUENCE (SIZE(1..4)) OF SSB-MTC3-r16
+
+T312-r16 ::= ENUMERATED { ms0, ms50, ms100, ms200, ms300, ms400, ms500, ms1000}
+
+ReferenceSignalConfig::= SEQUENCE {
+ ssb-ConfigMobility SSB-ConfigMobility OPTIONAL, -- Need M
+ csi-rs-ResourceConfigMobility SetupRelease { CSI-RS-ResourceConfigMobility } OPTIONAL -- Need M
+}
+
+SSB-ConfigMobility::= SEQUENCE {
+
+ ssb-ToMeasure SetupRelease { SSB-ToMeasure } OPTIONAL, -- Need M
+ deriveSSB-IndexFromCell BOOLEAN,
+ ss-RSSI-Measurement SS-RSSI-Measurement OPTIONAL, -- Need M
+ ...,
+ [[
+ ssb-PositionQCL-Common-r16 SSB-PositionQCL-Relation-r16 OPTIONAL, -- Cond SharedSpectrum
+ ssb-PositionQCL-CellsToAddModList-r16 SSB-PositionQCL-CellsToAddModList-r16 OPTIONAL, -- Need N
+ ssb-PositionQCL-CellsToRemoveList-r16 PCI-List OPTIONAL -- Need N
+ ]]
+
+}
+
+
+Q-OffsetRangeList ::= SEQUENCE {
+ rsrpOffsetSSB Q-OffsetRange DEFAULT dB0,
+ rsrqOffsetSSB Q-OffsetRange DEFAULT dB0,
+ sinrOffsetSSB Q-OffsetRange DEFAULT dB0,
+ rsrpOffsetCSI-RS Q-OffsetRange DEFAULT dB0,
+ rsrqOffsetCSI-RS Q-OffsetRange DEFAULT dB0,
+ sinrOffsetCSI-RS Q-OffsetRange DEFAULT dB0
+}
+
+
+ThresholdNR ::= SEQUENCE{
+ thresholdRSRP RSRP-Range OPTIONAL, -- Need R
+ thresholdRSRQ RSRQ-Range OPTIONAL, -- Need R
+ thresholdSINR SINR-Range OPTIONAL -- Need R
+}
+
+CellsToAddModList ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CellsToAddMod
+
+CellsToAddMod ::= SEQUENCE {
+ physCellId PhysCellId,
+ cellIndividualOffset Q-OffsetRangeList
+}
+
+RMTC-Config-r16 ::= SEQUENCE {
+ rmtc-Periodicity-r16 ENUMERATED {ms40, ms80, ms160, ms320, ms640},
+ rmtc-SubframeOffset-r16 INTEGER(0..639) OPTIONAL, -- Need M
+ measDurationSymbols-r16 ENUMERATED {sym1, sym14or12, sym28or24, sym42or36, sym70or60},
+ rmtc-Frequency-r16 ARFCN-ValueNR,
+ ref-SCS-CP-r16 ENUMERATED {kHz15, kHz30, kHz60-NCP, kHz60-ECP},
+ ...
+}
+
+SSB-PositionQCL-CellsToAddModList-r16 ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF SSB-PositionQCL-CellsToAddMod-r16
+
+SSB-PositionQCL-CellsToAddMod-r16 ::= SEQUENCE {
+ physCellId-r16 PhysCellId,
+ ssb-PositionQCL-r16 SSB-PositionQCL-Relation-r16
+}
+
+-- TAG-MEASOBJECTNR-STOP
+-- TAG-MEASOBJECTNR-SL-START
+
+MeasObjectNR-SL-r16 ::= SEQUENCE {
+ tx-PoolMeasToRemoveList-r16 Tx-PoolMeasList-r16 OPTIONAL, -- Need N
+ tx-PoolMeasToAddModList-r16 Tx-PoolMeasList-r16 OPTIONAL -- Need N
+}
+
+Tx-PoolMeasList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-PoolToMeasureNR-r16)) OF SL-ResourcePoolID-r16
+
+-- TAG-MEASOBJECTNR-SL-STOP
+-- TAG-MEASOBJECTTOADDMODLIST-START
+
+MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectToAddMod
+
+MeasObjectToAddMod ::= SEQUENCE {
+ measObjectId MeasObjectId,
+ measObject CHOICE {
+ measObjectNR MeasObjectNR,
+ ...,
+ measObjectEUTRA MeasObjectEUTRA,
+ measObjectUTRA-FDD-r16 MeasObjectUTRA-FDD-r16,
+ measObjectNR-SL-r16 MeasObjectNR-SL-r16,
+ measObjectCLI-r16 MeasObjectCLI-r16
+ }
+}
+
+-- TAG-MEASOBJECTTOADDMODLIST-STOP
+-- TAG-MEASOBJECTUTRA-FDD-START
+
+MeasObjectUTRA-FDD-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueUTRA-FDD-r16,
+ utra-FDD-Q-OffsetRange-r16 UTRA-FDD-Q-OffsetRange-r16 OPTIONAL, -- Need R
+ cellsToRemoveList-r16 UTRA-FDD-CellIndexList-r16 OPTIONAL, -- Need N
+ cellsToAddModList-r16 CellsToAddModListUTRA-FDD-r16 OPTIONAL, -- Need N
+ ...
+}
+
+CellsToAddModListUTRA-FDD-r16 ::= SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF CellsToAddModUTRA-FDD-r16
+
+CellsToAddModUTRA-FDD-r16 ::= SEQUENCE {
+ cellIndexUTRA-FDD-r16 UTRA-FDD-CellIndex-r16,
+ physCellId-r16 PhysCellIdUTRA-FDD-r16
+}
+
+UTRA-FDD-CellIndexList-r16 ::= SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF UTRA-FDD-CellIndex-r16
+
+UTRA-FDD-CellIndex-r16 ::= INTEGER (1..maxCellMeasUTRA-FDD-r16)
+
+-- TAG-MEASOBJECTUTRA-FDD-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-NR-START
+
+MeasResultCellListSFTD-NR ::= SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultCellSFTD-NR
+
+MeasResultCellSFTD-NR ::= SEQUENCE {
+ physCellId PhysCellId,
+ sfn-OffsetResult INTEGER (0..1023),
+ frameBoundaryOffsetResult INTEGER (-30720..30719),
+ rsrp-Result RSRP-Range OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-NR-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-START
+
+MeasResultCellListSFTD-EUTRA ::= SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultSFTD-EUTRA
+
+MeasResultSFTD-EUTRA ::= SEQUENCE {
+ eutra-PhysCellId EUTRA-PhysCellId,
+ sfn-OffsetResult INTEGER (0..1023),
+ frameBoundaryOffsetResult INTEGER (-30720..30719),
+ rsrp-Result RSRP-Range OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-STOP
+-- TAG-MEASRESULTS-START
+
+MeasResults ::= SEQUENCE {
+ measId MeasId,
+ measResultServingMOList MeasResultServMOList,
+ measResultNeighCells CHOICE {
+ measResultListNR MeasResultListNR,
+ ...,
+ measResultListEUTRA MeasResultListEUTRA,
+ measResultListUTRA-FDD-r16 MeasResultListUTRA-FDD-r16
+ } OPTIONAL,
+ ...,
+ [[
+ measResultServFreqListEUTRA-SCG MeasResultServFreqListEUTRA-SCG OPTIONAL,
+ measResultServFreqListNR-SCG MeasResultServFreqListNR-SCG OPTIONAL,
+ measResultSFTD-EUTRA MeasResultSFTD-EUTRA OPTIONAL,
+ measResultSFTD-NR MeasResultCellSFTD-NR OPTIONAL
+ ]],
+ [[
+ measResultCellListSFTD-NR MeasResultCellListSFTD-NR OPTIONAL
+ ]],
+ [[
+ measResultForRSSI-r16 MeasResultForRSSI-r16 OPTIONAL,
+ locationInfo-r16 LocationInfo-r16 OPTIONAL,
+ ul-PDCP-DelayValueResultList-r16 UL-PDCP-DelayValueResultList-r16 OPTIONAL,
+ measResultsSL-r16 MeasResultsSL-r16 OPTIONAL,
+ measResultCLI-r16 MeasResultCLI-r16 OPTIONAL
+ ]]
+
+
+}
+
+MeasResultServMOList ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResultServMO
+
+MeasResultServMO ::= SEQUENCE {
+ servCellId ServCellIndex,
+ measResultServingCell MeasResultNR,
+ measResultBestNeighCell MeasResultNR OPTIONAL,
+ ...
+}
+
+MeasResultListNR ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultNR
+
+MeasResultNR ::= SEQUENCE {
+ physCellId PhysCellId OPTIONAL,
+ measResult SEQUENCE {
+ cellResults SEQUENCE{
+ resultsSSB-Cell MeasQuantityResults OPTIONAL,
+ resultsCSI-RS-Cell MeasQuantityResults OPTIONAL
+ },
+ rsIndexResults SEQUENCE{
+ resultsSSB-Indexes ResultsPerSSB-IndexList OPTIONAL,
+ resultsCSI-RS-Indexes ResultsPerCSI-RS-IndexList OPTIONAL
+ } OPTIONAL
+ },
+ ...,
+ [[
+ cgi-Info CGI-InfoNR OPTIONAL
+ ]]
+}
+
+MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA
+
+MeasResultEUTRA ::= SEQUENCE {
+ eutra-PhysCellId PhysCellId,
+ measResult MeasQuantityResultsEUTRA,
+
+ cgi-Info CGI-InfoEUTRA OPTIONAL,
+ ...
+}
+
+MultiBandInfoListEUTRA ::= SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicatorEUTRA
+
+MeasQuantityResults ::= SEQUENCE {
+ rsrp RSRP-Range OPTIONAL,
+ rsrq RSRQ-Range OPTIONAL,
+ sinr SINR-Range OPTIONAL
+}
+
+MeasQuantityResultsEUTRA ::= SEQUENCE {
+ rsrp RSRP-RangeEUTRA OPTIONAL,
+ rsrq RSRQ-RangeEUTRA OPTIONAL,
+ sinr SINR-RangeEUTRA OPTIONAL
+}
+
+ResultsPerSSB-IndexList::= SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerSSB-Index
+
+ResultsPerSSB-Index ::= SEQUENCE {
+ ssb-Index SSB-Index,
+ ssb-Results MeasQuantityResults OPTIONAL
+}
+
+ResultsPerCSI-RS-IndexList::= SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerCSI-RS-Index
+
+ResultsPerCSI-RS-Index ::= SEQUENCE {
+ csi-RS-Index CSI-RS-Index,
+ csi-RS-Results MeasQuantityResults OPTIONAL
+}
+MeasResultServFreqListEUTRA-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF MeasResult2EUTRA
+
+MeasResultServFreqListNR-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResult2NR
+
+MeasResultListUTRA-FDD-r16 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA-FDD-r16
+
+MeasResultUTRA-FDD-r16 ::= SEQUENCE {
+ physCellId-r16 PhysCellIdUTRA-FDD-r16,
+ measResult-r16 SEQUENCE {
+ utra-FDD-RSCP-r16 INTEGER (-5..91) OPTIONAL,
+ utra-FDD-EcN0-r16 INTEGER (0..49) OPTIONAL
+ }
+}
+
+MeasResultForRSSI-r16 ::= SEQUENCE {
+ rssi-Result-r16 ENUMERATED{ffs},
+ channelOccupancy-r16 INTEGER (0..100)
+}
+
+MeasResultCLI-r16 ::= SEQUENCE {
+ measResultListSRS-RSRP-r16 MeasResultListSRS-RSRP-r16 OPTIONAL,
+ measResultListCLI-RSSI-r16 MeasResultListCLI-RSSI-r16 OPTIONAL
+}
+
+MeasResultListSRS-RSRP-r16 ::= SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultSRS-RSRP-r16
+
+MeasResultSRS-RSRP-r16 ::= SEQUENCE {
+ srs-ResourceId-r16 SRS-ResourceId,
+ srs-RSRP-Result-r16 SRS-RSRP-Range-r16
+}
+
+MeasResultListCLI-RSSI-r16 ::= SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultCLI-RSSI-r16
+
+MeasResultCLI-RSSI-r16 ::= SEQUENCE {
+ rssi-ResourceId-r16 RSSI-ResourceId-r16,
+ cli-RSSI-Result-r16 CLI-RSSI-Range-r16
+}
+
+UL-PDCP-DelayValueResultList-r16 ::= SEQUENCE (SIZE (1..maxDRB)) OF UL-PDCP-DelayValueResult-r16
+
+UL-PDCP-DelayValueResult-r16 ::= SEQUENCE {
+ drb-Id-r16 DRB-Identity,
+ averageDelay-r16 INTEGER (0..10000),
+ ...
+}
+
+-- TAG-MEASRESULTS-STOP
+-- TAG-MEASRESULT2EUTRA-START
+
+MeasResult2EUTRA ::= SEQUENCE {
+ carrierFreq ARFCN-ValueEUTRA,
+ measResultServingCell MeasResultEUTRA OPTIONAL,
+ measResultBestNeighCell MeasResultEUTRA OPTIONAL,
+ ...
+}
+
+-- TAG-MEASRESULT2EUTRA-STOP
+-- TAG-MEASRESULT2NR-START
+
+MeasResult2NR ::= SEQUENCE {
+ ssbFrequency ARFCN-ValueNR OPTIONAL,
+ refFreqCSI-RS ARFCN-ValueNR OPTIONAL,
+ measResultServingCell MeasResultNR OPTIONAL,
+ measResultNeighCellListNR MeasResultListNR OPTIONAL,
+ ...
+}
+
+-- TAG-MEASRESULT2NR-STOP
+-- TAG-MEASRESULTIDLEEUTRA-START
+
+MeasResultIdleEUTRA-r16 ::= SEQUENCE {
+ measResultsPerCarrierListIdleEUTRA-r16 SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleEUTRA-r16,
+ ...
+}
+
+MeasResultsPerCarrierIdleEUTRA-r16 ::= SEQUENCE {
+ carrierFreqEUTRA-r16 ARFCN-ValueEUTRA,
+ measResultsPerCellListIdleEUTRA-r16 SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleEUTRA-r16,
+ ...
+}
+
+MeasResultsPerCellIdleEUTRA-r16 ::= SEQUENCE {
+ eutra-PhysCellId-r16 EUTRA-PhysCellId,
+ measIdleResultEUTRA-r16 SEQUENCE {
+ rsrp-ResultEUTRA-r16 RSRP-RangeEUTRA OPTIONAL,
+ rsrq-ResultEUTRA-r16 RSRQ-RangeEUTRA-r16 OPTIONAL
+ },
+ ...
+}
+
+-- TAG-MEASRESULTIDLEEUTRA-STOP
+-- TAG-MEASRESULTIDLENR-START
+
+MeasResultIdleNR-r16 ::= SEQUENCE {
+ measResultServingCell-r16 SEQUENCE {
+ rsrp-Result-r16 RSRP-Range OPTIONAL,
+ rsrq-Result-r16 RSRQ-Range OPTIONAL,
+ resultsSSB-Indexes-r16 ResultsPerSSB-IndexList-r16 OPTIONAL
+ },
+ measResultsPerCarrierListIdleNR-r16 SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleNR-r16 OPTIONAL,
+ ...
+}
+
+MeasResultsPerCarrierIdleNR-r16 ::= SEQUENCE {
+ carrierFreq-r16 ARFCN-ValueNR,
+ measResultsPerCellListIdleNR-r16 SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleNR-r16,
+ ...
+}
+
+MeasResultsPerCellIdleNR-r16 ::= SEQUENCE {
+ physCellId-r16 PhysCellId,
+ measIdleResultNR-r16 SEQUENCE {
+ rsrp-Result-r16 RSRP-Range OPTIONAL,
+ rsrq-Result-r16 RSRQ-Range OPTIONAL,
+ resultsSSB-Indexes-r16 ResultsPerSSB-IndexList-r16 OPTIONAL
+ },
+ ...
+}
+
+ResultsPerSSB-IndexList-r16 ::= SEQUENCE (SIZE (1.. maxNrofIndexesToReport)) OF ResultsPerSSB-IndexIdle-r16
+
+ResultsPerSSB-IndexIdle-r16 ::= SEQUENCE {
+ ssb-Index-r16 SSB-Index,
+ ssb-Results-r16 SEQUENCE {
+ ssb-RSRP-Result-r16 RSRP-Range OPTIONAL,
+ ssb-RSRQ-Result-r16 RSRQ-Range OPTIONAL
+ } OPTIONAL
+}
+
+-- TAG-MEASRESULTIDLENR-STOP
+-- TAG-MEASRESULTSCG-FAILURE-START
+
+MeasResultSCG-Failure ::= SEQUENCE {
+ measResultPerMOList MeasResultList2NR,
+ ...,
+ [[
+ locationInfo-r16 LocationInfo-r16 OPTIONAL
+ ]]
+}
+
+MeasResultList2NR ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+-- TAG-MEASRESULTSCG-FAILURE-STOP
+-- TAG-MEASRESULTSSL-START
+
+MeasResultsSL-r16 ::= SEQUENCE {
+ measResultsListSL-r16 CHOICE {
+ measResultNR-SL-r16 MeasResultNR-SL-r16,
+ ...
+ },
+ ...
+}
+
+MeasResultNR-SL-r16 ::= SEQUENCE {
+ measResultListCBR-NR-r16 SEQUENCE (SIZE (1.. maxNrofSL-PoolToMeasureNR-r16)) OF MeasResultCBR-NR-r16,
+ ...
+}
+
+MeasResultCBR-NR-r16 ::= SEQUENCE {
+ sl-poolReportIdentity-r16 SL-ResourcePoolID-r16,
+ sl-CBR-ResultsNR-r16 SL-CBR-r16,
+ ...
+}
+
+-- TAG-MEASRESULTSSL-STOP
+-- TAG-MEASTRIGGERQUANTITYEUTRA-START
+
+MeasTriggerQuantityEUTRA::= CHOICE {
+ rsrp RSRP-RangeEUTRA,
+ rsrq RSRQ-RangeEUTRA,
+ sinr SINR-RangeEUTRA
+}
+
+RSRP-RangeEUTRA ::= INTEGER (0..97)
+
+RSRQ-RangeEUTRA ::= INTEGER (0..34)
+
+SINR-RangeEUTRA ::= INTEGER (0..127)
+
+-- TAG-MEASTRIGGERQUANTITYEUTRA-STOP
+-- TAG-MOBILITYSTATEPARAMETERS-START
+
+MobilityStateParameters ::= SEQUENCE{
+ t-Evaluation ENUMERATED {
+ s30, s60, s120, s180, s240, spare3, spare2, spare1},
+ t-HystNormal ENUMERATED {
+ s30, s60, s120, s180, s240, spare3, spare2, spare1},
+ n-CellChangeMedium INTEGER (1..16),
+ n-CellChangeHigh INTEGER (1..16)
+}
+
+-- TAG-MOBILITYSTATEPARAMETERS-STOP
+-- TAG-MSGACONFIGCOMMON-START
+
+MsgA-ConfigCommon-r16 ::= SEQUENCE {
+ rach-ConfigCommonTwoStepRA-r16 RACH-ConfigCommonTwoStepRA-r16,
+ msgA-PUSCH-Config-r16 MsgA-PUSCH-Config-r16 OPTIONAL --Cond InitialBWPConfig
+}
+-- TAG-MSGACONFIGCOMMON-STOP
+-- TAG-MSGA-PUSCH-CONFIG-START
+
+MsgA-PUSCH-Config-r16 ::= SEQUENCE {
+ msgA-PUSCH-ResourceGroupA-r16 MsgA-PUSCH-Resource-r16 OPTIONAL, -- Cond InitialBWPConfig
+ msgA-PUSCH-ResourceGroupB-r16 MsgA-PUSCH-Resource-r16 OPTIONAL, -- Cond GroupBConfigured
+ msgA-TransformPrecoder-r16 ENUMERATED {enabled, disabled} OPTIONAL, -- Need R
+ msgA-DataScramblingIndex-r16 INTEGER (0..1023) OPTIONAL, -- Need S
+ msgA-DeltaPreamble-r16 INTEGER (-1..6) OPTIONAL -- Need R
+}
+
+MsgA-PUSCH-Resource-r16 ::= SEQUENCE {
+ msgA-MCS-r16 INTEGER (0..15),
+ nrofSlotsMsgA-PUSCH-r16 INTEGER (1..4),
+ nrofMsgA-PO-PerSlot-r16 ENUMERATED {one, two, three, six},
+ msgA-PUSCH-TimeDomainOffset-r16 INTEGER (1..32),
+ msgA-PUSCH-TimeDomainAllocation-r16 INTEGER (1..maxNrofUL-Allocations) OPTIONAL, -- Need S
+ startSymbolAndLengthMsgA-PO-r16 INTEGER (0..127) OPTIONAL, -- Need S
+ mappingTypeMsgA-PUSCH-r16 ENUMERATED {typeA, typeB} OPTIONAL, -- Need S
+ guardPeriodMsgA-PUSCH-r16 INTEGER (0..3) OPTIONAL, -- Need R
+ guardBandMsgA-PUSCH-r16 INTEGER (0..1),
+ frequencyStartMsgA-PUSCH-r16 INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+ nrofPRBs-PerMsgA-PO-r16 INTEGER (1..32),
+ nrofMsgA-PO-FDM-r16 ENUMERATED {one, two, four, eight},
+ msgA-IntraSlotFrequencyHopping-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ msgA-HoppingBits-r16 BIT STRING (SIZE(2)) OPTIONAL, -- Need R
+ msgA-DMRS-Config-r16 MsgA-DMRS-Config-r16,
+ nrofDMRS-Sequences-r16 INTEGER (1..2),
+ msgA-Alpha-r16 ENUMERATED {alpha0, alpha04, alpha05, alpha06,
+ alpha07, alpha08, alpha09, alpha1} OPTIONAL, -- Need S
+ interlaceIndexFirstPO-MsgA-PUSCH-r16 INTEGER (1..10) OPTIONAL, -- Need R
+ nrofInterlacesPerMsgA-PO-r16 INTEGER (1..10) OPTIONAL, -- Need R
+ ...
+}
+
+MsgA-DMRS-Config-r16 ::= SEQUENCE {
+ msgA-DMRS-AdditionalPosition-r16 ENUMERATED {pos0, pos1, pos3} OPTIONAL, -- Need S
+ msgA-MaxLength-r16 ENUMERATED {len2} OPTIONAL, -- Need S
+ msgA-PUSCH-DMRS-CDM-Group-r16 INTEGER (0..1) OPTIONAL, -- Need S
+ msgA-PUSCH-NrofPorts-r16 INTEGER (0..1) OPTIONAL, -- Need S
+ msgA-ScramblingID0-r16 INTEGER (0..65536) OPTIONAL, -- Need S
+ msgA-ScramblingID1-r16 INTEGER (0..65536) OPTIONAL -- Need S
+}
+
+-- TAG-MSGA-PUSCH-CONFIG-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-START
+
+MultiFrequencyBandListNR ::= SEQUENCE (SIZE (1..maxNrofMultiBands)) OF FreqBandIndicatorNR
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-START
+
+MultiFrequencyBandListNR-SIB ::= SEQUENCE (SIZE (1.. maxNrofMultiBands)) OF NR-MultiBandInfo
+
+NR-MultiBandInfo ::= SEQUENCE {
+ freqBandIndicatorNR FreqBandIndicatorNR OPTIONAL, -- Cond OptULNotSIB2
+ nr-NS-PmaxList NR-NS-PmaxList OPTIONAL -- Need S
+}
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-STOP
+-- TAG-NeedForGapsConfigNR-START
+
+NeedForGapsConfigNR-r16 ::= SEQUENCE {
+ requestedTargetBandFilterNR-r16 SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR OPTIONAL -- Need R
+}
+
+-- TAG-NeedForGapsConfigNR-STOP
+-- TAG-NeedForGapsInfoNR-START
+
+NeedForGapsInfoNR-r16 ::= SEQUENCE {
+ intraFreq-needForGap-r16 NeedForGapsIntraFreqlist-r16,
+ interFreq-needForGap-r16 NeedForGapsBandlistNR-r16
+}
+
+NeedForGapsIntraFreqlist-r16 ::= SEQUENCE (SIZE (1.. maxNrofServingCells)) OF NeedForGapsIntraFreq-r16
+
+NeedForGapsBandlistNR-r16 ::= SEQUENCE (SIZE (1..maxBands)) OF NeedForGapsNR-r16
+
+NeedForGapsIntraFreq-r16 ::= SEQUENCE {
+ servCellId-r16 ServCellIndex,
+ gapIndicationIntra-r16 ENUMERATED {gap, no-gap}
+}
+
+NeedForGapsNR-r16 ::= SEQUENCE {
+ bandNR-r16 FreqBandIndicatorNR,
+ gapIndication-r16 ENUMERATED {gap, no-gap}
+}
+
+-- TAG-NeedForGapsInfoNR-STOP
+-- TAG-NEXTHOPCHAININGCOUNT-START
+
+NextHopChainingCount ::= INTEGER (0..7)
+
+-- TAG-NEXTHOPCHAININGCOUNT-STOP
+-- TAG-NG-5G-S-TMSI-START
+
+NG-5G-S-TMSI ::= BIT STRING (SIZE (48))
+
+-- TAG-NG-5G-S-TMSI-STOP
+-- TAG-NPN-IDENTITY-START
+
+NPN-Identity-r16 ::= CHOICE {
+ pni-npn-r16 SEQUENCE {
+ plmn-Identity-r16 PLMN-Identity,
+ cag-IdentityList-r16 SEQUENCE (SIZE (1..maxNPN-r16)) OF CAG-IdentityInfo-r16
+ },
+ snpn-r16 SEQUENCE {
+ plmn-Identity PLMN-Identity,
+ nid-List-r16 SEQUENCE (SIZE (1..maxNPN-r16)) OF NID-r16
+ }
+}
+
+CAG-IdentityInfo-r16 ::= SEQUENCE {
+ cag-Identity-r16 BIT STRING (SIZE (32)),
+ manualCAGselectionAllowed-r16 ENUMERATED {true} OPTIONAL -- Need R
+}
+
+NID-r16 ::= BIT STRING (SIZE (44))
+
+-- TAG-NPN-IDENTITY-STOP
+-- TAG-NPN-IDENTITYINFOLIST-START
+
+NPN-IdentityInfoList-r16 ::= SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-IdentityInfo-r16
+
+
+NPN-IdentityInfo-r16 ::= SEQUENCE {
+ npn-IdentityList-r16 SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-Identity-r16,
+ trackingAreaCode-r16 TrackingAreaCode,
+ ranac-r16 RAN-AreaCode OPTIONAL, -- Need R
+ cellIdentity-r16 CellIdentity,
+ cellReservedForOperatorUse-r16 ENUMERATED {reserved, notReserved},
+ iab-Support-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-NPN-IDENTITYINFOLIST-STOP
+-- TAG-NR-NS-PMAXLIST-START
+
+NR-NS-PmaxList ::= SEQUENCE (SIZE (1..maxNR-NS-Pmax)) OF NR-NS-PmaxValue
+
+NR-NS-PmaxValue ::= SEQUENCE {
+ additionalPmax P-Max OPTIONAL, -- Need N
+ additionalSpectrumEmission AdditionalSpectrumEmission
+}
+
+-- TAG-NR-NS-PMAXLIST-STOP
+-- TAG-NZP-CSI-RS-RESOURCE-START
+
+NZP-CSI-RS-Resource ::= SEQUENCE {
+ nzp-CSI-RS-ResourceId NZP-CSI-RS-ResourceId,
+ resourceMapping CSI-RS-ResourceMapping,
+ powerControlOffset INTEGER (-8..15),
+ powerControlOffsetSS ENUMERATED{db-3, db0, db3, db6} OPTIONAL, -- Need R
+ scramblingID ScramblingId,
+ periodicityAndOffset CSI-ResourcePeriodicityAndOffset OPTIONAL, -- Cond PeriodicOrSemiPersistent
+ qcl-InfoPeriodicCSI-RS TCI-StateId OPTIONAL, -- Cond Periodic
+ ...
+}
+
+-- TAG-NZP-CSI-RS-RESOURCE-STOP
+-- TAG-NZP-CSI-RS-RESOURCEID-START
+
+NZP-CSI-RS-ResourceId ::= INTEGER (0..maxNrofNZP-CSI-RS-Resources-1)
+
+-- TAG-NZP-CSI-RS-RESOURCEID-STOP
+-- TAG-NZP-CSI-RS-RESOURCESET-START
+NZP-CSI-RS-ResourceSet ::= SEQUENCE {
+ nzp-CSI-ResourceSetId NZP-CSI-RS-ResourceSetId,
+ nzp-CSI-RS-Resources SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerSet)) OF NZP-CSI-RS-ResourceId,
+ repetition ENUMERATED { on, off } OPTIONAL, -- Need S
+ aperiodicTriggeringOffset INTEGER(0..6) OPTIONAL, -- Need S
+ trs-Info ENUMERATED {true} OPTIONAL, -- Need R
+ ...,
+ [[
+ aperiodicTriggeringOffset-r16 INTEGER(0..31) OPTIONAL -- Need S
+ ]]
+}
+
+-- TAG-NZP-CSI-RS-RESOURCESET-STOP
+-- TAG-NZP-CSI-RS-RESOURCESETID-START
+
+NZP-CSI-RS-ResourceSetId ::= INTEGER (0..maxNrofNZP-CSI-RS-ResourceSets-1)
+
+-- TAG-NZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-P-MAX-START
+
+P-Max ::= INTEGER (-30..33)
+
+-- TAG-P-MAX-STOP
+-- TAG-PCI-LIST-START
+
+PCI-List ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF PhysCellId
+
+-- TAG-PCI-LIST-STOP
+-- TAG-PCI-RANGE-START
+
+PCI-Range ::= SEQUENCE {
+ start PhysCellId,
+ range ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84,
+ n96, n128, n168, n252, n504, n1008,spare1} OPTIONAL -- Need S
+}
+
+-- TAG-PCI-RANGE-STOP
+-- TAG-PCI-RANGEELEMENT-START
+
+PCI-RangeElement ::= SEQUENCE {
+ pci-RangeIndex PCI-RangeIndex,
+ pci-Range PCI-Range
+}
+
+-- TAG-PCI-RANGEELEMENT-STOP
+-- TAG-PCI-RANGEINDEX-START
+
+PCI-RangeIndex ::= INTEGER (1..maxNrofPCI-Ranges)
+
+-- TAG-PCI-RANGEINDEX-STOP
+-- TAG-PCI-RANGEINDEXLIST-START
+
+PCI-RangeIndexList ::= SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeIndex
+
+-- TAG-PCI-RANGEINDEXLIST-STOP
+-- TAG-PDCCH-CONFIG-START
+
+PDCCH-Config ::= SEQUENCE {
+ controlResourceSetToAddModList SEQUENCE(SIZE (1..3)) OF ControlResourceSet OPTIONAL, -- Need N
+ controlResourceSetToReleaseList SEQUENCE(SIZE (1..3)) OF ControlResourceSetId OPTIONAL, -- Need N
+ searchSpacesToAddModList SEQUENCE(SIZE (1..10)) OF SearchSpace OPTIONAL, -- Need N
+ searchSpacesToReleaseList SEQUENCE(SIZE (1..10)) OF SearchSpaceId OPTIONAL, -- Need N
+ downlinkPreemption SetupRelease { DownlinkPreemption } OPTIONAL, -- Need M
+ tpc-PUSCH SetupRelease { PUSCH-TPC-CommandConfig } OPTIONAL, -- Need M
+ tpc-PUCCH SetupRelease { PUCCH-TPC-CommandConfig } OPTIONAL, -- Need M
+ tpc-SRS SetupRelease { SRS-TPC-CommandConfig} OPTIONAL, -- Need M
+ ...,
+ [[
+ controlResourceSetToAddModList2-r16 SEQUENCE (SIZE (1..2)) OF ControlResourceSet OPTIONAL, -- Need N
+ controlResourceSetToReleaseList-r16 SEQUENCE (SIZE (1..5)) OF ControlResourceSetId-r16 OPTIONAL, -- Need N
+ searchSpacesToAddModListExt-r16 SEQUENCE(SIZE (1..10)) OF SearchSpaceExt-r16 OPTIONAL, -- Need N
+ searchSpaceSwitchingTimer-r16 INTEGER (1..80) OPTIONAL, -- Need R
+ cellGroupsForSwitchingList-r16 SEQUENCE(SIZE (1..4)) OF CellGroupForSwitching-r16 OPTIONAL, -- Need R
+ uplinkCancellation-r16 SetupRelease { UplinkCancellation-r16 } OPTIONAL, -- Need M
+ monitoringCapabilityConfig-r16 ENUMERATED { r15monitoringcapability,r16monitoringcapability } OPTIONAL, -- Need M
+ searchSpaceSwitchingDelay-r16 INTEGER (10..52) OPTIONAL -- Need R
+ ]]
+}
+
+CellGroupForSwitching-r16 ::= SEQUENCE(SIZE (1..16)) OF ServCellIndex
+
+-- TAG-PDCCH-CONFIG-STOP
+-- TAG-PDCCH-CONFIGCOMMON-START
+
+PDCCH-ConfigCommon ::= SEQUENCE {
+ controlResourceSetZero ControlResourceSetZero OPTIONAL, -- Cond InitialBWP-Only
+ commonControlResourceSet ControlResourceSet OPTIONAL, -- Need R
+ searchSpaceZero SearchSpaceZero OPTIONAL, -- Cond InitialBWP-Only
+ commonSearchSpaceList SEQUENCE (SIZE(1..4)) OF SearchSpace OPTIONAL, -- Need R
+ searchSpaceSIB1 SearchSpaceId OPTIONAL, -- Need S
+ searchSpaceOtherSystemInformation SearchSpaceId OPTIONAL, -- Need S
+ pagingSearchSpace SearchSpaceId OPTIONAL, -- Need S
+ ra-SearchSpace SearchSpaceId OPTIONAL, -- Need S
+ ...,
+ [[
+ firstPDCCH-MonitoringOccasionOfPO CHOICE {
+ sCS15KHZoneT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+ sCS30KHZoneT-SCS15KHZhalfT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+ sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+ sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+ sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+ sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+ sCS120KHZoneEighthT-SCS60KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+ sCS120KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+ } OPTIONAL, -- Cond OtherBWP
+ commonSearchSpaceListExt-r16 SEQUENCE (SIZE(1..4)) OF SearchSpaceExt-r16 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-PDCCH-CONFIGCOMMON-STOP
+-- TAG-PDCCH-CONFIGSIB1-START
+
+PDCCH-ConfigSIB1 ::= SEQUENCE {
+ controlResourceSetZero ControlResourceSetZero,
+ searchSpaceZero SearchSpaceZero
+}
+
+-- TAG-PDCCH-CONFIGSIB1-STOP
+-- TAG-PDCCH-SERVINGCELLCONFIG-START
+
+PDCCH-ServingCellConfig ::= SEQUENCE {
+ slotFormatIndicator SetupRelease { SlotFormatIndicator } OPTIONAL, -- Need M
+ ...,
+ [[
+ availabilityIndicator-r16 SetupRelease {AvailabilityIndicator-r16} OPTIONAL, -- Need M
+ searchSpaceSwitchingTimer-r16 INTEGER (1..80) OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-PDCCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDCP-CONFIG-START
+
+PDCP-Config ::= SEQUENCE {
+ drb SEQUENCE {
+ discardTimer ENUMERATED {ms10, ms20, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+ ms250, ms300, ms500, ms750, ms1500, infinity} OPTIONAL, -- Cond Setup
+ pdcp-SN-SizeUL ENUMERATED {len12bits, len18bits} OPTIONAL, -- Cond Setup2
+ pdcp-SN-SizeDL ENUMERATED {len12bits, len18bits} OPTIONAL, -- Cond Setup2
+ headerCompression CHOICE {
+ notUsed NULL,
+ rohc SEQUENCE {
+ maxCID INTEGER (1..16383) DEFAULT 15,
+ profiles SEQUENCE {
+ profile0x0001 BOOLEAN,
+ profile0x0002 BOOLEAN,
+ profile0x0003 BOOLEAN,
+ profile0x0004 BOOLEAN,
+ profile0x0006 BOOLEAN,
+ profile0x0101 BOOLEAN,
+ profile0x0102 BOOLEAN,
+ profile0x0103 BOOLEAN,
+ profile0x0104 BOOLEAN
+ },
+ drb-ContinueROHC ENUMERATED { true } OPTIONAL -- Need N
+ },
+ uplinkOnlyROHC SEQUENCE {
+ maxCID INTEGER (1..16383) DEFAULT 15,
+ profiles SEQUENCE {
+ profile0x0006 BOOLEAN
+ },
+ drb-ContinueROHC ENUMERATED { true } OPTIONAL -- Need N
+ },
+ ...
+ },
+ integrityProtection ENUMERATED { enabled } OPTIONAL, -- Cond ConnectedTo5GC1
+ statusReportRequired ENUMERATED { true } OPTIONAL, -- Cond Rlc-AM-UM
+ outOfOrderDelivery ENUMERATED { true } OPTIONAL -- Need R
+ } OPTIONAL, -- Cond DRB
+ moreThanOneRLC SEQUENCE {
+ primaryPath SEQUENCE {
+ cellGroup CellGroupId OPTIONAL, -- Need R
+ logicalChannel LogicalChannelIdentity OPTIONAL -- Need R
+ },
+ ul-DataSplitThreshold UL-DataSplitThreshold OPTIONAL, -- Cond SplitBearer
+ pdcp-Duplication BOOLEAN OPTIONAL -- Need R
+ } OPTIONAL, -- Cond MoreThanOneRLC
+
+ t-Reordering ENUMERATED {
+ ms0, ms1, ms2, ms4, ms5, ms8, ms10, ms15, ms20, ms30, ms40,
+ ms50, ms60, ms80, ms100, ms120, ms140, ms160, ms180, ms200, ms220,
+ ms240, ms260, ms280, ms300, ms500, ms750, ms1000, ms1250,
+ ms1500, ms1750, ms2000, ms2250, ms2500, ms2750,
+ ms3000, spare28, spare27, spare26, spare25, spare24,
+ spare23, spare22, spare21, spare20,
+ spare19, spare18, spare17, spare16, spare15, spare14,
+ spare13, spare12, spare11, spare10, spare09,
+ spare08, spare07, spare06, spare05, spare04, spare03,
+ spare02, spare01 } OPTIONAL, -- Need S
+ ...,
+ [[
+ cipheringDisabled ENUMERATED {true} OPTIONAL -- Cond ConnectedTo5GC
+ ]],
+ [[
+ discardTimerExt-r16 SetupRelease { DiscardTimerExt-r16 } OPTIONAL, -- Cond DRB2
+ moreThanTwoRLC-DRB-r16 SEQUENCE {
+ splitSecondaryPath LogicalChannelIdentity OPTIONAL, -- Cond SplitBearer2
+ duplicationState SEQUENCE (SIZE (3)) OF BOOLEAN OPTIONAL -- Need S
+ } OPTIONAL, -- Cond MoreThanTwoRLC-DRB
+ ethernetHeaderCompression-r16 SetupRelease { EthernetHeaderCompression-r16 } OPTIONAL -- Need M
+ ]]
+}
+
+EthernetHeaderCompression-r16 ::= SEQUENCE {
+ ehc-Common SEQUENCE {
+ ehc-CID-Length ENUMERATED { bits7, bits15 },
+ ...
+ },
+ ehc-Downlink SEQUENCE {
+ drb-ContinueEHC-DL ENUMERATED { true } OPTIONAL, -- Need R
+ ...
+ } OPTIONAL, -- Need M
+ ehc-Uplink SEQUENCE {
+ maxCID-EHC-UL INTEGER (1..32767),
+ drb-ContinueEHC-UL ENUMERATED { true } OPTIONAL, -- Need R
+ ...
+ } OPTIONAL -- Need M
+}
+
+UL-DataSplitThreshold ::= ENUMERATED {
+ b0, b100, b200, b400, b800, b1600, b3200, b6400, b12800, b25600, b51200, b102400, b204800,
+ b409600, b819200, b1228800, b1638400, b2457600, b3276800, b4096000, b4915200, b5734400,
+ b6553600, infinity, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+
+DiscardTimerExt-r16 ::= ENUMERATED {ms0dot5, ms1, ms2, ms4, ms6, ms8, spare2, spare1}
+
+-- TAG-PDCP-CONFIG-STOP
+-- TAG-PDSCH-CONFIG-START
+
+PDSCH-Config ::= SEQUENCE {
+ dataScramblingIdentityPDSCH INTEGER (0..1023) OPTIONAL, -- Need S
+ dmrs-DownlinkForPDSCH-MappingTypeA SetupRelease { DMRS-DownlinkConfig } OPTIONAL, -- Need M
+ dmrs-DownlinkForPDSCH-MappingTypeB SetupRelease { DMRS-DownlinkConfig } OPTIONAL, -- Need M
+
+ tci-StatesToAddModList SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-State OPTIONAL, -- Need N
+ tci-StatesToReleaseList SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-StateId OPTIONAL, -- Need N
+ vrb-ToPRB-Interleaver ENUMERATED {n2, n4} OPTIONAL, -- Need S
+ resourceAllocation ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+ pdsch-TimeDomainAllocationList SetupRelease { PDSCH-TimeDomainResourceAllocationList } OPTIONAL, -- Need M
+ pdsch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL, -- Need S
+ rateMatchPatternToAddModList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern OPTIONAL, -- Need N
+ rateMatchPatternToReleaseList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL, -- Need N
+ rateMatchPatternGroup1 RateMatchPatternGroup OPTIONAL, -- Need R
+ rateMatchPatternGroup2 RateMatchPatternGroup OPTIONAL, -- Need R
+
+ rbg-Size ENUMERATED {config1, config2},
+ mcs-Table ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ maxNrofCodeWordsScheduledByDCI ENUMERATED {n1, n2} OPTIONAL, -- Need R
+
+ prb-BundlingType CHOICE {
+ staticBundling SEQUENCE {
+ bundleSize ENUMERATED { n4, wideband } OPTIONAL -- Need S
+ },
+ dynamicBundling SEQUENCE {
+ bundleSizeSet1 ENUMERATED { n4, wideband, n2-wideband, n4-wideband } OPTIONAL, -- Need S
+ bundleSizeSet2 ENUMERATED { n4, wideband } OPTIONAL -- Need S
+ }
+ },
+ zp-CSI-RS-ResourceToAddModList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-Resource
+ OPTIONAL, -- Need N
+ zp-CSI-RS-ResourceToReleaseList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-ResourceId
+ OPTIONAL, -- Need N
+ aperiodic-ZP-CSI-RS-ResourceSetsToAddModList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+ OPTIONAL, -- Need N
+ aperiodic-ZP-CSI-RS-ResourceSetsToReleaseList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+ OPTIONAL, -- Need N
+ sp-ZP-CSI-RS-ResourceSetsToAddModList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+ OPTIONAL, -- Need N
+ sp-ZP-CSI-RS-ResourceSetsToReleaseList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+ OPTIONAL, -- Need N
+ p-ZP-CSI-RS-ResourceSet SetupRelease { ZP-CSI-RS-ResourceSet }
+ OPTIONAL, -- Need M
+ ...,
+ [[
+ maxMIMO-Layers-r16 SetupRelease { MaxMIMO-LayersDL-r16 } OPTIONAL, -- Need M
+ minimumSchedulingOffsetK0-r16 SetupRelease { MinSchedulingOffsetK0-Values-r16 } OPTIONAL, -- Need M
+
+ -- Start of the parameters for DCI format 1_2 introduced in V16.1.0
+ antennaPortsFieldPresenceForDCI-Format1-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ aperiodicZP-CSI-RS-ResourceSetsToAddModListForDCI-Format1-2-r16 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+ OPTIONAL, -- Need N
+ aperiodicZP-CSI-RS-ResourceSetsToReleaseListForDCI-Format1-2-r16 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+ OPTIONAL, -- Need N
+ dmrs-DownlinkForPDSCH-MappingTypeA-ForDCI-Format1-2-r16 SetupRelease { DMRS-DownlinkConfig } OPTIONAL, -- Need M
+ dmrs-DownlinkForPDSCH-MappingTypeB-ForDCI-Format1-2-r16 SetupRelease { DMRS-DownlinkConfig } OPTIONAL, -- Need M
+ dmrs-SequenceInitializationForDCI-Format1-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ harq-ProcessNumberSizeForDCI-Format1-2-r16 INTEGER (0..4) OPTIONAL, -- Need R
+ mcs-TableForDCI-Format1-2-r16 ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ numberOfBitsForRV-ForDCI-Format1-2-r16 INTEGER (0..2) OPTIONAL, -- Need R
+ pdsch-TimeDomainAllocationListForDCI-Format1-2-r16 SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 }
+ OPTIONAL, -- Need M
+ prb-BundlingTypeForDCI-Format1-2-r16 CHOICE {
+ staticBundling-r16 SEQUENCE {
+ bundleSize-r16 ENUMERATED { n4, wideband } OPTIONAL -- Need S
+ },
+ dynamicBundling-r16 SEQUENCE {
+ bundleSizeSet1-r16 ENUMERATED { n4, wideband, n2-wideband, n4-wideband } OPTIONAL, -- Need S
+ bundleSizeSet2-r16 ENUMERATED { n4, wideband } OPTIONAL -- Need S
+ }
+ } OPTIONAL, -- Need R
+ priorityIndicatorForDCI-Format1-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ rateMatchPatternGroup1ForDCI-Format1-2-r16 RateMatchPatternGroup OPTIONAL, -- Need R
+ rateMatchPatternGroup2ForDCI-Format1-2-r16 RateMatchPatternGroup OPTIONAL, -- Need R
+ resourceAllocationType1GranularityForDCI-Format1-2-r16 ENUMERATED {n2,n4,n8,n16} OPTIONAL, -- Need S
+ vrb-ToPRB-InterleaverForDCI-Format1-2-r16 ENUMERATED {n2, n4} OPTIONAL, -- Need S
+ referenceOfSLIVForDCI-Format1-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ resourceAllocationForDCI-Format1-2-r16 ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+ OPTIONAL, -- Need M
+ -- End of the parameters for DCI format 1_2 introduced in V16.1.0
+
+ priorityIndicatorForDCI-Format1-1-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ dataScramblingIdentityPDSCH2-r16 INTEGER (0..1023) OPTIONAL, -- Need R
+ pdsch-TimeDomainAllocationList-r16 SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 } OPTIONAL, -- Need M
+ repetitionSchemeConfig-r16 SetupRelease { RepetitionSchemeConfig-r16} OPTIONAL -- Need M
+ ]]
+}
+
+RateMatchPatternGroup ::= SEQUENCE (SIZE (1..maxNrofRateMatchPatternsPerGroup)) OF CHOICE {
+ cellLevel RateMatchPatternId,
+ bwpLevel RateMatchPatternId
+}
+
+MinSchedulingOffsetK0-Values-r16 ::= SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK0-SchedulingOffset-r16)
+
+MaxMIMO-LayersDL-r16 ::= INTEGER (1..8)
+
+-- TAG-PDSCH-CONFIG-STOP
+-- TAG-PDSCH-CONFIGCOMMON-START
+
+PDSCH-ConfigCommon ::= SEQUENCE {
+ pdsch-TimeDomainAllocationList PDSCH-TimeDomainResourceAllocationList OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-PDSCH-CONFIGCOMMON-STOP
+-- TAG-PDSCH-SERVINGCELLCONFIG-START
+
+PDSCH-ServingCellConfig ::= SEQUENCE {
+ codeBlockGroupTransmission SetupRelease { PDSCH-CodeBlockGroupTransmission } OPTIONAL, -- Need M
+ xOverhead ENUMERATED { xOh6, xOh12, xOh18 } OPTIONAL, -- Need S
+ nrofHARQ-ProcessesForPDSCH ENUMERATED {n2, n4, n6, n10, n12, n16} OPTIONAL, -- Need S
+ pucch-Cell ServCellIndex OPTIONAL, -- Cond SCellAddOnly
+ ...,
+ [[
+ maxMIMO-Layers INTEGER (1..8) OPTIONAL, -- Need M
+ processingType2Enabled BOOLEAN OPTIONAL -- Need M
+ ]],
+ [[
+ pdsch-CodeBlockGroupTransmissionList-r16 SetupRelease { PDSCH-CodeBlockGroupTransmissionList-r16 } OPTIONAL -- Need M
+ ]]
+}
+
+PDSCH-CodeBlockGroupTransmission ::= SEQUENCE {
+ maxCodeBlockGroupsPerTransportBlock ENUMERATED {n2, n4, n6, n8},
+ codeBlockGroupFlushIndicator BOOLEAN,
+ ...
+}
+
+PDSCH-CodeBlockGroupTransmissionList-r16 ::= SEQUENCE (SIZE (1..2)) OF PDSCH-CodeBlockGroupTransmission
+
+-- TAG-PDSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+
+PDSCH-TimeDomainResourceAllocationList ::= SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation
+
+PDSCH-TimeDomainResourceAllocation ::= SEQUENCE {
+ k0 INTEGER(0..32) OPTIONAL, -- Need S
+ mappingType ENUMERATED {typeA, typeB},
+ startSymbolAndLength INTEGER (0..127)
+}
+
+PDSCH-TimeDomainResourceAllocationList-r16 ::= SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation-r16
+
+PDSCH-TimeDomainResourceAllocation-r16 ::= SEQUENCE {
+ k0-r16 INTEGER(0..32) OPTIONAL, -- Need S
+ mappingType-r16 ENUMERATED {typeA, typeB},
+ startSymbolAndLength-r16 INTEGER (0..127),
+ repetitionNumber-r16 ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16} OPTIONAL, -- Cond Formats1-0and1-1
+ ...
+}
+
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PHR-CONFIG-START
+
+PHR-Config ::= SEQUENCE {
+ phr-PeriodicTimer ENUMERATED {sf10, sf20, sf50, sf100, sf200,sf500, sf1000, infinity},
+ phr-ProhibitTimer ENUMERATED {sf0, sf10, sf20, sf50, sf100,sf200, sf500, sf1000},
+ phr-Tx-PowerFactorChange ENUMERATED {dB1, dB3, dB6, infinity},
+ multiplePHR BOOLEAN,
+ dummy BOOLEAN,
+ phr-Type2OtherCell BOOLEAN,
+ phr-ModeOtherCG ENUMERATED {real, virtual},
+ ...
+}
+
+-- TAG-PHR-CONFIG-STOP
+-- TAG-PHYSCELLID-START
+
+PhysCellId ::= INTEGER (0..1007)
+
+-- TAG-PHYSCELLID-STOP
+-- TAG-PHYSICALCELLGROUPCONFIG-START
+
+PhysicalCellGroupConfig ::= SEQUENCE {
+ harq-ACK-SpatialBundlingPUCCH ENUMERATED {true} OPTIONAL, -- Need S
+ harq-ACK-SpatialBundlingPUSCH ENUMERATED {true} OPTIONAL, -- Need S
+ p-NR-FR1 P-Max OPTIONAL, -- Need R
+ pdsch-HARQ-ACK-Codebook ENUMERATED {semiStatic, dynamic},
+ tpc-SRS-RNTI RNTI-Value OPTIONAL, -- Need R
+ tpc-PUCCH-RNTI RNTI-Value OPTIONAL, -- Need R
+ tpc-PUSCH-RNTI RNTI-Value OPTIONAL, -- Need R
+ sp-CSI-RNTI RNTI-Value OPTIONAL, -- Need R
+ cs-RNTI SetupRelease { RNTI-Value } OPTIONAL, -- Need M
+ ...,
+ [[
+ mcs-C-RNTI RNTI-Value OPTIONAL, -- Need R
+ p-UE-FR1 P-Max OPTIONAL -- Cond MCG-Only
+ ]],
+ [[
+ xScale ENUMERATED {dB0, dB6, spare2, spare1} OPTIONAL -- Cond SCG-Only
+ ]],
+ [[
+ pdcch-BlindDetection SetupRelease { PDCCH-BlindDetection } OPTIONAL -- Need M
+ ]],
+ [[
+ dcp-Config-r16 SetupRelease { DCP-Config-r16 } OPTIONAL, -- Need M
+ harq-ACK-SpatialBundlingPUCCH-secondaryPUCCH-group-r16 ENUMERATED {true} OPTIONAL, -- Cond twoPUCCHgroup
+ harq-ACK-SpatialBundlingPUSCH-secondaryPUCCH-group-r16 ENUMERATED {true} OPTIONAL, -- Cond twoPUCCHgroup
+ pdsch-HARQ-ACK-Codebook-secondaryPUCCH-group-r16 ENUMERATED {semiStatic, dynamic} OPTIONAL, -- Cond twoPUCCHgroup
+ p-NR-FR2-r16 P-Max OPTIONAL, -- Need R
+ p-UE-FR2-r16 P-Max OPTIONAL, -- Cond MCG-Only
+ nrdc-PCmode-FR1-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic} OPTIONAL, -- Cond MCG-Only
+ nrdc-PCmode-FR2-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic} OPTIONAL, -- Cond MCG-Only
+ pdsch-HARQ-ACK-Codebook-r16 ENUMERATED {enhancedDynamic} OPTIONAL, -- Need R
+ nfi-TotalDAI-Included-r16 ENUMERATED {true} OPTIONAL, -- Need M
+ ul-TotalDAI-Included-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ pdsch-HARQ-ACK-OneShotFeedback-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ pdsch-HARQ-ACK-OneShotFeedbackNDI-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ pdsch-HARQ-ACK-OneShotFeedbackCBG-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ downlinkAssignmentIndexForDCI-Format0-2-r16 ENUMERATED { enabled } OPTIONAL, -- Need S
+ downlinkAssignmentIndexForDCI-Format1-2-r16 ENUMERATED {n1, n2, n4} OPTIONAL, -- Need S
+ pdsch-HARQ-ACK-CodebookList-r16 SetupRelease {PDSCH-HARQ-ACK-CodebookList-r16} OPTIONAL, -- Need M
+ ackNackFeedbackMode-r16 ENUMERATED {joint, separate} OPTIONAL, -- Need R
+ pdcch-BlindDetectionCA-CombIndicator-r16 SetupRelease { PDCCH-BlindDetectionCA-CombIndicator-r16 } OPTIONAL, -- Need M
+ pdcch-BlindDetection2-r16 SetupRelease { PDCCH-BlindDetection2-r16 } OPTIONAL, -- Need M
+ pdcch-BlindDetection3-r16 SetupRelease { PDCCH-BlindDetection3-r16 } OPTIONAL, -- Need M
+ bdFactorR-r16 ENUMERATED {n1} OPTIONAL -- Need R
+ ]]
+}
+
+PDCCH-BlindDetection ::= INTEGER (1..15)
+
+DCP-Config-r16 ::= SEQUENCE {
+ ps-RNTI-r16 RNTI-Value,
+ ps-Offset-r16 INTEGER (1..120),
+ sizeDCI-2-6-r16 INTEGER (1..maxDCI-2-6-Size-r16),
+ ps-PositionDCI-2-6-r16 INTEGER (0..maxDCI-2-6-Size-1-r16),
+ ps-WakeUp-r16 ENUMERATED {true} OPTIONAL, -- Need S
+ ps-TransmitPeriodicL1-RSRP-r16 ENUMERATED {true} OPTIONAL, -- Need S
+ ps-TransmitOtherPeriodicCSI-r16 ENUMERATED {true} OPTIONAL -- Need S
+}
+
+PDSCH-HARQ-ACK-CodebookList-r16 ::= SEQUENCE (SIZE (1..2)) OF ENUMERATED {semiStatic, dynamic}
+
+PDCCH-BlindDetectionCA-CombIndicator-r16 ::= SEQUENCE {
+ pdcch-BlindDetectionCA1-r16 INTEGER (1..15),
+ pdcch-BlindDetectionCA2-r16 INTEGER (1..15)
+}
+
+PDCCH-BlindDetection2-r16 ::= INTEGER (1..15)
+
+PDCCH-BlindDetection3-r16 ::= INTEGER (1..15)
+
+-- TAG-PHYSICALCELLGROUPCONFIG-STOP
+-- TAG-PLMN-IDENTITY-START
+
+PLMN-Identity ::= SEQUENCE {
+ mcc MCC OPTIONAL, -- Cond MCC
+ mnc MNC
+}
+
+MCC ::= SEQUENCE (SIZE (3)) OF MCC-MNC-Digit
+
+MNC ::= SEQUENCE (SIZE (2..3)) OF MCC-MNC-Digit
+
+MCC-MNC-Digit ::= INTEGER (0..9)
+
+
+-- TAG-PLMN-IDENTITY-STOP
+-- TAG-PLMN-IDENTITYINFOLIST-START
+
+PLMN-IdentityInfoList ::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-IdentityInfo
+
+PLMN-IdentityInfo ::= SEQUENCE {
+ plmn-IdentityList SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity,
+ trackingAreaCode TrackingAreaCode OPTIONAL, -- Need R
+ ranac RAN-AreaCode OPTIONAL, -- Need R
+ cellIdentity CellIdentity,
+ cellReservedForOperatorUse ENUMERATED {reserved, notReserved},
+ ...,
+ [[
+ iab-Support-r16 ENUMERATED {true} OPTIONAL -- Need S
+ ]]
+}
+-- TAG-PLMN-IDENTITYINFOLIST-STOP
+-- TAG-PLMNIDENTITYLIST2-START
+
+PLMN-IdentityList2-r16 ::= SEQUENCE (SIZE (1..16)) OF PLMN-Identity
+
+-- TAG-PLMNIDENTITYLIST2-STOP
+-- TAG-PRB-ID-START
+
+PRB-Id ::= INTEGER (0..maxNrofPhysicalResourceBlocks-1)
+
+-- TAG-PRB-ID-STOP
+-- TAG-PTRS-DOWNLINKCONFIG-START
+
+PTRS-DownlinkConfig ::= SEQUENCE {
+ frequencyDensity SEQUENCE (SIZE (2)) OF INTEGER (1..276) OPTIONAL, -- Need S
+ timeDensity SEQUENCE (SIZE (3)) OF INTEGER (0..29) OPTIONAL, -- Need S
+ epre-Ratio INTEGER (0..3) OPTIONAL, -- Need S
+ resourceElementOffset ENUMERATED { offset01, offset10, offset11 } OPTIONAL, -- Need S
+ ...,
+ [[
+ maxNrofPorts-r16 ENUMERATED {n1, n2} OPTIONAL -- Need R
+ ]]
+
+}
+
+-- TAG-PTRS-DOWNLINKCONFIG-STOP
+-- TAG-PTRS-UPLINKCONFIG-START
+
+PTRS-UplinkConfig ::= SEQUENCE {
+ transformPrecoderDisabled SEQUENCE {
+ frequencyDensity SEQUENCE (SIZE (2)) OF INTEGER (1..276) OPTIONAL, -- Need S
+ timeDensity SEQUENCE (SIZE (3)) OF INTEGER (0..29) OPTIONAL, -- Need S
+ maxNrofPorts ENUMERATED {n1, n2},
+ resourceElementOffset ENUMERATED {offset01, offset10, offset11 } OPTIONAL, -- Need S
+ ptrs-Power ENUMERATED {p00, p01, p10, p11}
+ } OPTIONAL, -- Need R
+ transformPrecoderEnabled SEQUENCE {
+ sampleDensity SEQUENCE (SIZE (5)) OF INTEGER (1..276),
+ timeDensityTransformPrecoding ENUMERATED {d2} OPTIONAL -- Need S
+ } OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-PTRS-UPLINKCONFIG-STOP
+-- TAG-PUCCH-CONFIG-START
+
+PUCCH-Config ::= SEQUENCE {
+ resourceSetToAddModList SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSet OPTIONAL, -- Need N
+ resourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSetId OPTIONAL, -- Need N
+ resourceToAddModList SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-Resource OPTIONAL, -- Need N
+ resourceToReleaseList SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceId OPTIONAL, -- Need N
+ format1 SetupRelease { PUCCH-FormatConfig } OPTIONAL, -- Need M
+ format2 SetupRelease { PUCCH-FormatConfig } OPTIONAL, -- Need M
+ format3 SetupRelease { PUCCH-FormatConfig } OPTIONAL, -- Need M
+ format4 SetupRelease { PUCCH-FormatConfig } OPTIONAL, -- Need M
+ schedulingRequestResourceToAddModList SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfig
+ OPTIONAL, -- Need N
+ schedulingRequestResourceToReleaseList SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceId
+ OPTIONAL, -- Need N
+ multi-CSI-PUCCH-ResourceList SEQUENCE (SIZE (1..2)) OF PUCCH-ResourceId OPTIONAL, -- Need M
+ dl-DataToUL-ACK SEQUENCE (SIZE (1..8)) OF INTEGER (0..15) OPTIONAL, -- Need M
+ spatialRelationInfoToAddModList SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfo
+ OPTIONAL, -- Need N
+ spatialRelationInfoToReleaseList SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfoId
+ OPTIONAL, -- Need N
+ pucch-PowerControl PUCCH-PowerControl OPTIONAL, -- Need M
+ ...,
+ [[
+ resourceToAddModListExt-r16 SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceExt-r16 OPTIONAL, -- Need N
+ dl-DataToUL-ACK-r16 SetupRelease { DL-DataToUL-ACK-r16 } OPTIONAL, -- Need M
+ ul-AccessConfigListForDCI-Format-1-1-r16 SetupRelease { UL-AccessConfigListForDCI-Format1-1-r16 } OPTIONAL, -- Need M
+ subslotLengthForPUCCH-r16 CHOICE {
+ normalCP-r16 ENUMERATED {n2,n7},
+ extendedCP-r16 ENUMERATED {n2,n6}
+ } OPTIONAL, -- Need R
+ dl-DataToUL-ACK-ForDCI-Format1-2-r16 SetupRelease { DL-DataToUL-ACK-ForDCI-Format1-2-r16} OPTIONAL, -- Need M
+ numberOfBitsForPUCCH-ResourceIndicatorForDCI-Format1-2-r16 INTEGER (0..3) OPTIONAL, -- Need R
+ dmrs-UplinkTransformPrecodingPUCCH-r16 ENUMERATED {enabled} OPTIONAL, -- Cond PI2-BPSK
+ spatialRelationInfoToAddModList2-r16 SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfo
+ OPTIONAL, -- Need N
+ spatialRelationInfoToReleaseList2-r16 SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfoId
+ OPTIONAL, -- Need N
+ spatialRelationInfoToAddModListExt-r16 SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF PUCCH-SpatialRelationInfoExt-r16
+ OPTIONAL, -- Need N
+ spatialRelationInfoToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF PUCCH-SpatialRelationInfoId-r16 OPTIONAL, -- Need N
+ resourceGroupToAddModList-r16 SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroup-r16
+ OPTIONAL, -- Need N
+ resourceGroupToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroupId-r16
+ OPTIONAL, -- Need N
+ sps-PUCCH-AN-List-r16 SetupRelease { SPS-PUCCH-AN-List-r16 } OPTIONAL, -- Need M
+ schedulingRequestResourceToAddModList-v1610 SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfig-v1610
+ OPTIONAL -- Need N
+ ]]
+}
+
+PUCCH-FormatConfig ::= SEQUENCE {
+ interslotFrequencyHopping ENUMERATED {enabled} OPTIONAL, -- Need R
+ additionalDMRS ENUMERATED {true} OPTIONAL, -- Need R
+ maxCodeRate PUCCH-MaxCodeRate OPTIONAL, -- Need R
+ nrofSlots ENUMERATED {n2,n4,n8} OPTIONAL, -- Need S
+ pi2BPSK ENUMERATED {enabled} OPTIONAL, -- Need R
+ simultaneousHARQ-ACK-CSI ENUMERATED {true} OPTIONAL -- Need R
+}
+
+PUCCH-MaxCodeRate ::= ENUMERATED {zeroDot08, zeroDot15, zeroDot25, zeroDot35, zeroDot45, zeroDot60, zeroDot80}
+
+-- A set with one or more PUCCH resources
+PUCCH-ResourceSet ::= SEQUENCE {
+ pucch-ResourceSetId PUCCH-ResourceSetId,
+ resourceList SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerSet)) OF PUCCH-ResourceId,
+ maxPayloadSize INTEGER (4..256) OPTIONAL -- Need R
+}
+
+PUCCH-ResourceSetId ::= INTEGER (0..maxNrofPUCCH-ResourceSets-1)
+
+PUCCH-Resource ::= SEQUENCE {
+ pucch-ResourceId PUCCH-ResourceId,
+ startingPRB PRB-Id,
+ intraSlotFrequencyHopping ENUMERATED { enabled } OPTIONAL, -- Need R
+ secondHopPRB PRB-Id OPTIONAL, -- Need R
+ format CHOICE {
+ format0 PUCCH-format0,
+ format1 PUCCH-format1,
+ format2 PUCCH-format2,
+ format3 PUCCH-format3,
+ format4 PUCCH-format4
+ }
+}
+
+PUCCH-ResourceExt-r16 ::= SEQUENCE {
+ interlaceAllocation-r16 SEQUENCE {
+ rb-SetIndex INTEGER (0..4),
+ interlace0 CHOICE {
+ scs15 INTEGER (0..9),
+ scs30 INTEGER (0..4)
+ }
+ } OPTIONAL, --Need R
+ formatExt-v1610 CHOICE {
+ interlace1-v1610 INTEGER (0..9),
+ occ-v1610 SEQUENCE {
+ occ-Length-v1610 ENUMERATED {n2,n4} OPTIONAL, -- Need M
+ occ-Index-v1610 ENUMERATED {n0,n1,n2,n3} OPTIONAL -- Need M
+ }
+ } OPTIONAL, -- Need R
+ ...
+}
+
+PUCCH-ResourceId ::= INTEGER (0..maxNrofPUCCH-Resources-1)
+
+
+PUCCH-format0 ::= SEQUENCE {
+ initialCyclicShift INTEGER(0..11),
+ nrofSymbols INTEGER (1..2),
+ startingSymbolIndex INTEGER(0..13)
+}
+
+PUCCH-format1 ::= SEQUENCE {
+ initialCyclicShift INTEGER(0..11),
+ nrofSymbols INTEGER (4..14),
+ startingSymbolIndex INTEGER(0..10),
+ timeDomainOCC INTEGER(0..6)
+}
+
+PUCCH-format2 ::= SEQUENCE {
+ nrofPRBs INTEGER (1..16),
+ nrofSymbols INTEGER (1..2),
+ startingSymbolIndex INTEGER(0..13)
+}
+
+PUCCH-format3 ::= SEQUENCE {
+ nrofPRBs INTEGER (1..16),
+ nrofSymbols INTEGER (4..14),
+ startingSymbolIndex INTEGER(0..10)
+}
+
+PUCCH-format4 ::= SEQUENCE {
+ nrofSymbols INTEGER (4..14),
+ occ-Length ENUMERATED {n2,n4},
+ occ-Index ENUMERATED {n0,n1,n2,n3},
+ startingSymbolIndex INTEGER(0..10)
+}
+
+PUCCH-ResourceGroup-r16 ::= SEQUENCE {
+ pucch-ResourceGroupId-r16 PUCCH-ResourceGroupId-r16,
+ resourcePerGroupList-r16 SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerGroup-r16)) OF PUCCH-ResourceId
+}
+
+PUCCH-ResourceGroupId-r16 ::= INTEGER (0..maxNrofPUCCH-ResourceGroups-1-r16)
+
+DL-DataToUL-ACK-r16 ::= SEQUENCE (SIZE (1..8)) OF INTEGER (-1..15)
+
+DL-DataToUL-ACK-ForDCI-Format1-2-r16 ::= SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)
+
+UL-AccessConfigListForDCI-Format1-1-r16 ::= SEQUENCE (SIZE (1..16)) OF INTEGER (0..15)
+
+-- TAG-PUCCH-CONFIG-STOP
+-- TAG-PUCCH-CONFIGCOMMON-START
+
+PUCCH-ConfigCommon ::= SEQUENCE {
+ pucch-ResourceCommon INTEGER (0..15) OPTIONAL, -- Cond InitialBWP-Only
+ pucch-GroupHopping ENUMERATED { neither, enable, disable },
+ hoppingId INTEGER (0..1023) OPTIONAL, -- Need R
+ p0-nominal INTEGER (-202..24) OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-PUCCH-CONFIGCOMMON-STOP
+-- TAG-PUCCH-CONFIGURATIONLIST-START
+
+PUCCH-ConfigurationList-r16 ::= SEQUENCE (SIZE (1..2)) OF PUCCH-Config
+
+-- TAG-PUCCH-CONFIGURATIONLIST-STOP
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-START
+
+PUCCH-PathlossReferenceRS-Id ::= INTEGER (0..maxNrofPUCCH-PathlossReferenceRSs-1)
+
+PUCCH-PathlossReferenceRS-Id-v1610 ::= INTEGER (maxNrofPUCCH-PathlossReferenceRSs..maxNrofPUCCH-PathlossReferenceRSs-1-r16)
+
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-STOP
+-- TAG-PUCCH-POWERCONTROL-START
+PUCCH-PowerControl ::= SEQUENCE {
+ deltaF-PUCCH-f0 INTEGER (-16..15) OPTIONAL, -- Need R
+ deltaF-PUCCH-f1 INTEGER (-16..15) OPTIONAL, -- Need R
+ deltaF-PUCCH-f2 INTEGER (-16..15) OPTIONAL, -- Need R
+ deltaF-PUCCH-f3 INTEGER (-16..15) OPTIONAL, -- Need R
+ deltaF-PUCCH-f4 INTEGER (-16..15) OPTIONAL, -- Need R
+ p0-Set SEQUENCE (SIZE (1..maxNrofPUCCH-P0-PerSet)) OF P0-PUCCH OPTIONAL, -- Need M
+ pathlossReferenceRSs SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSs)) OF PUCCH-PathlossReferenceRS
+ OPTIONAL, -- Need M
+ twoPUCCH-PC-AdjustmentStates ENUMERATED {twoStates} OPTIONAL, -- Need S
+ ...,
+ [[
+ pathlossReferenceRSs-v1610 SetupRelease { PathlossReferenceRSs-v1610 } OPTIONAL -- Need M
+ ]]
+}
+
+P0-PUCCH ::= SEQUENCE {
+ p0-PUCCH-Id P0-PUCCH-Id,
+ p0-PUCCH-Value INTEGER (-16..15)
+}
+
+P0-PUCCH-Id ::= INTEGER (1..8)
+
+PathlossReferenceRSs-v1610 ::= SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSsDiff-r16)) OF PUCCH-PathlossReferenceRS-r16
+
+PUCCH-PathlossReferenceRS ::= SEQUENCE {
+ pucch-PathlossReferenceRS-Id PUCCH-PathlossReferenceRS-Id,
+ referenceSignal CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId
+ }
+}
+
+PUCCH-PathlossReferenceRS-r16 ::= SEQUENCE {
+ pucch-PathlossReferenceRS-Id-r16 PUCCH-PathlossReferenceRS-Id-v1610,
+ referenceSignal-r16 CHOICE {
+ ssb-Index-r16 SSB-Index,
+ csi-RS-Index-r16 NZP-CSI-RS-ResourceId
+ }
+}
+
+-- TAG-PUCCH-POWERCONTROL-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfo ::= SEQUENCE {
+ pucch-SpatialRelationInfoId PUCCH-SpatialRelationInfoId,
+ servingCellId ServCellIndex OPTIONAL, -- Need S
+ referenceSignal CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId,
+ srs PUCCH-SRS
+ },
+ pucch-PathlossReferenceRS-Id PUCCH-PathlossReferenceRS-Id,
+ p0-PUCCH-Id P0-PUCCH-Id,
+ closedLoopIndex ENUMERATED { i0, i1 }
+}
+
+PUCCH-SpatialRelationInfoExt-r16 ::= SEQUENCE {
+ pucch-SpatialRelationInfoId-v1610 PUCCH-SpatialRelationInfoId-v1610 OPTIONAL, -- Cond SetupOnly
+ pucch-PathlossReferenceRS-Id-v1610 PUCCH-PathlossReferenceRS-Id-v1610 OPTIONAL, --Need R
+ ...
+}
+
+PUCCH-SRS ::= SEQUENCE {
+ resource SRS-ResourceId,
+ uplinkBWP BWP-Id
+}
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfoId ::= INTEGER (1..maxNrofSpatialRelationInfos)
+
+PUCCH-SpatialRelationInfoId-r16 ::= INTEGER (1..maxNrofSpatialRelationInfos-r16)
+
+PUCCH-SpatialRelationInfoId-v1610::= INTEGER (maxNrofSpatialRelationInfos-plus-1..maxNrofSpatialRelationInfos-r16)
+
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-TPC-COMMANDCONFIG-START
+
+PUCCH-TPC-CommandConfig ::= SEQUENCE {
+ tpc-IndexPCell INTEGER (1..15) OPTIONAL, -- Cond PDCCH-OfSpcell
+ tpc-IndexPUCCH-SCell INTEGER (1..15) OPTIONAL, -- Cond PDCCH-ofSpCellOrPUCCH-SCell
+ ...
+}
+
+-- TAG-PUCCH-TPC-COMMANDCONFIG-STOP
+-- TAG-PUSCH-CONFIG-START
+
+PUSCH-Config ::= SEQUENCE {
+ dataScramblingIdentityPUSCH INTEGER (0..1023) OPTIONAL, -- Need S
+ txConfig ENUMERATED {codebook, nonCodebook} OPTIONAL, -- Need S
+ dmrs-UplinkForPUSCH-MappingTypeA SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
+ dmrs-UplinkForPUSCH-MappingTypeB SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
+ pusch-PowerControl PUSCH-PowerControl OPTIONAL, -- Need M
+ frequencyHopping ENUMERATED {intraSlot, interSlot} OPTIONAL, -- Need S
+ frequencyHoppingOffsetLists SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+ OPTIONAL, -- Need M
+ resourceAllocation ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+ pusch-TimeDomainAllocationList SetupRelease { PUSCH-TimeDomainResourceAllocationList } OPTIONAL, -- Need M
+ pusch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL, -- Need S
+ mcs-Table ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ mcs-TableTransformPrecoder ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ transformPrecoder ENUMERATED {enabled, disabled} OPTIONAL, -- Need S
+ codebookSubset ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+ OPTIONAL, -- Cond codebookBased
+ maxRank INTEGER (1..4) OPTIONAL, -- Cond codebookBased
+ rbg-Size ENUMERATED { config2} OPTIONAL, -- Need S
+ uci-OnPUSCH SetupRelease { UCI-OnPUSCH} OPTIONAL, -- Need M
+ tp-pi2BPSK ENUMERATED {enabled} OPTIONAL, -- Need S
+ ...,
+ [[
+ minimumSchedulingOffsetK2-r16 SetupRelease { MinSchedulingOffsetK2-Values-r16 } OPTIONAL, -- Need M
+ ul-AccessConfigListForDCI-Format0-1-r16 SetupRelease { UL-AccessConfigListForDCI-Format0-1-r16 } OPTIONAL, -- Need M
+ -- Start of the parameters for DCI format 0_2 introduced in V16.1.0
+ harq-ProcessNumberSizeForDCI-Format0-2-r16 INTEGER (0..4) OPTIONAL, -- Need R
+ dmrs-SequenceInitializationForDCI-Format0-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ numberOfBitsForRV-ForDCI-Format0-2-r16 INTEGER (0..2) OPTIONAL, -- Need R
+ antennaPortsFieldPresenceForDCI-Format0-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ dmrs-UplinkForPUSCH-MappingTypeA-ForDCI-Format0-2-r16 SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
+ dmrs-UplinkForPUSCH-MappingTypeB-ForDCI-Format0-2-r16 SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
+ frequencyHoppingForDCI-Format0-2-r16 CHOICE {
+ pusch-RepTypeA ENUMERATED {intraSlot, interSlot},
+ pusch-RepTypeB ENUMERATED {interRepetition, interSlot}
+ } OPTIONAL, -- Need S
+ frequencyHoppingOffsetListsForDCI-Format0-2-r16 SetupRelease { FrequencyHoppingOffsetListsForDCI-Format0-2-r16} OPTIONAL, -- Need M
+ codebookSubsetForDCI-Format0-2-r16 ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+ OPTIONAL, -- Cond codebookBased
+ invalidSymbolPatternIndicatorForDCI-Format0-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ maxRankForDCI-Format0-2-r16 INTEGER (1..4) OPTIONAL, -- Cond codebookBased
+ mcs-TableForDCI-Format0-2-r16 ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ mcs-TableTransformPrecoderForDCI-Format0-2-r16 ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
+ priorityIndicatorForDCI-Format0-2-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ pusch-RepTypeIndicatorForDCI-Format0-2-r16 ENUMERATED { pusch-RepTypeA, pusch-RepTypeB} OPTIONAL, -- Need R
+ resourceAllocationForDCI-Format0-2-r16 ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+ OPTIONAL, -- Need M
+ resourceAllocationType1GranularityForDCI-Format0-2-r16 ENUMERATED { n2,n4,n8,n16 } OPTIONAL, -- Need S
+ uci-OnPUSCH-ListForDCI-Format0-2-r16 SetupRelease { UCI-OnPUSCH-ListForDCI-Format0-2-r16} OPTIONAL, -- Need M
+ pusch-TimeDomainAllocationListForDCI-Format0-2-r16 SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+ OPTIONAL, -- Need M
+ -- End of the parameters for DCI format 0_2 introduced in V16.1.0
+ -- Start of the parameters for DCI format 0_1 introduced in V16.1.0
+ pusch-TimeDomainAllocationListForDCI-Format0-1-r16 SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+ OPTIONAL, -- Need M
+ invalidSymbolPatternIndicatorForDCI-Format0-1-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ priorityIndicatorForDCI-Format0-1-r16 ENUMERATED {enabled} OPTIONAL, -- Need S
+ pusch-RepTypeIndicatorForDCI-Format0-1-r16 ENUMERATED { pusch-RepTypeA, pusch-RepTypeB} OPTIONAL, -- Need R
+ frequencyHoppingForDCI-Format0-1-r16 ENUMERATED {interRepetition, interSlot} OPTIONAL, -- Cond RepTypeB
+ uci-OnPUSCH-ListForDCI-Format0-1-r16 SetupRelease { UCI-OnPUSCH-ListForDCI-Format0-1-r16 } OPTIONAL, -- Need M
+ -- End of the parameters for DCI format 0_1 introduced in V16.1.0
+ invalidSymbolPattern-r16 InvalidSymbolPattern-r16 OPTIONAL, -- Need S
+ pusch-PowerControl-v1610 SetupRelease {PUSCH-PowerControl-v1610} OPTIONAL, -- Need M
+ ul-FullPowerTransmission-r16 ENUMERATED {fullpower, fullpowerMode1, fullpoweMode2} OPTIONAL, -- Need R
+ pusch-TimeDomainAllocationListForMultiPUSCH-r16 SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+ OPTIONAL, -- Need M
+ numberOfInvalidSymbolsForDL-UL-Switching-r16 INTEGER (1..4) OPTIONAL -- Cond RepTypeB2
+ ]]
+}
+
+UCI-OnPUSCH ::= SEQUENCE {
+ betaOffsets CHOICE {
+ dynamic SEQUENCE (SIZE (4)) OF BetaOffsets,
+ semiStatic BetaOffsets
+ } OPTIONAL, -- Need M
+ scaling ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+MinSchedulingOffsetK2-Values-r16 ::= SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK2-SchedulingOffset-r16)
+
+UCI-OnPUSCH-ForDCI-Format0-2-r16 ::= SEQUENCE {
+ betaOffsetsForDCI-Format0-2-r16 CHOICE {
+ dynamicForDCI-Format0-2-r16 CHOICE {
+ oneBit-r16 SEQUENCE (SIZE (2)) OF BetaOffsets,
+ twoBits-r16 SEQUENCE (SIZE (4)) OF BetaOffsets
+ },
+ semiStaticForDCI-Format0-2-r16 BetaOffsets
+ } OPTIONAL, -- Need M
+ scalingForDCI-Format0-2-r16 ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+FrequencyHoppingOffsetListsForDCI-Format0-2-r16 ::= SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+
+UCI-OnPUSCH-ListForDCI-Format0-2-r16 ::= SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH-ForDCI-Format0-2-r16
+
+UCI-OnPUSCH-ListForDCI-Format0-1-r16 ::= SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH
+
+UL-AccessConfigListForDCI-Format0-1-r16 ::= SEQUENCE (SIZE (1..64)) OF INTEGER (0..63)
+
+-- TAG-PUSCH-CONFIG-STOP
+-- TAG-PUSCH-CONFIGCOMMON-START
+
+PUSCH-ConfigCommon ::= SEQUENCE {
+ groupHoppingEnabledTransformPrecoding ENUMERATED {enabled} OPTIONAL, -- Need R
+ pusch-TimeDomainAllocationList PUSCH-TimeDomainResourceAllocationList OPTIONAL, -- Need R
+ msg3-DeltaPreamble INTEGER (-1..6) OPTIONAL, -- Need R
+ p0-NominalWithGrant INTEGER (-202..24) OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-PUSCH-CONFIGCOMMON-STOP
+-- TAG-PUSCH-POWERCONTROL-START
+
+PUSCH-PowerControl ::= SEQUENCE {
+ tpc-Accumulation ENUMERATED { disabled } OPTIONAL, -- Need S
+ msg3-Alpha Alpha OPTIONAL, -- Need S
+ p0-NominalWithoutGrant INTEGER (-202..24) OPTIONAL, -- Need M
+ p0-AlphaSets SEQUENCE (SIZE (1..maxNrofP0-PUSCH-AlphaSets)) OF P0-PUSCH-AlphaSet OPTIONAL, -- Need M
+ pathlossReferenceRSToAddModList SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS
+ OPTIONAL, -- Need N
+ pathlossReferenceRSToReleaseList SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS-Id
+ OPTIONAL, -- Need N
+ twoPUSCH-PC-AdjustmentStates ENUMERATED {twoStates} OPTIONAL, -- Need S
+ deltaMCS ENUMERATED {enabled} OPTIONAL, -- Need S
+ sri-PUSCH-MappingToAddModList SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControl
+ OPTIONAL, -- Need N
+ sri-PUSCH-MappingToReleaseList SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControlId
+ OPTIONAL -- Need N
+}
+
+P0-PUSCH-AlphaSet ::= SEQUENCE {
+ p0-PUSCH-AlphaSetId P0-PUSCH-AlphaSetId,
+ p0 INTEGER (-16..15) OPTIONAL, -- Need S
+ alpha Alpha OPTIONAL -- Need S
+}
+
+P0-PUSCH-AlphaSetId ::= INTEGER (0..maxNrofP0-PUSCH-AlphaSets-1)
+
+PUSCH-PathlossReferenceRS ::= SEQUENCE {
+ pusch-PathlossReferenceRS-Id PUSCH-PathlossReferenceRS-Id,
+ referenceSignal CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId
+ }
+}
+
+PUSCH-PathlossReferenceRS-r16 ::= SEQUENCE {
+ pusch-PathlossReferenceRS-Id-r16 PUSCH-PathlossReferenceRS-Id-v1610,
+ referenceSignal-r16 CHOICE {
+ ssb-Index-r16 SSB-Index,
+ csi-RS-Index-r16 NZP-CSI-RS-ResourceId
+ }
+}
+
+PUSCH-PathlossReferenceRS-Id ::= INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1)
+
+PUSCH-PathlossReferenceRS-Id-v1610 ::= INTEGER (maxNrofPUSCH-PathlossReferenceRSs..maxNrofPUSCH-PathlossReferenceRSs-1-r16)
+
+SRI-PUSCH-PowerControl ::= SEQUENCE {
+ sri-PUSCH-PowerControlId SRI-PUSCH-PowerControlId,
+ sri-PUSCH-PathlossReferenceRS-Id PUSCH-PathlossReferenceRS-Id,
+ sri-P0-PUSCH-AlphaSetId P0-PUSCH-AlphaSetId,
+ sri-PUSCH-ClosedLoopIndex ENUMERATED { i0, i1 }
+}
+
+SRI-PUSCH-PowerControlId ::= INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+PUSCH-PowerControl-v1610 ::= SEQUENCE {
+ pathlossReferenceRSToAddModList2-r16 SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-r16
+ OPTIONAL, -- Need N
+ pathlossReferenceRSToReleaseList2-r16 SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-Id-v1610
+ OPTIONAL, -- Need N
+ p0-PUSCH-SetList-r16 SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF P0-PUSCH-Set-r16 OPTIONAL, -- Need R
+ olpc-ParameterSet SEQUENCE {
+ olpc-ParameterSetForDCI-Format0-1-r16 INTEGER (1..2) OPTIONAL, -- Need R
+ olpc-ParameterSetForDCI-Format0-2-r16 INTEGER (1..2) OPTIONAL -- Need R
+ } OPTIONAL, -- Need M
+ ...
+}
+
+P0-PUSCH-Set-r16 ::= SEQUENCE {
+ p0-PUSCH-SetId-r16 P0-PUSCH-SetId-r16,
+ p0-List-r16 SEQUENCE (SIZE (1..maxNrofP0-PUSCH-Set-r16)) OF P0-PUSCH-r16 OPTIONAL, -- Need R
+ ...
+}
+
+P0-PUSCH-SetId-r16 ::= INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+P0-PUSCH-r16 ::= INTEGER (-16..15)
+
+-- TAG-PUSCH-POWERCONTROL-STOP
+-- TAG-PUSCH-SERVINGCELLCONFIG-START
+
+PUSCH-ServingCellConfig ::= SEQUENCE {
+ codeBlockGroupTransmission SetupRelease { PUSCH-CodeBlockGroupTransmission } OPTIONAL, -- Need M
+ rateMatching ENUMERATED {limitedBufferRM} OPTIONAL, -- Need S
+ xOverhead ENUMERATED {xoh6, xoh12, xoh18} OPTIONAL, -- Need S
+ ...,
+ [[
+ maxMIMO-Layers INTEGER (1..4) OPTIONAL, -- Need M
+ processingType2Enabled BOOLEAN OPTIONAL -- Need M
+ ]],
+ [[
+ maxMIMO-LayersForDCI-Format0-2-r16 SetupRelease { MaxMIMO-LayersForDCI-Format0-2-r16} OPTIONAL -- Need M
+ ]]
+}
+
+PUSCH-CodeBlockGroupTransmission ::= SEQUENCE {
+ maxCodeBlockGroupsPerTransportBlock ENUMERATED {n2, n4, n6, n8},
+ ...
+}
+
+MaxMIMO-LayersForDCI-Format0-2-r16 ::= INTEGER (1..4)
+
+-- TAG-PUSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+PUSCH-TimeDomainResourceAllocationList ::= SEQUENCE (SIZE(1..maxNrofUL-Allocations)) OF PUSCH-TimeDomainResourceAllocation
+
+PUSCH-TimeDomainResourceAllocation ::= SEQUENCE {
+ k2 INTEGER(0..32) OPTIONAL, -- Need S
+ mappingType ENUMERATED {typeA, typeB},
+ startSymbolAndLength INTEGER (0..127)
+}
+
+PUSCH-TimeDomainResourceAllocationList-r16 ::= SEQUENCE (SIZE(1..maxNrofUL-Allocations-r16)) OF PUSCH-TimeDomainResourceAllocation-r16
+
+PUSCH-TimeDomainResourceAllocation-r16 ::= SEQUENCE {
+ k2-r16 INTEGER(0..32) OPTIONAL, -- Need S
+ puschAllocationList-r16 SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16)) OF PUSCH-Allocation-r16,
+ ...
+}
+
+PUSCH-Allocation-r16 ::= SEQUENCE {
+ mappingType-r16 ENUMERATED {typeA, typeB} OPTIONAL, -- Cond NotFormat01-02-Or-TypeA
+ startSymbolAndLength-r16 INTEGER (0..127) OPTIONAL, -- Cond NotFormat01-02-Or-TypeA
+ startSymbol-r16 INTEGER (0..13) OPTIONAL, -- Cond RepTypeB
+ length-r16 INTEGER (1..14) OPTIONAL, -- Cond RepTypeB
+ numberOfRepetitions-r16 ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16} OPTIONAL, -- Cond Format01-02
+ ...
+}
+
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PUSCH-TPC-COMMANDCONFIG-START
+
+PUSCH-TPC-CommandConfig ::= SEQUENCE {
+ tpc-Index INTEGER (1..15) OPTIONAL, -- Cond SUL
+ tpc-IndexSUL INTEGER (1..15) OPTIONAL, -- Cond SUL-Only
+ targetCell ServCellIndex OPTIONAL, -- Need S
+ ...
+}
+
+-- TAG-PUSCH-TPC-COMMANDCONFIG-STOP
+-- TAG-Q-OFFSETRANGE-START
+
+Q-OffsetRange ::= ENUMERATED {
+ dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+ dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+ dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+ dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+ dB20, dB22, dB24}
+
+-- TAG-Q-OFFSETRANGE-STOP
+-- TAG-Q-QUALMIN-START
+
+Q-QualMin ::= INTEGER (-43..-12)
+
+-- TAG-Q-QUALMIN-STOP
+-- TAG-Q-RXLEVMIN-START
+
+Q-RxLevMin ::= INTEGER (-70..-22)
+
+-- TAG-Q-RXLEVMIN-STOP
+-- TAG-QUANTITYCONFIG-START
+
+
+QuantityConfig ::= SEQUENCE {
+ quantityConfigNR-List SEQUENCE (SIZE (1..maxNrofQuantityConfig)) OF QuantityConfigNR OPTIONAL, -- Need M
+ ...,
+ [[
+ quantityConfigEUTRA FilterConfig OPTIONAL -- Need M
+ ]],
+ [[
+ quantityConfigUTRA-FDD-r16 QuantityConfigUTRA-FDD-r16 OPTIONAL, -- Need M
+ quantityConfigCLI-r16 FilterConfigCLI-r16 OPTIONAL -- Need M
+ ]]
+}
+
+QuantityConfigNR::= SEQUENCE {
+ quantityConfigCell QuantityConfigRS,
+ quantityConfigRS-Index QuantityConfigRS OPTIONAL -- Need M
+}
+
+QuantityConfigRS ::= SEQUENCE {
+ ssb-FilterConfig FilterConfig,
+ csi-RS-FilterConfig FilterConfig
+}
+
+FilterConfig ::= SEQUENCE {
+ filterCoefficientRSRP FilterCoefficient DEFAULT fc4,
+ filterCoefficientRSRQ FilterCoefficient DEFAULT fc4,
+ filterCoefficientRS-SINR FilterCoefficient DEFAULT fc4
+}
+
+FilterConfigCLI-r16 ::= SEQUENCE {
+ filterCoefficientSRS-RSRP-r16 FilterCoefficient DEFAULT fc4,
+ filterCoefficientCLI-RSSI-r16 FilterCoefficient DEFAULT fc4
+}
+
+QuantityConfigUTRA-FDD-r16 ::= SEQUENCE {
+ filterCoefficientRSCP-r16 FilterCoefficient DEFAULT fc4,
+ filterCoefficientEcNO-r16 FilterCoefficient DEFAULT fc4
+}
+
+-- TAG-QUANTITYCONFIG-STOP
+-- TAG-RACH-CONFIGCOMMON-START
+
+RACH-ConfigCommon ::= SEQUENCE {
+ rach-ConfigGeneric RACH-ConfigGeneric,
+ totalNumberOfRA-Preambles INTEGER (1..63) OPTIONAL, -- Need S
+ ssb-perRACH-OccasionAndCB-PreamblesPerSSB CHOICE {
+ oneEighth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ oneFourth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ oneHalf ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ one ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ two ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+ four INTEGER (1..16),
+ eight INTEGER (1..8),
+ sixteen INTEGER (1..4)
+ } OPTIONAL, -- Need M
+
+ groupBconfigured SEQUENCE {
+ ra-Msg3SizeGroupA ENUMERATED {b56, b144, b208, b256, b282, b480, b640,
+ b800, b1000, b72, spare6, spare5,spare4, spare3, spare2, spare1},
+ messagePowerOffsetGroupB ENUMERATED { minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+ numberOfRA-PreamblesGroupA INTEGER (1..64)
+ } OPTIONAL, -- Need R
+ ra-ContentionResolutionTimer ENUMERATED { sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64},
+ rsrp-ThresholdSSB RSRP-Range OPTIONAL, -- Need R
+ rsrp-ThresholdSSB-SUL RSRP-Range OPTIONAL, -- Cond SUL
+ prach-RootSequenceIndex CHOICE {
+ l839 INTEGER (0..837),
+ l139 INTEGER (0..137)
+ },
+ msg1-SubcarrierSpacing SubcarrierSpacing OPTIONAL, -- Cond L139
+ restrictedSetConfig ENUMERATED {unrestrictedSet, restrictedSetTypeA, restrictedSetTypeB},
+ msg3-transformPrecoder ENUMERATED {enabled} OPTIONAL, -- Need R
+ ...,
+ [[
+ ra-PrioritizationForAccessIdentity SEQUENCE {
+ ra-Prioritization-r16 RA-Prioritization,
+ ra-PrioritizationForAI-r16 BIT STRING (SIZE (2))
+ } OPTIONAL, -- Cond InitialBWP-Only
+ prach-RootSequenceIndex-r16 CHOICE {
+ l571 INTEGER (0..569),
+ l1151 INTEGER (0..1149)
+ } OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-RACH-CONFIGCOMMON-STOP
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-START
+
+RACH-ConfigCommonTwoStepRA-r16 ::= SEQUENCE {
+ rach-ConfigGenericTwoStepRA-r16 RACH-ConfigGenericTwoStepRA-r16,
+ msgA-TotalNumberOfRA-Preambles-r16 INTEGER (1..63) OPTIONAL, -- Need S
+ msgA-SSB-PerRACH-OccasionAndCB-PreamblesPerSSB-r16 CHOICE {
+ oneEighth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ oneFourth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ oneHalf ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ one ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+ two ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+ four INTEGER (1..16),
+ eight INTEGER (1..8),
+ sixteen INTEGER (1..4)
+ } OPTIONAL, -- Cond 2StepOnly
+ msgA-CB-PreamblesPerSSB-PerSharedRO-r16 INTEGER (1..60) OPTIONAL, -- Cond SharedRO
+ msgA-SSB-SharedRO-MaskIndex-r16 INTEGER (1..15) OPTIONAL, -- Need S
+ groupB-ConfiguredTwoStepRA-r16 GroupB-ConfiguredTwoStepRA-r16 OPTIONAL, -- Need S
+ msgA-PRACH-RootSequenceIndex-r16 CHOICE {
+ l839 INTEGER (0..837),
+ l139 INTEGER (0..137),
+ l571 INTEGER (0..569),
+ l1151 INTEGER (0..1149)
+ } OPTIONAL, -- Cond 2StepOnly
+ msgA-TransMax-r16 ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200} OPTIONAL, -- Need R
+ msgA-RSRP-Threshold-r16 RSRP-Range OPTIONAL, -- Cond 2Step4Step
+ msgA-RSRP-ThresholdSSB-r16 RSRP-Range OPTIONAL, -- Need R
+ msgA-SubcarrierSpacing-r16 SubcarrierSpacing OPTIONAL, -- Cond 2StepOnlyL139
+ msgA-RestrictedSetConfig-r16 ENUMERATED {unrestrictedSet, restrictedSetTypeA,
+ restrictedSetTypeB} OPTIONAL, -- Cond 2StepOnly
+ ra-PrioritizationForAccessIdentityTwoStep-r16 SEQUENCE {
+ ra-Prioritization-r16 RA-Prioritization,
+ ra-PrioritizationForAI-r16 BIT STRING (SIZE (2))
+ } OPTIONAL, -- Cond InitialBWP-Only
+ ra-ContentionResolutionTimer-r16 ENUMERATED {sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64} OPTIONAL, -- Cond 2StepOnly
+ ...
+}
+
+GroupB-ConfiguredTwoStepRA-r16 ::= SEQUENCE {
+ ra-MsgA-SizeGroupA ENUMERATED {b56, b144, b208, b256, b282, b480, b640, b800,
+ b1000, b72, spare6, spare5, spare4, spare3, spare2, spare1},
+ messagePowerOffsetGroupB ENUMERATED {minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+ numberofRA-PreamblesGroupA INTEGER (1..64)
+}
+
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-STOP
+-- TAG-RACH-CONFIGDEDICATED-START
+
+
+RACH-ConfigDedicated ::= SEQUENCE {
+ cfra CFRA OPTIONAL, -- Need S
+ ra-Prioritization RA-Prioritization OPTIONAL, -- Need N
+ ...,
+ [[
+ ra-PrioritizationTwoStep-r16 RA-Prioritization OPTIONAL, -- Need N
+ cfra-TwoStep-r16 CFRA-TwoStep-r16 OPTIONAL -- Need S
+ ]]
+}
+
+CFRA ::= SEQUENCE {
+ occasions SEQUENCE {
+ rach-ConfigGeneric RACH-ConfigGeneric,
+ ssb-perRACH-Occasion ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+ OPTIONAL -- Cond Mandatory
+ } OPTIONAL, -- Need S
+ resources CHOICE {
+ ssb SEQUENCE {
+ ssb-ResourceList SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+ ra-ssb-OccasionMaskIndex INTEGER (0..15)
+ },
+ csirs SEQUENCE {
+ csirs-ResourceList SEQUENCE (SIZE(1..maxRA-CSIRS-Resources)) OF CFRA-CSIRS-Resource,
+ rsrp-ThresholdCSI-RS RSRP-Range
+ }
+ },
+ ...,
+ [[
+ totalNumberOfRA-Preambles INTEGER (1..63) OPTIONAL -- Cond Occasions
+ ]]
+}
+
+CFRA-TwoStep-r16 ::= SEQUENCE {
+ occasionsTwoStepRA-r16 SEQUENCE {
+ rach-ConfigGenericTwoStepRA-r16 RACH-ConfigGenericTwoStepRA-r16,
+ ssb-PerRACH-OccasionTwoStepRA-r16 ENUMERATED {oneEighth, oneFourth, oneHalf, one,
+ two, four, eight, sixteen}
+ } OPTIONAL, -- Need S
+ msgA-CFRA-PUSCH-r16 MsgA-PUSCH-Resource-r16,
+ msgA-TransMax-r16 ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200} OPTIONAL, -- Need S
+ resourcesTwoStep-r16 SEQUENCE {
+ ssb-ResourceList SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+ ra-ssb-OccasionMaskIndex INTEGER (0..15)
+ },
+ ...
+}
+
+CFRA-SSB-Resource ::= SEQUENCE {
+ ssb SSB-Index,
+ ra-PreambleIndex INTEGER (0..63),
+ ...,
+ [[
+ msgA-PUSCH-resource-Index-r16 INTEGER (0..3071) OPTIONAL -- Cond 2StepCFRA
+ ]]
+
+}
+
+CFRA-CSIRS-Resource ::= SEQUENCE {
+ csi-RS CSI-RS-Index,
+ ra-OccasionList SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1),
+ ra-PreambleIndex INTEGER (0..63),
+ ...
+}
+
+-- TAG-RACH-CONFIGDEDICATED-STOP
+-- TAG-RACH-CONFIGGENERIC-START
+
+RACH-ConfigGeneric ::= SEQUENCE {
+ prach-ConfigurationIndex INTEGER (0..255),
+ msg1-FDM ENUMERATED {one, two, four, eight},
+ msg1-FrequencyStart INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+ zeroCorrelationZoneConfig INTEGER(0..15),
+ preambleReceivedTargetPower INTEGER (-202..-60),
+ preambleTransMax ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200},
+ powerRampingStep ENUMERATED {dB0, dB2, dB4, dB6},
+ ra-ResponseWindow ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80},
+ ...,
+ [[
+ prach-ConfigurationPeriodScaling-IAB-r16 ENUMERATED {scf1,scf2,scf4,scf8,scf16,scf32,scf64} OPTIONAL, -- Need R
+ prach-ConfigurationFrameOffset-IAB-r16 INTEGER (0..63) OPTIONAL, -- Need R
+ prach-ConfigurationSOffset-IAB-r16 INTEGER (0..39) OPTIONAL, -- Need R
+ ra-ResponseWindow-v1610 ENUMERATED { sl60, sl160} OPTIONAL, -- Need R
+ prach-ConfigurationIndex-v1610 INTEGER (256..262) OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-RACH-CONFIGGENERIC-STOP
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-START
+
+RACH-ConfigGenericTwoStepRA-r16 ::= SEQUENCE {
+ msgA-PRACH-ConfigurationIndex-r16 INTEGER (0..262) OPTIONAL, -- Cond 2StepOnly
+ msgA-RO-FDM-r16 ENUMERATED {one, two, four, eight} OPTIONAL, -- Cond 2StepOnly
+ msgA-RO-FrequencyStart-r16 INTEGER (0..maxNrofPhysicalResourceBlocks-1) OPTIONAL, -- Cond 2StepOnly
+ msgA-ZeroCorrelationZoneConfig-r16 INTEGER (0..15) OPTIONAL, -- Cond 2StepOnly
+ msgA-PreamblePowerRampingStep-r16 ENUMERATED {dB0, dB2, dB4, dB6} OPTIONAL, -- Cond 2StepOnlyNoCFRA
+ msgA-PreambleReceivedTargetPower-r16 INTEGER (-202..-60) OPTIONAL, -- Cond 2StepOnlyNoCFRA
+ msgB-ResponseWindow-r16 ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80, sl160, sl320}
+ OPTIONAL, -- Cond NoCFRA
+ preambleTransMax-r16 ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200} OPTIONAL, -- Cond 2StepOnlyNoCFRA
+ ...
+}
+
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-STOP
+-- TAG-RA-PRIORITIZATION-START
+
+RA-Prioritization ::= SEQUENCE {
+ powerRampingStepHighPriority ENUMERATED {dB0, dB2, dB4, dB6},
+ scalingFactorBI ENUMERATED {zero, dot25, dot5, dot75} OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-RA-PRIORITIZATION-STOP
+-- TAG-RADIOBEARERCONFIG-START
+
+RadioBearerConfig ::= SEQUENCE {
+ srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn
+ srb3-ToRelease ENUMERATED{true} OPTIONAL, -- Need N
+ drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toNR
+ drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need N
+ securityConfig SecurityConfig OPTIONAL, -- Need M
+ ...
+}
+
+SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod
+SRB-ToAddMod ::= SEQUENCE {
+ srb-Identity SRB-Identity,
+ reestablishPDCP ENUMERATED{true} OPTIONAL, -- Need N
+ discardOnPDCP ENUMERATED{true} OPTIONAL, -- Need N
+ pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP
+ ...
+}
+
+DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod
+
+DRB-ToAddMod ::= SEQUENCE {
+ cnAssociation CHOICE {
+ eps-BearerIdentity INTEGER (0..15),
+ sdap-Config SDAP-Config
+ } OPTIONAL, -- Cond DRBSetup
+ drb-Identity DRB-Identity,
+ reestablishPDCP ENUMERATED{true} OPTIONAL, -- Need N
+ recoverPDCP ENUMERATED{true} OPTIONAL, -- Need N
+ pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP
+ ...,
+ [[
+ daps-Config-r16 ENUMERATED{true} OPTIONAL --Need N
+ ]]
+}
+DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity
+
+SecurityConfig ::= SEQUENCE {
+ securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Cond RBTermChange1
+ keyToUse ENUMERATED{master, secondary} OPTIONAL, -- Cond RBTermChange
+ ...
+}
+
+-- TAG-RADIOBEARERCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGCONFIG-START
+
+RadioLinkMonitoringConfig ::= SEQUENCE {
+ failureDetectionResourcesToAddModList SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS
+ OPTIONAL, -- Need N
+ failureDetectionResourcesToReleaseList SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS-Id
+ OPTIONAL, -- Need N
+ beamFailureInstanceMaxCount ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10} OPTIONAL, -- Need R
+ beamFailureDetectionTimer ENUMERATED {pbfd1, pbfd2, pbfd3, pbfd4, pbfd5, pbfd6, pbfd8, pbfd10} OPTIONAL, -- Need R
+ ...
+}
+
+RadioLinkMonitoringRS ::= SEQUENCE {
+ radioLinkMonitoringRS-Id RadioLinkMonitoringRS-Id,
+ purpose ENUMERATED {beamFailure, rlf, both},
+ detectionResource CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId
+ },
+ ...
+}
+
+-- TAG-RADIOLINKMONITORINGCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGRS-ID-START
+
+RadioLinkMonitoringRS-Id ::= INTEGER (0..maxNrofFailureDetectionResources-1)
+
+-- TAG-RADIOLINKMONITORINGRS-ID-STOP
+-- TAG-RAN-AREACODE-START
+
+RAN-AreaCode ::= INTEGER (0..255)
+
+-- TAG-RAN-AREACODE-STOP
+-- TAG-RATEMATCHPATTERN-START
+
+RateMatchPattern ::= SEQUENCE {
+ rateMatchPatternId RateMatchPatternId,
+
+ patternType CHOICE {
+ bitmaps SEQUENCE {
+ resourceBlocks BIT STRING (SIZE (275)),
+ symbolsInResourceBlock CHOICE {
+ oneSlot BIT STRING (SIZE (14)),
+ twoSlots BIT STRING (SIZE (28))
+ },
+ periodicityAndPattern CHOICE {
+ n2 BIT STRING (SIZE (2)),
+ n4 BIT STRING (SIZE (4)),
+ n5 BIT STRING (SIZE (5)),
+ n8 BIT STRING (SIZE (8)),
+ n10 BIT STRING (SIZE (10)),
+ n20 BIT STRING (SIZE (20)),
+ n40 BIT STRING (SIZE (40))
+ } OPTIONAL, -- Need S
+ ...
+ },
+ controlResourceSet ControlResourceSetId
+ },
+ subcarrierSpacing SubcarrierSpacing OPTIONAL, -- Cond CellLevel
+ dummy ENUMERATED { dynamic, semiStatic },
+ ...,
+ [[
+ controlResourceSet-r16 ControlResourceSetId-r16 OPTIONAL -- Need R
+ ]]
+
+}
+
+-- TAG-RATEMATCHPATTERN-STOP
+-- TAG-RATEMATCHPATTERNID-START
+
+RateMatchPatternId ::= INTEGER (0..maxNrofRateMatchPatterns-1)
+
+-- TAG-RATEMATCHPATTERNID-STOP
+-- TAG-RATEMATCHPATTERNLTE-CRS-START
+
+RateMatchPatternLTE-CRS ::= SEQUENCE {
+ carrierFreqDL INTEGER (0..16383),
+ carrierBandwidthDL ENUMERATED {n6, n15, n25, n50, n75, n100, spare2, spare1},
+ mbsfn-SubframeConfigList EUTRA-MBSFN-SubframeConfigList OPTIONAL, -- Need M
+ nrofCRS-Ports ENUMERATED {n1, n2, n4},
+ v-Shift ENUMERATED {n0, n1, n2, n3, n4, n5}
+}
+
+LTE-CRS-PatternList-r16 ::= SEQUENCE (SIZE (1..maxLTE-CRS-Patterns-r16)) OF RateMatchPatternLTE-CRS
+
+-- TAG-RATEMATCHPATTERNLTE-CRS-STOP
+-- TAG-REFERENCETIMEINFO-START
+
+ReferenceTimeInfo-r16 ::= SEQUENCE {
+ time-r16 ReferenceTime-r16,
+ uncertainty-r16 INTEGER (0..32767) OPTIONAL, -- Need S
+ timeInfoType-r16 ENUMERATED {localClock} OPTIONAL, -- Need S
+ referenceSFN-r16 INTEGER (0..1023) OPTIONAL -- Cond RefTime
+}
+
+ReferenceTime-r16 ::= SEQUENCE {
+ refDays-r16 INTEGER (0..72999),
+ refSeconds-r16 INTEGER (0..86399),
+ refMilliSeconds-r16 INTEGER (0..999),
+ refTenNanoSeconds-r16 INTEGER (0..99999)
+}
+
+-- TAG-REFERENCETIMEINFO-STOP
+-- TAG-REJECTWAITTIME-START
+
+RejectWaitTime ::= INTEGER (1..16)
+
+-- TAG-REJECTWAITTIME-STOP
+-- TAG-REPETITIONSCHEMECONFIG-START
+
+RepetitionSchemeConfig-r16 ::= CHOICE {
+ fdm-TDM-r16 SetupRelease { FDM-TDM-r16 },
+ slotBased-r16 SetupRelease { SlotBased-r16 }
+}
+
+FDM-TDM-r16 ::= SEQUENCE {
+ repetitionScheme-r16 ENUMERATED {fdmSchemeA, fdmSchemeB,tdmSchemeA },
+ startingSymbolOffsetK-r16 INTEGER (0..7) OPTIONAL -- Need R
+}
+
+SlotBased-r16 ::= SEQUENCE {
+ tciMapping-r16 ENUMERATED {cyclicMapping, sequenticalMapping},
+ sequenceOffsetforRV-r16 INTEGER (1..3)
+}
+
+-- TAG-REPETITIONSCHEMECONFIG-STOP
+-- TAG-REPORTCONFIGID-START
+
+ReportConfigId ::= INTEGER (1..maxReportConfigId)
+
+-- TAG-REPORTCONFIGID-STOP
+-- TAG-REPORTCONFIGINTERRAT-START
+
+ReportConfigInterRAT ::= SEQUENCE {
+ reportType CHOICE {
+ periodical PeriodicalReportConfigInterRAT,
+ eventTriggered EventTriggerConfigInterRAT,
+ reportCGI ReportCGI-EUTRA,
+ ...,
+ reportSFTD ReportSFTD-EUTRA
+ }
+}
+
+ReportCGI-EUTRA ::= SEQUENCE {
+ cellForWhichToReportCGI EUTRA-PhysCellId,
+ ...,
+ [[
+ useAutonomousGaps-r16 ENUMERATED {setup} OPTIONAL -- Need R
+ ]]
+}
+
+ReportSFTD-EUTRA ::= SEQUENCE {
+ reportSFTD-Meas BOOLEAN,
+ reportRSRP BOOLEAN,
+ ...
+}
+
+EventTriggerConfigInterRAT ::= SEQUENCE {
+ eventId CHOICE {
+ eventB1 SEQUENCE {
+ b1-ThresholdEUTRA MeasTriggerQuantityEUTRA,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ ...
+ },
+ eventB2 SEQUENCE {
+ b2-Threshold1 MeasTriggerQuantity,
+ b2-Threshold2EUTRA MeasTriggerQuantityEUTRA,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ ...
+ },
+ ...,
+ [[
+ eventB1-UTRA-FDD-r16 SEQUENCE {
+ b1-ThresholdUTRA-FDD-r16 MeasTriggerQuantityUTRA-FDD-r16,
+ reportOnLeave-r16 BOOLEAN,
+ hysteresis-r16 Hysteresis,
+ timeToTrigger-r16 TimeToTrigger,
+ ...
+ },
+ eventB2-UTRA-FDD-r16 SEQUENCE {
+ b2-Threshold1-r16 MeasTriggerQuantity,
+ b2-Threshold2UTRA-FDD-r16 MeasTriggerQuantityUTRA-FDD-r16,
+ reportOnLeave-r16 BOOLEAN,
+ hysteresis-r16 Hysteresis,
+ timeToTrigger-r16 TimeToTrigger,
+ ...
+ }
+ ]]
+ },
+ rsType NR-RS-Type,
+
+ reportInterval ReportInterval,
+ reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ reportQuantity MeasReportQuantity,
+ maxReportCells INTEGER (1..maxCellReport),
+ ...,
+ [[
+ reportQuantityUTRA-FDD-r16 MeasReportQuantityUTRA-FDD-r16 OPTIONAL -- Need R
+ ]]
+
+
+}
+
+PeriodicalReportConfigInterRAT ::= SEQUENCE {
+ reportInterval ReportInterval,
+ reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ reportQuantity MeasReportQuantity,
+ maxReportCells INTEGER (1..maxCellReport),
+ ...,
+ [[
+ reportQuantityUTRA-FDD-r16 MeasReportQuantityUTRA-FDD-r16 OPTIONAL -- Need R
+ ]]
+}
+
+MeasTriggerQuantityUTRA-FDD-r16 ::= CHOICE{
+ utra-FDD-RSCP-r16 INTEGER (-5..91),
+ utra-FDD-EcN0-r16 INTEGER (0..49)
+}
+
+MeasReportQuantityUTRA-FDD-r16 ::= SEQUENCE {
+ cpich-RSCP BOOLEAN,
+ cpich-EcN0 BOOLEAN
+}
+
+-- TAG-REPORTCONFIGINTERRAT-STOP
+-- TAG-REPORTCONFIGNR-START
+
+ReportConfigNR ::= SEQUENCE {
+ reportType CHOICE {
+ periodical PeriodicalReportConfig,
+ eventTriggered EventTriggerConfig,
+ ...,
+ reportCGI ReportCGI,
+ reportSFTD ReportSFTD-NR,
+ condTriggerConfig-r16 CondTriggerConfig-r16,
+ cli-Periodical-r16 CLI-PeriodicalReportConfig-r16,
+ cli-EventTriggered-r16 CLI-EventTriggerConfig-r16
+ }
+}
+
+ReportCGI ::= SEQUENCE {
+ cellForWhichToReportCGI PhysCellId,
+ ...,
+ [[
+ useAutonomousGaps-r16 ENUMERATED {setup} OPTIONAL -- Need R
+ ]]
+
+}
+
+ReportSFTD-NR ::= SEQUENCE {
+ reportSFTD-Meas BOOLEAN,
+ reportRSRP BOOLEAN,
+ ...,
+ [[
+ reportSFTD-NeighMeas ENUMERATED {true} OPTIONAL, -- Need R
+ drx-SFTD-NeighMeas ENUMERATED {true} OPTIONAL, -- Need R
+ cellsForWhichToReportSFTD SEQUENCE (SIZE (1..maxCellSFTD)) OF PhysCellId OPTIONAL -- Need R
+ ]]
+}
+
+CondTriggerConfig-r16 ::= SEQUENCE {
+ condEventId CHOICE {
+ condEventA3 SEQUENCE {
+ a3-Offset MeasTriggerQuantityOffset,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger
+ },
+ condEventA5 SEQUENCE {
+ a5-Threshold1 MeasTriggerQuantity,
+ a5-Threshold2 MeasTriggerQuantity,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger
+ },
+ ...
+ },
+ rsType-r16 NR-RS-Type,
+ ...
+}
+
+EventTriggerConfig::= SEQUENCE {
+ eventId CHOICE {
+ eventA1 SEQUENCE {
+ a1-Threshold MeasTriggerQuantity,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger
+ },
+ eventA2 SEQUENCE {
+ a2-Threshold MeasTriggerQuantity,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger
+ },
+ eventA3 SEQUENCE {
+ a3-Offset MeasTriggerQuantityOffset,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ useWhiteCellList BOOLEAN
+ },
+ eventA4 SEQUENCE {
+ a4-Threshold MeasTriggerQuantity,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ useWhiteCellList BOOLEAN
+ },
+ eventA5 SEQUENCE {
+ a5-Threshold1 MeasTriggerQuantity,
+ a5-Threshold2 MeasTriggerQuantity,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ useWhiteCellList BOOLEAN
+ },
+ eventA6 SEQUENCE {
+ a6-Offset MeasTriggerQuantityOffset,
+ reportOnLeave BOOLEAN,
+ hysteresis Hysteresis,
+ timeToTrigger TimeToTrigger,
+ useWhiteCellList BOOLEAN
+ },
+ ...
+ },
+
+ rsType NR-RS-Type,
+
+ reportInterval ReportInterval,
+ reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+
+ reportQuantityCell MeasReportQuantity,
+ maxReportCells INTEGER (1..maxCellReport),
+
+ reportQuantityRS-Indexes MeasReportQuantity OPTIONAL, -- Need R
+ maxNrofRS-IndexesToReport INTEGER (1..maxNrofIndexesToReport) OPTIONAL, -- Need R
+ includeBeamMeasurements BOOLEAN,
+ reportAddNeighMeas ENUMERATED {setup} OPTIONAL, -- Need R
+ ...,
+ [[
+ measRSSI-ReportConfig-r16 MeasRSSI-ReportConfig-r16 OPTIONAL, -- Need R
+ useT312-r16 BOOLEAN OPTIONAL, -- Need M
+ includeCommonLocationInfo-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ includeBT-Meas-r16 SetupRelease {BT-NameList-r16} OPTIONAL, -- Need M
+ includeWLAN-Meas-r16 SetupRelease {WLAN-NameList-r16} OPTIONAL, -- Need M
+ includeSensor-Meas-r16 SetupRelease {Sensor-NameList-r16} OPTIONAL -- Need M
+ ]]
+}
+
+PeriodicalReportConfig ::= SEQUENCE {
+ rsType NR-RS-Type,
+
+ reportInterval ReportInterval,
+ reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+
+ reportQuantityCell MeasReportQuantity,
+ maxReportCells INTEGER (1..maxCellReport),
+
+ reportQuantityRS-Indexes MeasReportQuantity OPTIONAL, -- Need R
+ maxNrofRS-IndexesToReport INTEGER (1..maxNrofIndexesToReport) OPTIONAL, -- Need R
+ includeBeamMeasurements BOOLEAN,
+ useWhiteCellList BOOLEAN,
+ ...,
+ [[
+ measRSSI-ReportConfig-r16 MeasRSSI-ReportConfig-r16 OPTIONAL, -- Need R
+ includeCommonLocationInfo-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ includeBT-Meas-r16 SetupRelease {BT-NameList-r16} OPTIONAL, -- Need M
+ includeWLAN-Meas-r16 SetupRelease {WLAN-NameList-r16} OPTIONAL, -- Need M
+ includeSensor-Meas-r16 SetupRelease {Sensor-NameList-r16} OPTIONAL, -- Need M
+ ul-DelayValueConfig-r16 SetupRelease { UL-DelayValueConfig-r16 } OPTIONAL, -- Need M
+ reportAddNeighMeas-r16 ENUMERATED {setup} OPTIONAL -- Need R
+ ]]
+
+}
+
+NR-RS-Type ::= ENUMERATED {ssb, csi-rs}
+
+MeasTriggerQuantity ::= CHOICE {
+ rsrp RSRP-Range,
+ rsrq RSRQ-Range,
+ sinr SINR-Range
+}
+
+MeasTriggerQuantityOffset ::= CHOICE {
+ rsrp INTEGER (-30..30),
+ rsrq INTEGER (-30..30),
+ sinr INTEGER (-30..30)
+}
+
+
+MeasReportQuantity ::= SEQUENCE {
+ rsrp BOOLEAN,
+ rsrq BOOLEAN,
+ sinr BOOLEAN
+}
+
+MeasRSSI-ReportConfig-r16 ::= SEQUENCE {
+ channelOccupancyThreshold-r16 RSSI-Range-r16 OPTIONAL -- Need R
+}
+
+CLI-EventTriggerConfig-r16 ::= SEQUENCE {
+ eventId-r16 CHOICE {
+ eventI1-r16 SEQUENCE {
+ i1-Threshold-r16 MeasTriggerQuantityCLI-r16,
+ reportOnLeave-r16 BOOLEAN,
+ hysteresis-r16 Hysteresis,
+ timeToTrigger-r16 TimeToTrigger
+ },
+ ...
+ },
+ reportInterval-r16 ReportInterval,
+ reportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ maxReportCLI-r16 INTEGER (1..maxCLI-Report-r16),
+ ...
+}
+
+CLI-PeriodicalReportConfig-r16 ::= SEQUENCE {
+ reportInterval-r16 ReportInterval,
+ reportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ reportQuantityCLI-r16 MeasReportQuantityCLI-r16,
+ maxReportCLI-r16 INTEGER (1..maxCLI-Report-r16),
+ ...
+}
+
+MeasTriggerQuantityCLI-r16 ::= CHOICE {
+ srs-RSRP-r16 SRS-RSRP-Range-r16,
+ cli-RSSI-r16 CLI-RSSI-Range-r16
+}
+
+MeasReportQuantityCLI-r16 ::= ENUMERATED {srs-rsrp, cli-rssi}
+
+-- TAG-REPORTCONFIGNR-STOP
+-- TAG-REPORTCONFIGNR-SL-START
+
+ReportConfigNR-SL-r16 ::= SEQUENCE {
+ reportType-r16 CHOICE {
+ periodical-r16 PeriodicalReportConfigNR-SL-r16,
+ eventTriggered-r16 EventTriggerConfigNR-SL-r16
+ }
+}
+
+EventTriggerConfigNR-SL-r16::= SEQUENCE {
+ eventId-r16 CHOICE {
+ eventC1 SEQUENCE {
+ c1-Threshold-r16 SL-CBR-r16,
+ hysteresis-r16 Hysteresis,
+ timeToTrigger-r16 TimeToTrigger
+ },
+ eventC2-r16 SEQUENCE {
+ c2-Threshold-r16 SL-CBR-r16,
+ hysteresis-r16 Hysteresis,
+ timeToTrigger-r16 TimeToTrigger
+ },
+ ...
+ },
+ reportInterval-r16 ReportInterval,
+ reportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ reportQuantity-r16 MeasReportQuantity-r16,
+ ...
+}
+
+PeriodicalReportConfigNR-SL-r16 ::= SEQUENCE {
+ reportInterval-r16 ReportInterval,
+ reportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ reportQuantity-r16 MeasReportQuantity-r16,
+ ...
+}
+
+MeasReportQuantity-r16 ::= SEQUENCE {
+ cbr-r16 BOOLEAN,
+ ...
+}
+
+-- TAG-REPORTCONFIGNR-SL-STOP
+-- TAG-REPORTCONFIGTOADDMODLIST-START
+
+ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod
+
+ReportConfigToAddMod ::= SEQUENCE {
+ reportConfigId ReportConfigId,
+ reportConfig CHOICE {
+ reportConfigNR ReportConfigNR,
+ ...,
+ reportConfigInterRAT ReportConfigInterRAT,
+ reportConfigNR-SL-r16 ReportConfigNR-SL-r16
+ }
+}
+
+-- TAG-REPORTCONFIGTOADDMODLIST-STOP
+-- TAG-REPORTINTERVAL-START
+
+ReportInterval ::= ENUMERATED {ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, ms20480, ms40960,
+ min1,min6, min12, min30 }
+
+-- TAG-REPORTINTERVAL-STOP
+-- TAG-RESELECTIONTHRESHOLD-START
+
+ReselectionThreshold ::= INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLD-STOP
+-- TAG-RESELECTIONTHRESHOLDQ-START
+
+ReselectionThresholdQ ::= INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLDQ-STOP
+-- TAG-RESUMECAUSE-START
+
+ResumeCause ::= ENUMERATED {emergency, highPriorityAccess, mt-Access, mo-Signalling,
+ mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, rna-Update, mps-PriorityAccess,
+ mcs-PriorityAccess, spare1, spare2, spare3, spare4, spare5 }
+
+-- TAG-RESUMECAUSE-STOP
+-- TAG-RLC-BEARERCONFIG-START
+
+RLC-BearerConfig ::= SEQUENCE {
+ logicalChannelIdentity LogicalChannelIdentity,
+ servedRadioBearer CHOICE {
+ srb-Identity SRB-Identity,
+ drb-Identity DRB-Identity
+ } OPTIONAL, -- Cond LCH-SetupOnly
+ reestablishRLC ENUMERATED {true} OPTIONAL, -- Need N
+ rlc-Config RLC-Config OPTIONAL, -- Cond LCH-Setup
+ mac-LogicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond LCH-Setup
+ ...,
+ [[
+ rlc-Config-v1610 RLC-Config-v1610 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-RLC-BEARERCONFIG-STOP
+-- TAG-RLC-CONFIG-START
+
+RLC-Config ::= CHOICE {
+ am SEQUENCE {
+ ul-AM-RLC UL-AM-RLC,
+ dl-AM-RLC DL-AM-RLC
+ },
+ um-Bi-Directional SEQUENCE {
+ ul-UM-RLC UL-UM-RLC,
+ dl-UM-RLC DL-UM-RLC
+ },
+ um-Uni-Directional-UL SEQUENCE {
+ ul-UM-RLC UL-UM-RLC
+ },
+ um-Uni-Directional-DL SEQUENCE {
+ dl-UM-RLC DL-UM-RLC
+ },
+ ...
+}
+
+UL-AM-RLC ::= SEQUENCE {
+ sn-FieldLength SN-FieldLengthAM OPTIONAL, -- Cond Reestab
+ t-PollRetransmit T-PollRetransmit,
+ pollPDU PollPDU,
+ pollByte PollByte,
+ maxRetxThreshold ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 }
+}
+
+DL-AM-RLC ::= SEQUENCE {
+ sn-FieldLength SN-FieldLengthAM OPTIONAL, -- Cond Reestab
+ t-Reassembly T-Reassembly,
+ t-StatusProhibit T-StatusProhibit
+}
+
+UL-UM-RLC ::= SEQUENCE {
+ sn-FieldLength SN-FieldLengthUM OPTIONAL -- Cond Reestab
+}
+
+DL-UM-RLC ::= SEQUENCE {
+ sn-FieldLength SN-FieldLengthUM OPTIONAL, -- Cond Reestab
+ t-Reassembly T-Reassembly
+}
+
+T-PollRetransmit ::= ENUMERATED {
+ ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+ ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+ ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+ ms110, ms115, ms120, ms125, ms130, ms135,
+ ms140, ms145, ms150, ms155, ms160, ms165,
+ ms170, ms175, ms180, ms185, ms190, ms195,
+ ms200, ms205, ms210, ms215, ms220, ms225,
+ ms230, ms235, ms240, ms245, ms250, ms300,
+ ms350, ms400, ms450, ms500, ms800, ms1000,
+ ms2000, ms4000, ms1-v1610, ms2-v1610, ms3-v1610,
+ ms4-v1610, spare1}
+
+
+PollPDU ::= ENUMERATED {
+ p4, p8, p16, p32, p64, p128, p256, p512, p1024, p2048, p4096, p6144, p8192, p12288, p16384,p20480,
+ p24576, p28672, p32768, p40960, p49152, p57344, p65536, infinity, spare8, spare7, spare6, spare5, spare4,
+ spare3, spare2, spare1}
+
+PollByte ::= ENUMERATED {
+ kB1, kB2, kB5, kB8, kB10, kB15, kB25, kB50, kB75,
+ kB100, kB125, kB250, kB375, kB500, kB750, kB1000,
+ kB1250, kB1500, kB2000, kB3000, kB4000, kB4500,
+ kB5000, kB5500, kB6000, kB6500, kB7000, kB7500,
+ mB8, mB9, mB10, mB11, mB12, mB13, mB14, mB15,
+ mB16, mB17, mB18, mB20, mB25, mB30, mB40, infinity,
+ spare20, spare19, spare18, spare17, spare16,
+ spare15, spare14, spare13, spare12, spare11,
+ spare10, spare9, spare8, spare7, spare6, spare5,
+ spare4, spare3, spare2, spare1}
+
+T-Reassembly ::= ENUMERATED {
+ ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+ ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+ ms75, ms80, ms85, ms90, ms95, ms100, ms110,
+ ms120, ms130, ms140, ms150, ms160, ms170,
+ ms180, ms190, ms200, spare1}
+
+T-StatusProhibit ::= ENUMERATED {
+ ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+ ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+ ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+ ms110, ms115, ms120, ms125, ms130, ms135,
+ ms140, ms145, ms150, ms155, ms160, ms165,
+ ms170, ms175, ms180, ms185, ms190, ms195,
+ ms200, ms205, ms210, ms215, ms220, ms225,
+ ms230, ms235, ms240, ms245, ms250, ms300,
+ ms350, ms400, ms450, ms500, ms800, ms1000,
+ ms1200, ms1600, ms2000, ms2400, spare2, spare1}
+
+SN-FieldLengthUM ::= ENUMERATED {size6, size12}
+SN-FieldLengthAM ::= ENUMERATED {size12, size18}
+
+RLC-Config-v1610 ::= SEQUENCE {
+ dl-AM-RLC-v1610 DL-AM-RLC-v1610
+}
+
+DL-AM-RLC-v1610 ::= SEQUENCE {
+ t-StatusProhibit-v1610 T-StatusProhibit-v1610 OPTIONAL, -- Need N
+ ...
+}
+
+T-StatusProhibit-v1610 ::= ENUMERATED { ms1, ms2, ms3, ms4, spare4, spare3, spare2, spare1}
+
+-- TAG-RLC-CONFIG-STOP
+-- TAG-RLF-TIMERSANDCONSTANTS-START
+
+RLF-TimersAndConstants ::= SEQUENCE {
+ t310 ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000, ms4000, ms6000},
+ n310 ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+ n311 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+ ...,
+ [[
+ t311 ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000}
+ ]]
+}
+
+-- TAG-RLF-TIMERSANDCONSTANTS-STOP
+-- TAG-RNTI-VALUE-START
+
+RNTI-Value ::= INTEGER (0..65535)
+
+-- TAG-RNTI-VALUE-STOP
+-- TAG-RSRP-RANGE-START
+
+RSRP-Range ::= INTEGER(0..127)
+
+-- TAG-RSRP-RANGE-STOP
+-- TAG-RSRQ-RANGE-START
+
+RSRQ-Range ::= INTEGER(0..127)
+
+-- TAG-RSRQ-RANGE-STOP
+-- TAG-RSSI-RANGE-START
+
+RSSI-Range-r16 ::= INTEGER(0..76)
+
+-- TAG-RSSI-RANGE-STOP
+-- TAG-SCELLINDEX-START
+
+SCellIndex ::= INTEGER (1..31)
+
+-- TAG-SCELLINDEX-STOP
+-- TAG-SCHEDULINGREQUESTCONFIG-START
+
+SchedulingRequestConfig ::= SEQUENCE {
+ schedulingRequestToAddModList SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestToAddMod
+ OPTIONAL, -- Need N
+ schedulingRequestToReleaseList SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestId
+ OPTIONAL -- Need N
+}
+
+SchedulingRequestToAddMod ::= SEQUENCE {
+ schedulingRequestId SchedulingRequestId,
+ sr-ProhibitTimer ENUMERATED {ms1, ms2, ms4, ms8, ms16, ms32, ms64, ms128} OPTIONAL, -- Need S
+ sr-TransMax ENUMERATED { n4, n8, n16, n32, n64, spare3, spare2, spare1}
+}
+
+
+
+-- TAG-SCHEDULINGREQUESTCONFIG-STOP
+-- TAG-SCHEDULINGREQUESTID-START
+
+SchedulingRequestId ::= INTEGER (0..7)
+
+-- TAG-SCHEDULINGREQUESTID-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-START
+
+SchedulingRequestResourceConfig ::= SEQUENCE {
+ schedulingRequestResourceId SchedulingRequestResourceId,
+ schedulingRequestID SchedulingRequestId,
+ periodicityAndOffset CHOICE {
+ sym2 NULL,
+ sym6or7 NULL,
+ sl1 NULL, -- Recurs in every slot
+ sl2 INTEGER (0..1),
+ sl4 INTEGER (0..3),
+ sl5 INTEGER (0..4),
+ sl8 INTEGER (0..7),
+ sl10 INTEGER (0..9),
+ sl16 INTEGER (0..15),
+ sl20 INTEGER (0..19),
+ sl40 INTEGER (0..39),
+ sl80 INTEGER (0..79),
+ sl160 INTEGER (0..159),
+ sl320 INTEGER (0..319),
+ sl640 INTEGER (0..639)
+ } OPTIONAL, -- Need M
+ resource PUCCH-ResourceId OPTIONAL -- Need M
+}
+
+SchedulingRequestResourceConfig-v1610 ::= SEQUENCE {
+ phy-PriorityIndex-r16 ENUMERATED {p0, p1} OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCEID-START
+
+SchedulingRequestResourceId ::= INTEGER (1..maxNrofSR-Resources)
+
+-- TAG-SCHEDULINGREQUESTRESOURCEID-STOP
+-- TAG-SCRAMBLINGID-START
+
+ScramblingId ::= INTEGER(0..1023)
+
+-- TAG-SCRAMBLINGID-STOP
+-- TAG-SCS-SPECIFICCARRIER-START
+
+SCS-SpecificCarrier ::= SEQUENCE {
+ offsetToCarrier INTEGER (0..2199),
+ subcarrierSpacing SubcarrierSpacing,
+ carrierBandwidth INTEGER (1..maxNrofPhysicalResourceBlocks),
+ ...,
+ [[
+ txDirectCurrentLocation INTEGER (0..4095) OPTIONAL -- Need S
+ ]]
+}
+
+-- TAG-SCS-SPECIFICCARRIER-STOP
+-- TAG-SDAP-CONFIG-START
+
+SDAP-Config ::= SEQUENCE {
+ pdu-Session PDU-SessionID,
+ sdap-HeaderDL ENUMERATED {present, absent},
+ sdap-HeaderUL ENUMERATED {present, absent},
+ defaultDRB BOOLEAN,
+ mappedQoS-FlowsToAdd SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI OPTIONAL, -- Need N
+ mappedQoS-FlowsToRelease SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI OPTIONAL, -- Need N
+ ...
+}
+
+QFI ::= INTEGER (0..maxQFI)
+
+PDU-SessionID ::= INTEGER (0..255)
+
+-- TAG-SDAP-CONFIG-STOP
+-- TAG-SEARCHSPACE-START
+
+SearchSpace ::= SEQUENCE {
+ searchSpaceId SearchSpaceId,
+ controlResourceSetId ControlResourceSetId OPTIONAL, -- Cond SetupOnly
+ monitoringSlotPeriodicityAndOffset CHOICE {
+ sl1 NULL,
+ sl2 INTEGER (0..1),
+ sl4 INTEGER (0..3),
+ sl5 INTEGER (0..4),
+ sl8 INTEGER (0..7),
+ sl10 INTEGER (0..9),
+ sl16 INTEGER (0..15),
+ sl20 INTEGER (0..19),
+ sl40 INTEGER (0..39),
+ sl80 INTEGER (0..79),
+ sl160 INTEGER (0..159),
+ sl320 INTEGER (0..319),
+ sl640 INTEGER (0..639),
+ sl1280 INTEGER (0..1279),
+ sl2560 INTEGER (0..2559)
+ } OPTIONAL, -- Cond Setup
+ duration INTEGER (2..2559) OPTIONAL, -- Need R
+ monitoringSymbolsWithinSlot BIT STRING (SIZE (14)) OPTIONAL, -- Cond Setup
+ nrofCandidates SEQUENCE {
+ aggregationLevel1 ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+ aggregationLevel2 ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+ aggregationLevel4 ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+ aggregationLevel8 ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+ aggregationLevel16 ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8}
+ } OPTIONAL, -- Cond Setup
+ searchSpaceType CHOICE {
+ common SEQUENCE {
+ dci-Format0-0-AndFormat1-0 SEQUENCE {
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-0 SEQUENCE {
+ nrofCandidates-SFI SEQUENCE {
+ aggregationLevel1 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel2 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel4 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel8 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel16 ENUMERATED {n1, n2} OPTIONAL -- Need R
+ },
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-1 SEQUENCE {
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-2 SEQUENCE {
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-3 SEQUENCE {
+ dummy1 ENUMERATED {sl1, sl2, sl4, sl5, sl8, sl10, sl16, sl20} OPTIONAL, -- Cond Setup
+ dummy2 ENUMERATED {n1, n2},
+ ...
+ } OPTIONAL -- Need R
+ },
+ ue-Specific SEQUENCE {
+ dci-Formats ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1},
+ ...,
+ [[
+ dci-Formats-MT-r16 ENUMERATED {formats2-5} OPTIONAL, -- Need R
+ dci-FormatsSL-r16 ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1, formats3-0, formats3-1,
+ formats3-0-And-3-1} OPTIONAL, -- Need R
+ dci-FormatsExt-r16 ENUMERATED {formats0-2-And-1-2, formats0-1-And-1-1And-0-2-And-1-2}
+ OPTIONAL -- Need R
+ ]]
+ }
+ } OPTIONAL -- Cond Setup2
+}
+
+SearchSpaceExt-r16 ::= SEQUENCE {
+ controlResourceSetId-r16 ControlResourceSetId-r16 OPTIONAL, -- Cond SetupOnly2
+ searchSpaceType-r16 SEQUENCE {
+ common-r16 SEQUENCE {
+ dci-Format2-4-r16 SEQUENCE {
+ nrofCandidates-CI-r16 SEQUENCE {
+ aggregationLevel1-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel2-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel4-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel8-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel16-r16 ENUMERATED {n1, n2} OPTIONAL -- Need R
+ },
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-5-r16 SEQUENCE {
+ nrofCandidates-IAB-r16 SEQUENCE {
+ aggregationLevel1-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel2-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel4-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel8-r16 ENUMERATED {n1, n2} OPTIONAL, -- Need R
+ aggregationLevel16-r16 ENUMERATED {n1, n2} OPTIONAL -- Need R
+ },
+ ...
+ } OPTIONAL, -- Need R
+ dci-Format2-6-r16 SEQUENCE {
+ ...
+ } OPTIONAL, -- Need R
+ ...
+ }
+ } OPTIONAL, -- Cond Setup3
+ searchSpaceGroupIdList-r16 SEQUENCE (SIZE (1.. 2)) OF INTEGER (0..1) OPTIONAL, -- Need R
+ freqMonitorLocations-r16 BIT STRING (SIZE (5)) OPTIONAL -- Need R
+}
+
+-- TAG-SEARCHSPACE-STOP
+-- TAG-SEARCHSPACEID-START
+
+SearchSpaceId ::= INTEGER (0..maxNrofSearchSpaces-1)
+
+-- TAG-SEARCHSPACEID-STOP
+-- TAG-SEARCHSPACEZERO-START
+
+SearchSpaceZero ::= INTEGER (0..15)
+
+-- TAG-SEARCHSPACEZERO-STOP
+-- TAG-SECURITYALGORITHMCONFIG-START
+
+SecurityAlgorithmConfig ::= SEQUENCE {
+ cipheringAlgorithm CipheringAlgorithm,
+ integrityProtAlgorithm IntegrityProtAlgorithm OPTIONAL, -- Need R
+ ...
+}
+
+IntegrityProtAlgorithm ::= ENUMERATED {
+ nia0, nia1, nia2, nia3, spare4, spare3,
+ spare2, spare1, ...}
+
+CipheringAlgorithm ::= ENUMERATED {
+ nea0, nea1, nea2, nea3, spare4, spare3,
+ spare2, spare1, ...}
+
+-- TAG-SECURITYALGORITHMCONFIG-STOP
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-START
+
+SemiStaticChannelAccessConfig ::= SEQUENCE {
+ period ENUMERATED {ms1, ms2, ms2dot5, ms4, ms5, ms10}
+}
+
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-STOP
+-- TAG-SENSORLOCATIONINFO-START
+
+Sensor-LocationInfo-r16 ::= SEQUENCE {
+ sensor-MeasurementInformation-r16 OCTET STRING OPTIONAL,
+ sensor-MotionInformation-r16 OCTET STRING OPTIONAL,
+ ...
+}
+
+-- TAG-SENSORLOCATIONINFO-STOP
+-- TAG-SERVCELLINDEX-START
+
+ServCellIndex ::= INTEGER (0..maxNrofServingCells-1)
+
+-- TAG-SERVCELLINDEX-STOP
+-- TAG-SERVINGCELLCONFIG-START
+
+ServingCellConfig ::= SEQUENCE {
+ tdd-UL-DL-ConfigurationDedicated TDD-UL-DL-ConfigDedicated OPTIONAL, -- Cond TDD
+ initialDownlinkBWP BWP-DownlinkDedicated OPTIONAL, -- Need M
+ downlinkBWP-ToReleaseList SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id OPTIONAL, -- Need N
+ downlinkBWP-ToAddModList SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Downlink OPTIONAL, -- Need N
+ firstActiveDownlinkBWP-Id BWP-Id OPTIONAL, -- Cond SyncAndCellAdd
+ bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+ ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+ ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+ spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL, --Need R
+ defaultDownlinkBWP-Id BWP-Id OPTIONAL, -- Need S
+ uplinkConfig UplinkConfig OPTIONAL, -- Need M
+ supplementaryUplink UplinkConfig OPTIONAL, -- Need M
+ pdcch-ServingCellConfig SetupRelease { PDCCH-ServingCellConfig } OPTIONAL, -- Need M
+ pdsch-ServingCellConfig SetupRelease { PDSCH-ServingCellConfig } OPTIONAL, -- Need M
+ csi-MeasConfig SetupRelease { CSI-MeasConfig } OPTIONAL, -- Need M
+ sCellDeactivationTimer ENUMERATED {ms20, ms40, ms80, ms160, ms200, ms240,
+ ms320, ms400, ms480, ms520, ms640, ms720,
+ ms840, ms1280, spare2,spare1} OPTIONAL, -- Cond ServingCellWithoutPUCCH
+ crossCarrierSchedulingConfig CrossCarrierSchedulingConfig OPTIONAL, -- Need M
+ tag-Id TAG-Id,
+ dummy ENUMERATED {enabled} OPTIONAL, -- Need R
+ pathlossReferenceLinking ENUMERATED {spCell, sCell} OPTIONAL, -- Cond SCellOnly
+ servingCellMO MeasObjectId OPTIONAL, -- Cond MeasObject
+ ...,
+ [[
+ lte-CRS-ToMatchAround SetupRelease { RateMatchPatternLTE-CRS } OPTIONAL, -- Need M
+ rateMatchPatternToAddModList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern OPTIONAL, -- Need N
+ rateMatchPatternToReleaseList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL, -- Need N
+ downlinkChannelBW-PerSCS-List SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier OPTIONAL -- Need S
+ ]],
+ [[
+ supplementaryUplinkRelease ENUMERATED {true} OPTIONAL, -- Need N
+ tdd-UL-DL-ConfigurationDedicated-iab-mt-r16 TDD-UL-DL-ConfigDedicated-IAB-MT-r16 OPTIONAL, -- Cond TDD_IAB
+ dormantBWP-Config-r16 SetupRelease { DormantBWP-Config-r16 } OPTIONAL, -- Need M
+ ca-SlotOffset-r16 CHOICE {
+ refSCS15kHz INTEGER (-2..2),
+ refSCS30KHz INTEGER (-5..5),
+ refSCS60KHz INTEGER (-10..10),
+ refSCS120KHz INTEGER (-20..20)
+ } OPTIONAL, -- Cond AsyncCA
+ channelAccessConfig-r16 SetupRelease { ChannelAccessConfig-r16 } OPTIONAL, -- Need M
+ intraCellGuardBandsUL-r16 IntraCellGuardBands-r16 OPTIONAL, -- Need S
+ intraCellGuardBandsDL-r16 IntraCellGuardBands-r16 OPTIONAL, -- Need S
+ csi-RS-ValidationWith-DCI-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ lte-CRS-PatternList1-r16 SetupRelease { LTE-CRS-PatternList-r16 } OPTIONAL, -- Need M
+ lte-CRS-PatternList2-r16 SetupRelease { LTE-CRS-PatternList-r16 } OPTIONAL, -- Need M
+ crs-RateMatch-PerCORESETPoolIndex-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableTwoDefaultTCIStates-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableDefaultTCIStatePerCoresetPoolIndex-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableBeamSwitchTiming-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ cbg-TxDiffTBsProcessingType1-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ cbg-TxDiffTBsProcessingType2-r16 ENUMERATED {enabled} OPTIONAL -- Need R
+ ]]
+}
+
+UplinkConfig ::= SEQUENCE {
+ initialUplinkBWP BWP-UplinkDedicated OPTIONAL, -- Need M
+ uplinkBWP-ToReleaseList SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id OPTIONAL, -- Need N
+ uplinkBWP-ToAddModList SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Uplink OPTIONAL, -- Need N
+ firstActiveUplinkBWP-Id BWP-Id OPTIONAL, -- Cond SyncAndCellAdd
+ pusch-ServingCellConfig SetupRelease { PUSCH-ServingCellConfig } OPTIONAL, -- Need M
+ carrierSwitching SetupRelease { SRS-CarrierSwitching } OPTIONAL, -- Need M
+ ...,
+ [[
+ powerBoostPi2BPSK BOOLEAN OPTIONAL, -- Need M
+ uplinkChannelBW-PerSCS-List SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier OPTIONAL -- Need S
+ ]],
+ [[
+ enablePLRS-UpdateForPUSCH-SRS-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableDefaultBeamPL-ForPUSCH0-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableDefaultBeamPL-ForPUCCH-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ enableDefaultBeamPL-ForSRS-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ uplinkTxSwitching-r16 SetupRelease { UplinkTxSwitching-r16 } OPTIONAL -- Need M
+ ]]
+}
+
+ChannelAccessConfig-r16 ::= SEQUENCE {
+ maxEnergyDetectionThreshold-r16 INTEGER(-85..-52),
+ energyDetectionThresholdOffset-r16 INTEGER (-20..-13),
+ ul-toDL-COT-SharingED-Threshold-r16 INTEGER (-85..-52) OPTIONAL, -- Need R
+ absenceOfAnyOtherTechnology-r16 ENUMERATED {true} OPTIONAL -- Need R
+}
+
+IntraCellGuardBands-r16 ::= SEQUENCE (SIZE (1..4)) OF GuardBand-r16
+
+GuardBand-r16 ::= SEQUENCE {
+ startCRB-r16 INTEGER (0..274),
+ nrofCRBs-r16 INTEGER (0..15)
+}
+
+DormancyGroupID-r16 ::= INTEGER (0..4)
+
+DormantBWP-Config-r16::= SEQUENCE {
+ dormantBWP-Id-r16 BWP-Id OPTIONAL, -- Need M
+ withinActiveTimeConfig-r16 SetupRelease { WithinActiveTimeConfig-r16 } OPTIONAL, -- Need M
+ outsideActiveTimeConfig-r16 SetupRelease { OutsideActiveTimeConfig-r16 } OPTIONAL -- Need M
+}
+
+WithinActiveTimeConfig-r16 ::= SEQUENCE {
+ firstWithinActiveTimeBWP-Id-r16 BWP-Id OPTIONAL, -- Need M
+ dormancyGroupWithinActiveTime-r16 DormancyGroupID-r16 OPTIONAL -- Need R
+}
+
+OutsideActiveTimeConfig-r16 ::= SEQUENCE {
+ firstOutsideActiveTimeBWP-Id-r16 BWP-Id OPTIONAL, -- Need M
+ dormancyGroupOutsideActiveTime-r16 DormancyGroupID-r16 OPTIONAL -- Need R
+}
+
+UplinkTxSwitching-r16 ::= SEQUENCE {
+ uplinkTxSwitchingPeriodLocation-r16 BOOLEAN,
+ uplinkTxSwitchingCarrier-r16 ENUMERATED {carrier1, carrier2}
+}
+
+-- TAG-SERVINGCELLCONFIG-STOP
+-- TAG-SERVINGCELLCONFIGCOMMON-START
+
+ServingCellConfigCommon ::= SEQUENCE {
+ physCellId PhysCellId OPTIONAL, -- Cond HOAndServCellAdd,
+ downlinkConfigCommon DownlinkConfigCommon OPTIONAL, -- Cond HOAndServCellAdd
+ uplinkConfigCommon UplinkConfigCommon OPTIONAL, -- Need M
+ supplementaryUplinkConfig UplinkConfigCommon OPTIONAL, -- Need S
+ n-TimingAdvanceOffset ENUMERATED { n0, n25600, n39936 } OPTIONAL, -- Need S
+ ssb-PositionsInBurst CHOICE {
+ shortBitmap BIT STRING (SIZE (4)),
+ mediumBitmap BIT STRING (SIZE (8)),
+ longBitmap BIT STRING (SIZE (64))
+ } OPTIONAL, -- Cond AbsFreqSSB
+ ssb-periodicityServingCell ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2, spare1 } OPTIONAL, -- Need S
+ dmrs-TypeA-Position ENUMERATED {pos2, pos3},
+ lte-CRS-ToMatchAround SetupRelease { RateMatchPatternLTE-CRS } OPTIONAL, -- Need M
+ rateMatchPatternToAddModList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern OPTIONAL, -- Need N
+ rateMatchPatternToReleaseList SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL, -- Need N
+ ssbSubcarrierSpacing SubcarrierSpacing OPTIONAL, -- Cond HOAndServCellWithSSB
+ tdd-UL-DL-ConfigurationCommon TDD-UL-DL-ConfigCommon OPTIONAL, -- Cond TDD
+ ss-PBCH-BlockPower INTEGER (-60..50),
+ ...,
+ [[
+ channelAccessMode-r16 CHOICE {
+ dynamic NULL,
+ semiStatic SemiStaticChannelAccessConfig
+ } OPTIONAL, -- Cond SharedSpectrum
+ discoveryBurstWindowLength-r16 ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5} OPTIONAL, -- Need M
+ ssb-PositionQCL-r16 SSB-PositionQCL-Relation-r16 OPTIONAL, -- Cond SharedSpectrum
+ highSpeedConfig-r16 HighSpeedConfig-r16 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMON-STOP
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-START
+
+ServingCellConfigCommonSIB ::= SEQUENCE {
+ downlinkConfigCommon DownlinkConfigCommonSIB,
+ uplinkConfigCommon UplinkConfigCommonSIB OPTIONAL, -- Need R
+ supplementaryUplink UplinkConfigCommonSIB OPTIONAL, -- Need R
+ n-TimingAdvanceOffset ENUMERATED { n0, n25600, n39936 } OPTIONAL, -- Need S
+ ssb-PositionsInBurst SEQUENCE {
+ inOneGroup BIT STRING (SIZE (8)),
+ groupPresence BIT STRING (SIZE (8)) OPTIONAL -- Cond FR2-Only
+ },
+ ssb-PeriodicityServingCell ENUMERATED {ms5, ms10, ms20, ms40, ms80, ms160},
+ tdd-UL-DL-ConfigurationCommon TDD-UL-DL-ConfigCommon OPTIONAL, -- Cond TDD
+ ss-PBCH-BlockPower INTEGER (-60..50),
+ ...,
+ [[
+ channelAccessMode-r16 CHOICE {
+ dynamic NULL,
+ semiStatic SemiStaticChannelAccessConfig
+ } OPTIONAL, -- Cond SharedSpectrum
+ discoveryBurstWindowLength-r16 ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5} OPTIONAL, -- Need R
+ highSpeedConfig-r16 HighSpeedConfig-r16 OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-STOP
+-- TAG-SHORTI-RNTI-VALUE-START
+
+ShortI-RNTI-Value ::= BIT STRING (SIZE(24))
+
+-- TAG-SHORTI-RNTI-VALUE-STOP
+-- TAG-SHORTMAC-I-START
+
+ShortMAC-I ::= BIT STRING (SIZE (16))
+
+-- TAG-SHORTMAC-I-STOP
+-- TAG-SINR-RANGE-START
+
+SINR-Range ::= INTEGER(0..127)
+
+-- TAG-SINR-RANGE-STOP
+-- TAG-SI-REQUESTCONFIG-START
+
+SI-RequestConfig::= SEQUENCE {
+ rach-OccasionsSI SEQUENCE {
+ rach-ConfigSI RACH-ConfigGeneric,
+ ssb-perRACH-Occasion ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+ } OPTIONAL, -- Need R
+ si-RequestPeriod ENUMERATED {one, two, four, six, eight, ten, twelve, sixteen} OPTIONAL, -- Need R
+ si-RequestResources SEQUENCE (SIZE (1..maxSI-Message)) OF SI-RequestResources
+}
+
+SI-RequestResources ::= SEQUENCE {
+ ra-PreambleStartIndex INTEGER (0..63),
+ ra-AssociationPeriodIndex INTEGER (0..15) OPTIONAL, -- Need R
+ ra-ssb-OccasionMaskIndex INTEGER (0..15) OPTIONAL -- Need R
+}
+
+-- TAG-SI-SCHEDULINGINFO-START
+
+SI-SchedulingInfo ::= SEQUENCE {
+ schedulingInfoList SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo,
+ si-WindowLength ENUMERATED {s5, s10, s20, s40, s80, s160, s320, s640, s1280},
+ si-RequestConfig SI-RequestConfig OPTIONAL, -- Cond MSG-1
+ si-RequestConfigSUL SI-RequestConfig OPTIONAL, -- Cond SUL-MSG-1
+ systemInformationAreaID BIT STRING (SIZE (24)) OPTIONAL, -- Need R
+ ...
+}
+
+SchedulingInfo ::= SEQUENCE {
+ si-BroadcastStatus ENUMERATED {broadcasting, notBroadcasting},
+ si-Periodicity ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+ sib-MappingInfo SIB-Mapping
+}
+
+SIB-Mapping ::= SEQUENCE (SIZE (1..maxSIB)) OF SIB-TypeInfo
+
+SIB-TypeInfo ::= SEQUENCE {
+ type ENUMERATED {sibType2, sibType3, sibType4, sibType5, sibType6, sibType7, sibType8, sibType9,
+ sibType10-v1610, sibType11-v1610, sibType12-v1610, sibType13-v1610, sibType14-v1610,
+ spare3, spare2, spare1,... },
+ valueTag INTEGER (0..31) OPTIONAL, -- Cond SIB-TYPE
+ areaScope ENUMERATED {true} OPTIONAL -- Need S
+}
+
+-- TAG-SI-SCHEDULINGINFO-STOP
+-- TAG-SKCOUNTER-START
+
+SK-Counter ::= INTEGER (0..65535)
+
+-- TAG-SKCOUNTER-STOP
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-START
+
+SlotFormatCombinationsPerCell ::= SEQUENCE {
+ servingCellId ServCellIndex,
+ subcarrierSpacing SubcarrierSpacing,
+ subcarrierSpacing2 SubcarrierSpacing OPTIONAL, -- Need R
+ slotFormatCombinations SEQUENCE (SIZE (1..maxNrofSlotFormatCombinationsPerSet)) OF SlotFormatCombination
+ OPTIONAL, -- Need M
+ positionInDCI INTEGER(0..maxSFI-DCI-PayloadSize-1) OPTIONAL, -- Need M
+ ...,
+ [[
+ enableConfiguredUL-r16 ENUMERATED {enabled} OPTIONAL -- Need R
+ ]]
+
+}
+
+SlotFormatCombination ::= SEQUENCE {
+ slotFormatCombinationId SlotFormatCombinationId,
+ slotFormats SEQUENCE (SIZE (1..maxNrofSlotFormatsPerCombination)) OF INTEGER (0..255)
+}
+
+SlotFormatCombinationId ::= INTEGER (0..maxNrofSlotFormatCombinationsPerSet-1)
+
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-STOP
+-- TAG-SLOTFORMATINDICATOR-START
+
+SlotFormatIndicator ::= SEQUENCE {
+ sfi-RNTI RNTI-Value,
+ dci-PayloadSize INTEGER (1..maxSFI-DCI-PayloadSize),
+ slotFormatCombToAddModList SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF SlotFormatCombinationsPerCell
+ OPTIONAL, -- Need N
+ slotFormatCombToReleaseList SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex OPTIONAL, -- Need N
+ ...,
+ [[
+ availableRB-SetsToAddModList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF AvailableRB-SetsPerCell-r16 OPTIONAL, -- Need N
+ availableRB-SetsToRelease-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex OPTIONAL, -- Need N
+ searchSpaceSwitchTriggerToAddModList-r16 SEQUENCE (SIZE(1..4)) OF SearchSpaceSwitchTrigger-r16 OPTIONAL, -- Need N
+ searchSpaceSwitchTriggerToReleaseList-r16 SEQUENCE (SIZE(1..4)) OF ServCellIndex OPTIONAL, -- Need N
+ co-DurationsPerCellToAddModList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF CO-DurationsPerCell-r16 OPTIONAL, -- Need N
+ co-DurationsPerCellToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex OPTIONAL -- Need N
+ ]]
+}
+
+CO-DurationsPerCell-r16 ::= SEQUENCE {
+ servingCellId-r16 ServCellIndex,
+ positionInDCI-r16 INTEGER(0..maxSFI-DCI-PayloadSize-1),
+ subcarrierSpacing-r16 SubcarrierSpacing,
+ co-DurationList-r16 SEQUENCE (SIZE(1..64)) OF CO-Duration-r16
+}
+
+CO-Duration-r16 ::= INTEGER (0..1120)
+
+AvailableRB-SetsPerCell-r16 ::= SEQUENCE {
+ servingCellId-r16 ServCellIndex,
+ positionInDCI-r16 INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+SearchSpaceSwitchTrigger-r16 ::= SEQUENCE {
+ servingCellId-r16 ServCellIndex,
+ positionInDCI-r16 INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+-- TAG-SLOTFORMATINDICATOR-STOP
+-- TAG-S-NSSAI-START
+
+S-NSSAI ::= CHOICE{
+ sst BIT STRING (SIZE (8)),
+ sst-SD BIT STRING (SIZE (32))
+}
+
+-- TAG-S-NSSAI-STOP
+-- TAG-SPEEDSTATESCALEFACTORS-START
+
+SpeedStateScaleFactors ::= SEQUENCE {
+ sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0},
+ sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0}
+}
+-- TAG-SPEEDSTATESCALEFACTORS-STOP
+-- TAG-SPS-CONFIG-START
+
+SPS-Config ::= SEQUENCE {
+ periodicity ENUMERATED {ms10, ms20, ms32, ms40, ms64, ms80, ms128, ms160, ms320, ms640,
+ spare6, spare5, spare4, spare3, spare2, spare1},
+ nrofHARQ-Processes INTEGER (1..8),
+ n1PUCCH-AN PUCCH-ResourceId OPTIONAL, -- Need M
+ mcs-Table ENUMERATED {qam64LowSE} OPTIONAL, -- Need S
+ ...,
+ [[
+ sps-ConfigIndex-r16 SPS-ConfigIndex-r16 OPTIONAL, -- Cond SPS-List
+ harq-ProcID-Offset-r16 INTEGER (0..15) OPTIONAL, -- Need R
+ periodicityExt-r16 INTEGER (1..5120) OPTIONAL, -- Need R
+ harq-CodebookID-r16 INTEGER (1..2) OPTIONAL, -- Need R
+ pdsch-AggregationFactor-r16 ENUMERATED {n1, n2, n4, n8 } OPTIONAL -- Need S
+ ]]
+}
+
+-- TAG-SPS-CONFIG-STOP
+-- TAG-SPS-CONFIGINDEX-START
+
+SPS-ConfigIndex-r16 ::= INTEGER (0.. maxNrofSPS-Config-r16-1)
+
+-- TAG-SPS-CONFIGINDEX-STOP
+-- TAG-SPS-PUCCH-AN-START
+
+SPS-PUCCH-AN-r16 ::= SEQUENCE {
+ sps-PUCCH-AN-ResourceID-r16 PUCCH-ResourceId,
+ maxPayloadSize-r16 INTEGER (4..256) OPTIONAL -- Need R
+}
+
+-- TAG-SPS-PUCCH-AN-STOP
+-- TAG-SPS-PUCCH-AN-LIST-START
+
+SPS-PUCCH-AN-List-r16 ::= SEQUENCE (SIZE(1..4)) OF SPS-PUCCH-AN-r16
+
+-- TAG-SPS-PUCCH-AN-LIST-STOP
+-- TAG-SRB-IDENTITY-START
+
+SRB-Identity ::= INTEGER (1..3)
+
+-- TAG-SRB-IDENTITY-STOP
+-- TAG-SRS-CARRIERSWITCHING-START
+
+SRS-CarrierSwitching ::= SEQUENCE {
+ srs-SwitchFromServCellIndex INTEGER (0..31) OPTIONAL, -- Need M
+ srs-SwitchFromCarrier ENUMERATED {sUL, nUL},
+ srs-TPC-PDCCH-Group CHOICE {
+ typeA SEQUENCE (SIZE (1..32)) OF SRS-TPC-PDCCH-Config,
+ typeB SRS-TPC-PDCCH-Config
+ } OPTIONAL, -- Need M
+ monitoringCells SEQUENCE (SIZE (1..maxNrofServingCells)) OF ServCellIndex OPTIONAL, -- Need M
+ ...
+}
+
+SRS-TPC-PDCCH-Config ::= SEQUENCE {
+ srs-CC-SetIndexlist SEQUENCE (SIZE(1..4)) OF SRS-CC-SetIndex OPTIONAL -- Need M
+}
+
+SRS-CC-SetIndex ::= SEQUENCE {
+ cc-SetIndex INTEGER (0..3) OPTIONAL, -- Need M
+ cc-IndexInOneCC-Set INTEGER (0..7) OPTIONAL -- Need M
+}
+
+-- TAG-SRS-CARRIERSWITCHING-STOP
+-- TAG-SRS-CONFIG-START
+
+SRS-Config ::= SEQUENCE {
+ srs-ResourceSetToReleaseList SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId OPTIONAL, -- Need N
+ srs-ResourceSetToAddModList SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet OPTIONAL, -- Need N
+ srs-ResourceToReleaseList SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-ResourceId OPTIONAL, -- Need N
+ srs-ResourceToAddModList SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-Resource OPTIONAL, -- Need N
+ tpc-Accumulation ENUMERATED {disabled} OPTIONAL, -- Need S
+ ...,
+ [[
+ srs-RequestForDCI-Format1-2-r16 INTEGER (1..2) OPTIONAL, -- Need S
+ srs-RequestForDCI-Format0-2-r16 INTEGER (1..2) OPTIONAL, -- Need S
+ srs-ResourceSetToAddModListForDCI-Format0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet OPTIONAL, -- Need N
+ srs-ResourceSetToReleaseListForDCI-Format0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId OPTIONAL,-- Need N
+ srs-PosResourceSetToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSetId-r16
+ OPTIONAL, -- Need N
+ srs-PosResourceSetToAddModList-r16 SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSet-r16 OPTIONAL,-- Need N
+ srs-PosResourceToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResourceId-r16 OPTIONAL,-- Need N
+ srs-PosResourceToAddModList-r16 SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResource-r16 OPTIONAL -- Need N
+ ]]
+}
+
+SRS-ResourceSet ::= SEQUENCE {
+ srs-ResourceSetId SRS-ResourceSetId,
+ srs-ResourceIdList SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-ResourceId OPTIONAL, -- Cond Setup
+ resourceType CHOICE {
+ aperiodic SEQUENCE {
+ aperiodicSRS-ResourceTrigger INTEGER (1..maxNrofSRS-TriggerStates-1),
+ csi-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
+ slotOffset INTEGER (1..32) OPTIONAL, -- Need S
+ ...,
+ [[
+ aperiodicSRS-ResourceTriggerList SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-2))
+ OF INTEGER (1..maxNrofSRS-TriggerStates-1) OPTIONAL -- Need M
+ ]]
+ },
+ semi-persistent SEQUENCE {
+ associatedCSI-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
+ ...
+ },
+ periodic SEQUENCE {
+ associatedCSI-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
+ ...
+ }
+ },
+ usage ENUMERATED {beamManagement, codebook, nonCodebook, antennaSwitching},
+ alpha Alpha OPTIONAL, -- Need S
+ p0 INTEGER (-202..24) OPTIONAL, -- Cond Setup
+ pathlossReferenceRS PathlossReferenceRS-Config OPTIONAL, -- Need M
+ srs-PowerControlAdjustmentStates ENUMERATED { sameAsFci2, separateClosedLoop} OPTIONAL, -- Need S
+ ...,
+ [[
+ pathlossReferenceRSList-r16 SetupRelease { PathlossReferenceRSList-r16} OPTIONAL -- Need M
+ ]]
+}
+
+PathlossReferenceRS-Config ::= CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId
+}
+
+PathlossReferenceRSList-r16 ::= SEQUENCE (SIZE (1..maxNrofSRS-PathlossReferenceRS-r16)) OF PathlossReferenceRS-r16
+
+PathlossReferenceRS-r16 ::= SEQUENCE {
+ srs-PathlossReferenceRS-Id-r16 SRS-PathlossReferenceRS-Id-r16,
+ pathlossReferenceRS-r16 PathlossReferenceRS-Config
+}
+
+SRS-PathlossReferenceRS-Id-r16 ::= INTEGER (0..maxNrofSRS-PathlossReferenceRS-1-r16)
+
+SRS-PosResourceSet-r16 ::= SEQUENCE {
+ srs-PosResourceSetId-r16 SRS-PosResourceSetId-r16,
+ srs-PosResourceIdList-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-PosResourceId-r16
+ OPTIONAL, -- Cond Setup
+ resourceType-r16 CHOICE {
+ aperiodic-r16 SEQUENCE {
+ aperiodicSRS-ResourceTriggerList-r16 SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-1))
+ OF INTEGER (1..maxNrofSRS-TriggerStates-1) OPTIONAL, -- Need M
+ ...
+ },
+ semi-persistent-r16 SEQUENCE {
+ ...
+ },
+ periodic-r16 SEQUENCE {
+ ...
+ }
+ },
+ alpha-r16 Alpha OPTIONAL, -- Need S
+ p0-r16 INTEGER (-202..24) OPTIONAL, -- Cond Setup
+ pathlossReferenceRS-Pos-r16 CHOICE {
+ ssb-IndexServing-r16 SSB-Index,
+ ssb-Ncell-r16 SSB-InfoNcell-r16,
+ dl-PRS-r16 DL-PRS-Info-r16
+ } OPTIONAL, -- Need M
+ ...
+}
+
+SRS-ResourceSetId ::= INTEGER (0..maxNrofSRS-ResourceSets-1)
+
+SRS-PosResourceSetId-r16 ::= INTEGER (0..maxNrofSRS-PosResourceSets-1-r16)
+
+SRS-Resource ::= SEQUENCE {
+ srs-ResourceId SRS-ResourceId,
+ nrofSRS-Ports ENUMERATED {port1, ports2, ports4},
+ ptrs-PortIndex ENUMERATED {n0, n1 } OPTIONAL, -- Need R
+ transmissionComb CHOICE {
+ n2 SEQUENCE {
+ combOffset-n2 INTEGER (0..1),
+ cyclicShift-n2 INTEGER (0..7)
+ },
+ n4 SEQUENCE {
+ combOffset-n4 INTEGER (0..3),
+ cyclicShift-n4 INTEGER (0..11)
+ }
+ },
+ resourceMapping SEQUENCE {
+ startPosition INTEGER (0..5),
+ nrofSymbols ENUMERATED {n1, n2, n4},
+ repetitionFactor ENUMERATED {n1, n2, n4}
+ },
+ freqDomainPosition INTEGER (0..67),
+ freqDomainShift INTEGER (0..268),
+ freqHopping SEQUENCE {
+ c-SRS INTEGER (0..63),
+ b-SRS INTEGER (0..3),
+ b-hop INTEGER (0..3)
+ },
+ groupOrSequenceHopping ENUMERATED { neither, groupHopping, sequenceHopping },
+ resourceType CHOICE {
+ aperiodic SEQUENCE {
+ ...
+ },
+ semi-persistent SEQUENCE {
+ periodicityAndOffset-sp SRS-PeriodicityAndOffset,
+ ...
+ },
+ periodic SEQUENCE {
+ periodicityAndOffset-p SRS-PeriodicityAndOffset,
+ ...
+ }
+ },
+ sequenceId INTEGER (0..1023),
+ spatialRelationInfo SRS-SpatialRelationInfo OPTIONAL, -- Need R
+ ...,
+ [[
+ resourceMapping-r16 SEQUENCE {
+ startPosition-r16 INTEGER (0..13),
+ nrofSymbols-r16 ENUMERATED {n1, n2, n4},
+ repetitionFactor-r16 ENUMERATED {n1, n2, n4}
+ } OPTIONAL -- Need R
+ ]]
+
+}
+
+SRS-PosResource-r16::= SEQUENCE {
+ srs-PosResourceId-r16 SRS-PosResourceId-r16,
+ transmissionComb-r16 CHOICE {
+ n2-r16 SEQUENCE {
+ combOffset-n2-r16 INTEGER (0..1),
+ cyclicShift-n2-r16 INTEGER (0..7)
+ },
+ n4-r16 SEQUENCE {
+ combOffset-n4-16 INTEGER (0..3),
+ cyclicShift-n4-r16 INTEGER (0..11)
+ },
+ n8-r16 SEQUENCE {
+ combOffset-n8-r16 INTEGER (0..7),
+ cyclicShift-n8-r16 INTEGER (0..5)
+ },
+ ...
+ },
+ resourceMapping-r16 SEQUENCE {
+ startPosition-r16 INTEGER (0..13),
+ nrofSymbols-r16 ENUMERATED {n1, n2, n4, n8, n12}
+ },
+ freqDomainShift-r16 INTEGER (0..268),
+ freqHopping-r16 SEQUENCE {
+ c-SRS-r16 INTEGER (0..63),
+ ...
+ },
+ groupOrSequenceHopping-r16 ENUMERATED { neither, groupHopping, sequenceHopping },
+ resourceType-r16 CHOICE {
+ aperiodic-r16 SEQUENCE {
+ slotOffset-r16 INTEGER (1..32) OPTIONAL, -- Need S
+ ...
+ },
+ semi-persistent-r16 SEQUENCE {
+ periodicityAndOffset-sp-r16 SRS-PeriodicityAndOffset-r16,
+ ...
+ },
+ periodic-r16 SEQUENCE {
+ periodicityAndOffset-p-r16 SRS-PeriodicityAndOffset-r16,
+ ...
+ }
+ },
+ sequenceId-r16 INTEGER (0..65535),
+ spatialRelationInfoPos-r16 SRS-SpatialRelationInfoPos-r16 OPTIONAL, -- Need R
+ ...
+}
+
+SRS-SpatialRelationInfo ::= SEQUENCE {
+ servingCellId ServCellIndex OPTIONAL, -- Need S
+ referenceSignal CHOICE {
+ ssb-Index SSB-Index,
+ csi-RS-Index NZP-CSI-RS-ResourceId,
+ srs SEQUENCE {
+ resourceId SRS-ResourceId,
+ uplinkBWP BWP-Id
+ }
+ }
+}
+
+SRS-SpatialRelationInfoPos-r16 ::= CHOICE {
+ servingRS-r16 SEQUENCE {
+ servingCellId ServCellIndex OPTIONAL, -- Need S
+ referenceSignal-r16 CHOICE {
+ ssb-IndexServing-r16 SSB-Index,
+ csi-RS-IndexServing-r16 NZP-CSI-RS-ResourceId,
+ srs-SpatialRelation-r16 SEQUENCE {
+ resourceSelection-r16 CHOICE {
+ srs-ResourceId-r16 SRS-ResourceId,
+ srs-PosResourceId-r16 SRS-PosResourceId-r16
+ },
+ uplinkBWP-r16 BWP-Id
+ }
+ }
+ },
+ ssb-Ncell-r16 SSB-InfoNcell-r16,
+ dl-PRS-r16 DL-PRS-Info-r16
+}
+
+SSB-Configuration-r16 ::= SEQUENCE {
+ ssb-Freq-r16 ARFCN-ValueNR,
+ halfFrameIndex-r16 ENUMERATED {zero, one},
+ ssbSubcarrierSpacing-r16 SubcarrierSpacing,
+ ssb-Periodicity-r16 ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2,spare1 } OPTIONAL, -- Need S
+ sfn0-Offset-r16 SEQUENCE {
+ sfn-Offset-r16 INTEGER (0..1023),
+ integerSubframeOffset-r16 INTEGER (0..9) OPTIONAL -- Need R
+ } OPTIONAL, -- Need R
+ sfn-SSB-Offset-r16 INTEGER (0..15),
+ ss-PBCH-BlockPower-r16 INTEGER (-60..50) OPTIONAL -- Cond Pathloss
+}
+
+SSB-InfoNcell-r16 ::= SEQUENCE {
+ physicalCellId-r16 PhysCellId,
+ ssb-IndexNcell-r16 SSB-Index OPTIONAL, -- Need S
+ ssb-Configuration-r16 SSB-Configuration-r16 OPTIONAL -- Need S
+}
+
+DL-PRS-Info-r16 ::= SEQUENCE {
+ dl-PRS-ID-r16 INTEGER (0..255),
+ dl-PRS-ResourceSetId-r16 INTEGER (0..7),
+ dl-PRS-ResourceId-r16 INTEGER (0..63) OPTIONAL -- Need S
+}
+
+SRS-ResourceId ::= INTEGER (0..maxNrofSRS-Resources-1)
+SRS-PosResourceId-r16 ::= INTEGER (0..maxNrofSRS-PosResources-1-r16)
+
+SRS-PeriodicityAndOffset ::= CHOICE {
+ sl1 NULL,
+ sl2 INTEGER(0..1),
+ sl4 INTEGER(0..3),
+ sl5 INTEGER(0..4),
+ sl8 INTEGER(0..7),
+ sl10 INTEGER(0..9),
+ sl16 INTEGER(0..15),
+ sl20 INTEGER(0..19),
+ sl32 INTEGER(0..31),
+ sl40 INTEGER(0..39),
+ sl64 INTEGER(0..63),
+ sl80 INTEGER(0..79),
+ sl160 INTEGER(0..159),
+ sl320 INTEGER(0..319),
+ sl640 INTEGER(0..639),
+ sl1280 INTEGER(0..1279),
+ sl2560 INTEGER(0..2559)
+}
+
+SRS-PeriodicityAndOffset-r16 ::= CHOICE {
+ sl1 NULL,
+ sl2 INTEGER(0..1),
+ sl4 INTEGER(0..3),
+ sl5 INTEGER(0..4),
+ sl8 INTEGER(0..7),
+ sl10 INTEGER(0..9),
+ sl16 INTEGER(0..15),
+ sl20 INTEGER(0..19),
+ sl32 INTEGER(0..31),
+ sl40 INTEGER(0..39),
+ sl64 INTEGER(0..63),
+ sl80 INTEGER(0..79),
+ sl160 INTEGER(0..159),
+ sl320 INTEGER(0..319),
+ sl640 INTEGER(0..639),
+ sl1280 INTEGER(0..1279),
+ sl2560 INTEGER(0..2559),
+ sl5120 INTEGER(0..5119),
+ sl10240 INTEGER(0..10239),
+ sl40960 INTEGER(0..40959),
+ sl81920 INTEGER(0..81919),
+ ...
+}
+
+-- TAG-SRS-CONFIG-STOP
+-- TAG-SRS-RSRP-RANGE-START
+
+SRS-RSRP-Range-r16 ::= INTEGER(0..98)
+
+-- TAG-SRS-RSRP-RANGE-STOP
+-- TAG-SRS-TPC-COMMANDCONFIG-START
+
+SRS-TPC-CommandConfig ::= SEQUENCE {
+ startingBitOfFormat2-3 INTEGER (1..31) OPTIONAL, -- Need R
+ fieldTypeFormat2-3 INTEGER (0..1) OPTIONAL, -- Need R
+ ...,
+ [[
+ startingBitOfFormat2-3SUL INTEGER (1..31) OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-SRS-TPC-COMMANDCONFIG-STOP
+-- TAG-SSB-INDEX-START
+
+SSB-Index ::= INTEGER (0..maxNrofSSBs-1)
+
+-- TAG-SSB-INDEX-STOP
+-- TAG-SSB-MTC-START
+
+SSB-MTC ::= SEQUENCE {
+ periodicityAndOffset CHOICE {
+ sf5 INTEGER (0..4),
+ sf10 INTEGER (0..9),
+ sf20 INTEGER (0..19),
+ sf40 INTEGER (0..39),
+ sf80 INTEGER (0..79),
+ sf160 INTEGER (0..159)
+ },
+ duration ENUMERATED { sf1, sf2, sf3, sf4, sf5 }
+}
+
+SSB-MTC2 ::= SEQUENCE {
+ pci-List SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId OPTIONAL, -- Need M
+ periodicity ENUMERATED {sf5, sf10, sf20, sf40, sf80, spare3, spare2, spare1}
+}
+
+SSB-MTC2-LP-r16 ::= SEQUENCE {
+ pci-List SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId OPTIONAL, -- Need R
+ periodicity ENUMERATED {sf10, sf20, sf40, sf80, sf160, spare3, spare2, spare1}
+}
+
+SSB-MTC3-r16 ::= SEQUENCE {
+ periodicityAndOffset-r16 CHOICE {
+ sf5-r16 INTEGER (0..4),
+ sf10-r16 INTEGER (0..9),
+ sf20-r16 INTEGER (0..19),
+ sf40-r16 INTEGER (0..39),
+ sf80-r16 INTEGER (0..79),
+ sf160-r16 INTEGER (0..159),
+ sf320-r16 INTEGER (0..319),
+ sf640-r16 INTEGER (0..639),
+ sf1280-r16 INTEGER (0..1279)
+ },
+ duration-r16 ENUMERATED {sf1, sf2, sf3, sf4, sf5},
+ pci-List-r16 SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId OPTIONAL, -- Need M
+ ssb-ToMeasure-r16 SetupRelease { SSB-ToMeasure } OPTIONAL -- Need M
+}
+
+
+-- TAG-SSB-MTC-STOP
+-- TAG-SSB-POSITIONQCL-RELATION-START
+
+SSB-PositionQCL-Relation-r16 ::= ENUMERATED {n1,n2,n4,n8}
+
+-- TAG-SSB-POSITIONQCL-RELATION-STOP
+-- TAG-SSB-TOMEASURE-START
+
+SSB-ToMeasure ::= CHOICE {
+ shortBitmap BIT STRING (SIZE (4)),
+ mediumBitmap BIT STRING (SIZE (8)),
+ longBitmap BIT STRING (SIZE (64))
+}
+
+-- TAG-SSB-TOMEASURE-STOP
+-- TAG-SS-RSSI-MEASUREMENT-START
+
+SS-RSSI-Measurement ::= SEQUENCE {
+ measurementSlots BIT STRING (SIZE (1..80)),
+ endSymbol INTEGER(0..3)
+}
+
+-- TAG-SS-RSSI-MEASUREMENT-STOP
+-- TAG-SUBCARRIERSPACING-START
+
+SubcarrierSpacing ::= ENUMERATED {kHz15, kHz30, kHz60, kHz120, kHz240, spare3, spare2, spare1}
+
+-- TAG-SUBCARRIERSPACING-STOP
+-- TAG-TAG-CONFIG-START
+
+TAG-Config ::= SEQUENCE {
+ tag-ToReleaseList SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG-Id OPTIONAL, -- Need N
+ tag-ToAddModList SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG OPTIONAL -- Need N
+}
+
+TAG ::= SEQUENCE {
+ tag-Id TAG-Id,
+ timeAlignmentTimer TimeAlignmentTimer,
+ ...
+}
+
+TAG-Id ::= INTEGER (0..maxNrofTAGs-1)
+
+TimeAlignmentTimer ::= ENUMERATED {ms500, ms750, ms1280, ms1920, ms2560, ms5120, ms10240, infinity}
+
+-- TAG-TAG-CONFIG-STOP
+-- TAG-TCI-STATE-START
+
+TCI-State ::= SEQUENCE {
+ tci-StateId TCI-StateId,
+ qcl-Type1 QCL-Info,
+ qcl-Type2 QCL-Info OPTIONAL, -- Need R
+ ...
+}
+
+QCL-Info ::= SEQUENCE {
+ cell ServCellIndex OPTIONAL, -- Need R
+ bwp-Id BWP-Id OPTIONAL, -- Cond CSI-RS-Indicated
+ referenceSignal CHOICE {
+ csi-rs NZP-CSI-RS-ResourceId,
+ ssb SSB-Index
+ },
+ qcl-Type ENUMERATED {typeA, typeB, typeC, typeD},
+ ...
+}
+
+-- TAG-TCI-STATE-STOP
+-- TAG-TCI-STATEID-START
+
+TCI-StateId ::= INTEGER (0..maxNrofTCI-States-1)
+
+-- TAG-TCI-STATEID-STOP
+-- TAG-TDD-UL-DL-CONFIGCOMMON-START
+
+TDD-UL-DL-ConfigCommon ::= SEQUENCE {
+ referenceSubcarrierSpacing SubcarrierSpacing,
+ pattern1 TDD-UL-DL-Pattern,
+ pattern2 TDD-UL-DL-Pattern OPTIONAL, -- Need R
+ ...
+}
+
+TDD-UL-DL-Pattern ::= SEQUENCE {
+ dl-UL-TransmissionPeriodicity ENUMERATED {ms0p5, ms0p625, ms1, ms1p25, ms2, ms2p5, ms5, ms10},
+ nrofDownlinkSlots INTEGER (0..maxNrofSlots),
+ nrofDownlinkSymbols INTEGER (0..maxNrofSymbols-1),
+ nrofUplinkSlots INTEGER (0..maxNrofSlots),
+ nrofUplinkSymbols INTEGER (0..maxNrofSymbols-1),
+ ...,
+ [[
+ dl-UL-TransmissionPeriodicity-v1530 ENUMERATED {ms3, ms4} OPTIONAL -- Need R
+ ]]
+}
+
+-- TAG-TDD-UL-DL-CONFIGCOMMON-STOP
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-START
+
+TDD-UL-DL-ConfigDedicated ::= SEQUENCE {
+ slotSpecificConfigurationsToAddModList SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig OPTIONAL, -- Need N
+ slotSpecificConfigurationsToReleaseList SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex OPTIONAL, -- Need N
+ ...
+}
+
+TDD-UL-DL-ConfigDedicated-IAB-MT-r16::= SEQUENCE {
+ slotSpecificConfigurationsToAddModList-IAB-MT-r16 SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig-IAB-MT-r16 OPTIONAL, -- Need N
+ slotSpecificConfigurationsToReleaseList-IAB-MT-r16 SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex OPTIONAL, -- Need N
+ ...
+}
+
+TDD-UL-DL-SlotConfig ::= SEQUENCE {
+ slotIndex TDD-UL-DL-SlotIndex,
+ symbols CHOICE {
+ allDownlink NULL,
+ allUplink NULL,
+ explicit SEQUENCE {
+ nrofDownlinkSymbols INTEGER (1..maxNrofSymbols-1) OPTIONAL, -- Need S
+ nrofUplinkSymbols INTEGER (1..maxNrofSymbols-1) OPTIONAL -- Need S
+ }
+ }
+}
+
+TDD-UL-DL-SlotConfig-IAB-MT-r16::= SEQUENCE {
+ slotIndex-r16 TDD-UL-DL-SlotIndex,
+ symbols-IAB-MT-r16 CHOICE {
+ allDownlink-r16 NULL,
+ allUplink-r16 NULL,
+ explicit-r16 SEQUENCE {
+ nrofDownlinkSymbols-r16 INTEGER (1..maxNrofSymbols-1) OPTIONAL, -- Need FFS
+ nrofUplinkSymbols-r16 INTEGER (1..maxNrofSymbols-1) OPTIONAL -- Need FFS
+ },
+ explicit-IAB-MT-r16 SEQUENCE {
+ nrofDownlinkSymbols-r16 INTEGER (1..maxNrofSymbols-1) OPTIONAL, -- Need FFS
+ nrofUplinkSymbols-r16 INTEGER (1..maxNrofSymbols-1) OPTIONAL -- Need FFS
+ }
+ }
+}
+
+TDD-UL-DL-SlotIndex ::= INTEGER (0..maxNrofSlots-1)
+
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-STOP
+-- TAG-TRACKINGAREACODE-START
+
+TrackingAreaCode ::= BIT STRING (SIZE (24))
+
+-- TAG-TRACKINGAREACODE-STOP
+-- TAG-TRESELECTION-START
+
+T-Reselection ::= INTEGER (0..7)
+
+-- TAG-TRESELECTION-STOP
+-- TAG-TIMETOTRIGGER-START
+
+TimeToTrigger ::= ENUMERATED {
+ ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256,
+ ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560,
+ ms5120}
+
+-- TAG-TIMETOTRIGGER-STOP
+-- TAG-UAC-BARRINGINFOSETINDEX-START
+
+UAC-BarringInfoSetIndex ::= INTEGER (1..maxBarringInfoSet)
+
+-- TAG-UAC-BARRINGINFOSETINDEX-STOP
+-- TAG-UAC-BARRINGINFOSETLIST-START
+
+UAC-BarringInfoSetList ::= SEQUENCE (SIZE(1..maxBarringInfoSet)) OF UAC-BarringInfoSet
+
+UAC-BarringInfoSet ::= SEQUENCE {
+ uac-BarringFactor ENUMERATED {p00, p05, p10, p15, p20, p25, p30, p40,
+ p50, p60, p70, p75, p80, p85, p90, p95},
+ uac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512},
+ uac-BarringForAccessIdentity BIT STRING (SIZE(7))
+}
+
+-- TAG-UAC-BARRINGINFOSETLIST-STOP
+-- TAG-UAC-BARRINGPERCATLIST-START
+
+UAC-BarringPerCatList ::= SEQUENCE (SIZE (1..maxAccessCat-1)) OF UAC-BarringPerCat
+
+UAC-BarringPerCat ::= SEQUENCE {
+ accessCategory INTEGER (1..maxAccessCat-1),
+ uac-barringInfoSetIndex UAC-BarringInfoSetIndex
+}
+
+-- TAG-UAC-BARRINGPERCATLIST-STOP
+-- TAG-UAC-BARRINGPERPLMN-LIST-START
+
+UAC-BarringPerPLMN-List ::= SEQUENCE (SIZE (1.. maxPLMN)) OF UAC-BarringPerPLMN
+
+UAC-BarringPerPLMN ::= SEQUENCE {
+ plmn-IdentityIndex INTEGER (1..maxPLMN),
+ uac-ACBarringListType CHOICE{
+ uac-ImplicitACBarringList SEQUENCE (SIZE(maxAccessCat-1)) OF UAC-BarringInfoSetIndex,
+ uac-ExplicitACBarringList UAC-BarringPerCatList
+ } OPTIONAL -- Need S
+}
+
+-- TAG-UAC-BARRINGPERPLMN-LIST-STOP
+-- TAG-UE-TIMERSANDCONSTANTS-START
+
+UE-TimersAndConstants ::= SEQUENCE {
+ t300 ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+ t301 ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+ t310 ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000},
+ n310 ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+ t311 ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000},
+ n311 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+ t319 ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+ ...
+}
+
+-- TAG-UE-TIMERSANDCONSTANTS-STOP
+-- TAG-ULDELAYVALUECONFIG-START
+
+UL-DelayValueConfig-r16 ::= SEQUENCE {
+ delay-DRBlist SEQUENCE (SIZE(1..maxDRB)) OF DRB-Identity
+}
+
+-- TAG-ULDELAYVALUECONFIG-STOP
+-- TAG-UPLINKCANCELLATION-START
+
+UplinkCancellation-r16 ::= SEQUENCE {
+ ci-RNTI-r16 RNTI-Value,
+ dci-PayloadSizeForCI-r16 INTEGER (0..maxCI-DCI-PayloadSize-r16),
+ ci-ConfigurationPerServingCell-r16 SEQUENCE (SIZE (1..maxNrofServingCells)) OF CI-ConfigurationPerServingCell-r16,
+ ...
+}
+
+CI-ConfigurationPerServingCell-r16 ::= SEQUENCE {
+ servingCellId ServCellIndex,
+ positionInDCI-r16 INTEGER (0..maxCI-DCI-PayloadSize-r16-1),
+ positionInDCI-ForSUL-r16 INTEGER (0..maxCI-DCI-PayloadSize-r16-1) OPTIONAL, -- Cond SUL-Only
+ ci-PayloadSize-r16 ENUMERATED {n1, n2, n4, n5, n7, n8, n10, n14, n16, n20, n28, n32, n35, n42, n56, n112},
+ timeFrequencyRegion-r16 SEQUENCE {
+ timeDurationForCI-r16 ENUMERATED {n2, n4, n7, n14} OPTIONAL, -- Cond SymbolPeriodicity
+ timeGranularityForCI-r16 ENUMERATED {n1, n2, n4, n7, n14, n28},
+ frequencyRegionForCI-r16 INTEGER (0..37949),
+ deltaOffset-r16 INTEGER (0..2),
+ ...
+ },
+ uplinkCancellationPriority-v1610 ENUMERATED {enabled} OPTIONAL -- Need S
+}
+
+-- TAG-UPLINKCANCELLATION-STOP
+-- TAG-UPLINKCONFIGCOMMON-START
+
+UplinkConfigCommon ::= SEQUENCE {
+ frequencyInfoUL FrequencyInfoUL OPTIONAL, -- Cond InterFreqHOAndServCellAdd
+ initialUplinkBWP BWP-UplinkCommon OPTIONAL, -- Cond ServCellAdd
+ dummy TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMON-STOP
+-- TAG-UPLINKCONFIGCOMMONSIB-START
+
+UplinkConfigCommonSIB ::= SEQUENCE {
+ frequencyInfoUL FrequencyInfoUL-SIB,
+ initialUplinkBWP BWP-UplinkCommon,
+ timeAlignmentTimerCommon TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMONSIB-STOP
+-- TAG-UPLINKTXDIRECTCURRENTLIST-START
+
+UplinkTxDirectCurrentList ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF UplinkTxDirectCurrentCell
+
+UplinkTxDirectCurrentCell ::= SEQUENCE {
+ servCellIndex ServCellIndex,
+ uplinkDirectCurrentBWP SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP,
+ ...,
+ [[
+ uplinkDirectCurrentBWP-SUL SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP OPTIONAL
+ ]]
+}
+
+UplinkTxDirectCurrentBWP ::= SEQUENCE {
+ bwp-Id BWP-Id,
+ shift7dot5kHz BOOLEAN,
+ txDirectCurrentLocation INTEGER (0..3301)
+}
+
+-- TAG-UPLINKTXDIRECTCURRENTLIST-STOP
+-- TAG-ZP-CSI-RS-RESOURCE-START
+
+ZP-CSI-RS-Resource ::= SEQUENCE {
+ zp-CSI-RS-ResourceId ZP-CSI-RS-ResourceId,
+ resourceMapping CSI-RS-ResourceMapping,
+ periodicityAndOffset CSI-ResourcePeriodicityAndOffset OPTIONAL, --Cond PeriodicOrSemiPersistent
+ ...
+}
+
+ZP-CSI-RS-ResourceId ::= INTEGER (0..maxNrofZP-CSI-RS-Resources-1)
+
+-- TAG-ZP-CSI-RS-RESOURCE-STOP
+-- TAG-ZP-CSI-RS-RESOURCESET-START
+
+ZP-CSI-RS-ResourceSet ::= SEQUENCE {
+ zp-CSI-RS-ResourceSetId ZP-CSI-RS-ResourceSetId,
+ zp-CSI-RS-ResourceIdList SEQUENCE (SIZE(1..maxNrofZP-CSI-RS-ResourcesPerSet)) OF ZP-CSI-RS-ResourceId,
+ ...
+}
+
+-- TAG-ZP-CSI-RS-RESOURCESET-STOP
+-- TAG-ZP-CSI-RS-RESOURCESETID-START
+
+ZP-CSI-RS-ResourceSetId ::= INTEGER (0..maxNrofZP-CSI-RS-ResourceSets-1)
+
+-- TAG-ZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-ACCESSSTRATUMRELEASE-START
+
+AccessStratumRelease ::= ENUMERATED {
+ rel15, rel16, spare6, spare5, spare4, spare3, spare2, spare1, ... }
+
+-- TAG-ACCESSSTRATUMRELEASE-STOP
+-- TAG-BANDCOMBINATIONLIST-START
+
+BandCombinationList ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination
+
+BandCombinationList-v1540 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1540
+
+BandCombinationList-v1550 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1550
+
+BandCombinationList-v1560 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1560
+
+BandCombinationList-v1570 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1570
+
+BandCombinationList-v1580 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1580
+
+BandCombinationList-v1590 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1590
+
+BandCombinationList-v1610 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1610
+
+BandCombinationList-UplinkTxSwitch-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-r16
+
+BandCombination ::= SEQUENCE {
+ bandList SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters,
+ featureSetCombination FeatureSetCombinationId,
+ ca-ParametersEUTRA CA-ParametersEUTRA OPTIONAL,
+ ca-ParametersNR CA-ParametersNR OPTIONAL,
+ mrdc-Parameters MRDC-Parameters OPTIONAL,
+ supportedBandwidthCombinationSet BIT STRING (SIZE (1..32)) OPTIONAL,
+ powerClass-v1530 ENUMERATED {pc2} OPTIONAL
+}
+
+BandCombination-v1540::= SEQUENCE {
+ bandList-v1540 SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1540,
+ ca-ParametersNR-v1540 CA-ParametersNR-v1540 OPTIONAL
+}
+
+BandCombination-v1550 ::= SEQUENCE {
+ ca-ParametersNR-v1550 CA-ParametersNR-v1550
+}
+
+BandCombination-v1610 ::= SEQUENCE {
+ bandList-v1610 SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1610 OPTIONAL,
+ ca-ParametersNR-v1610 CA-ParametersNR-v1610 OPTIONAL,
+ ca-ParametersNRDC-v1610 CA-ParametersNRDC-v1610 OPTIONAL,
+ powerClass-v1610 ENUMERATED {pc1dot5} OPTIONAL
+}
+
+BandCombination-v1560::= SEQUENCE {
+ ne-DC-BC ENUMERATED {supported} OPTIONAL,
+ ca-ParametersNRDC CA-ParametersNRDC OPTIONAL,
+ ca-ParametersEUTRA-v1560 CA-ParametersEUTRA-v1560 OPTIONAL,
+ ca-ParametersNR-v1560 CA-ParametersNR-v1560 OPTIONAL
+}
+
+BandCombination-v1570 ::= SEQUENCE {
+ ca-ParametersEUTRA-v1570 CA-ParametersEUTRA-v1570
+}
+
+BandCombination-v1580 ::= SEQUENCE {
+ mrdc-Parameters-v1580 MRDC-Parameters-v1580
+}
+
+BandCombination-v1590::= SEQUENCE {
+ supportedBandwidthCombinationSetIntraENDC BIT STRING (SIZE (1..32)) OPTIONAL,
+ mrdc-Parameters-v1590 MRDC-Parameters-v1590
+}
+
+BandCombination-UplinkTxSwitch-r16 ::= SEQUENCE {
+ bandCombination-r16 BandCombination,
+ bandCombination-v1540 BandCombination-v1540 OPTIONAL,
+ bandCombination-v1560 BandCombination-v1560 OPTIONAL,
+ bandCombination-v1570 BandCombination-v1570 OPTIONAL,
+ bandCombination-v1580 BandCombination-v1580 OPTIONAL,
+ bandCombination-v1590 BandCombination-v1590 OPTIONAL,
+ bandCombination-v1610 BandCombination-v1610 OPTIONAL,
+ supportedBandPairListNR-r16 SEQUENCE (SIZE (1..maxULTxSwitchingBandPairs)) OF ULTxSwitchingBandPair-r16,
+ uplinkTxSwitching-OptionSupport-r16 ENUMERATED {switchedUL, dualUL, both} OPTIONAL,
+ ...
+}
+
+ULTxSwitchingBandPair-r16 ::= SEQUENCE {
+ bandIndexUL1-r16 INTEGER(1..maxSimultaneousBands),
+ bandIndexUL2-r16 INTEGER(1..maxSimultaneousBands),
+ uplinkTxSwitchingPeriod-r16 ENUMERATED {n35us, n140us, n210us},
+ uplinkTxSwitching-DL-Interruption-r16 BIT STRING (SIZE(1..maxSimultaneousBands)) OPTIONAL
+}
+
+BandParameters ::= CHOICE {
+ eutra SEQUENCE {
+ bandEUTRA FreqBandIndicatorEUTRA,
+ ca-BandwidthClassDL-EUTRA CA-BandwidthClassEUTRA OPTIONAL,
+ ca-BandwidthClassUL-EUTRA CA-BandwidthClassEUTRA OPTIONAL
+ },
+ nr SEQUENCE {
+ bandNR FreqBandIndicatorNR,
+ ca-BandwidthClassDL-NR CA-BandwidthClassNR OPTIONAL,
+ ca-BandwidthClassUL-NR CA-BandwidthClassNR OPTIONAL
+ }
+}
+
+BandParameters-v1540 ::= SEQUENCE {
+ srs-CarrierSwitch CHOICE {
+ nr SEQUENCE {
+ srs-SwitchingTimesListNR SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeNR
+ },
+ eutra SEQUENCE {
+ srs-SwitchingTimesListEUTRA SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeEUTRA
+ }
+ } OPTIONAL,
+ srs-TxSwitch SEQUENCE {
+ supportedSRS-TxPortSwitch ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, t1r1, t2r2, t4r4, notSupported},
+ txSwitchImpactToRx INTEGER (1..32) OPTIONAL,
+ txSwitchWithAnotherBand INTEGER (1..32) OPTIONAL
+ } OPTIONAL
+}
+
+BandParameters-v1610 ::= SEQUENCE {
+ srs-TxSwitch-v1610 SEQUENCE {
+ supportedSRS-TxPortSwitch-v1610 ENUMERATED {t1r1-t1r2, t1r1-t1r2-t1r4, t1r1-t1r2-t2r2-t2r4, t1r1-t1r2-t2r2-t1r4-t2r4,
+ t1r1-t2r2, t1r1-t2r2-t4r4}
+ } OPTIONAL,
+ intraFreqDAPS-Parameters-r16 SEQUENCE {
+ intraFreqDiffSCS-DAPS-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqAsyncDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqMultiUL-TransmissionDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqTwoTAGs-DAPS-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqSemiStaticPowerSharingDAPS-Mode1-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqSemiStaticPowerSharingDAPS-Mode2-r16 ENUMERATED {supported} OPTIONAL,
+ intraFreqDynamicPowersharingDAPS-r16 ENUMERATED {short, long} OPTIONAL
+ } OPTIONAL
+}
+
+-- TAG-BANDCOMBINATIONLIST-STOP
+-- TAG-BANDCOMBINATIONLISTSIDELINK-START
+
+BandCombinationListSidelink-r16 ::= SEQUENCE {
+ supportedBandCombinationListSidelink-r16 SupportedBandCombinationListSidelink-r16 OPTIONAL,
+ supportedBandCombinationListSidelinkEUTRA-r16 SupportedBandCombinationListSidelinkEUTRA-r16 OPTIONAL,
+ supportedBandCombinationListSidelinkEUTRA-NR-r16 SupportedBandCombinationListSidelinkEUTRA-NR-r16 OPTIONAL,
+ ...
+}
+
+SupportedBandCombinationListSidelink-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelink-r16
+
+BandCombinationParametersSidelink-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelink-r16
+
+BandParametersSidelink-r16 ::= SEQUENCE {
+ freqBandSidelink-r16 FreqBandIndicatorNR
+}
+
+SupportedBandCombinationListSidelinkEUTRA-r16 ::= SEQUENCE {
+ bandCombinationListEUTRA1-r16 OCTET STRING OPTIONAL,
+ bandCombinationListEUTRA2-r16 OCTET STRING OPTIONAL
+}
+
+SupportedBandCombinationListSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkEUTRA-NR-r16
+
+BandCombinationParametersSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelinkEUTRA-NR-r16
+
+BandParametersSidelinkEUTRA-NR-r16 ::= CHOICE {
+ eutra SEQUENCE {
+ bandParametersSidelinkEUTRA1-r16 OCTET STRING OPTIONAL,
+ bandParametersSidelinkEUTRA2-r16 OCTET STRING OPTIONAL
+ },
+ nr SEQUENCE {
+ bandParametersSidelinkNR-r16 BandParametersSidelink-r16 }
+ }
+
+-- TAG-BANDCOMBINATIONLISTSIDELINK-STOP
+-- TAG-CA-BANDWIDTHCLASSEUTRA-START
+
+CA-BandwidthClassEUTRA ::= ENUMERATED {a, b, c, d, e, f, ...}
+
+-- TAG-CA-BANDWIDTHCLASSEUTRA-STOP
+-- TAG-CA-BANDWIDTHCLASSNR-START
+
+CA-BandwidthClassNR ::= ENUMERATED {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, ...}
+
+-- TAG-CA-BANDWIDTHCLASSNR-STOP
+-- TAG-CA-PARAMETERSEUTRA-START
+
+CA-ParametersEUTRA ::= SEQUENCE {
+ multipleTimingAdvance ENUMERATED {supported} OPTIONAL,
+ simultaneousRx-Tx ENUMERATED {supported} OPTIONAL,
+ supportedNAICS-2CRS-AP BIT STRING (SIZE (1..8)) OPTIONAL,
+ additionalRx-Tx-PerformanceReq ENUMERATED {supported} OPTIONAL,
+ ue-CA-PowerClass-N ENUMERATED {class2} OPTIONAL,
+ supportedBandwidthCombinationSetEUTRA-v1530 BIT STRING (SIZE (1..32)) OPTIONAL,
+ ...
+}
+
+CA-ParametersEUTRA-v1560 ::= SEQUENCE {
+ fd-MIMO-TotalWeightedLayers INTEGER (2..128) OPTIONAL
+}
+
+CA-ParametersEUTRA-v1570 ::= SEQUENCE {
+ dl-1024QAM-TotalWeightedLayers INTEGER (0..10) OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSEUTRA-STOP
+-- TAG-CA-PARAMETERSNR-START
+
+CA-ParametersNR ::= SEQUENCE {
+ dummy ENUMERATED {supported} OPTIONAL,
+ parallelTxSRS-PUCCH-PUSCH ENUMERATED {supported} OPTIONAL,
+ parallelTxPRACH-SRS-PUCCH-PUSCH ENUMERATED {supported} OPTIONAL,
+ simultaneousRxTxInterBandCA ENUMERATED {supported} OPTIONAL,
+ simultaneousRxTxSUL ENUMERATED {supported} OPTIONAL,
+ diffNumerologyAcrossPUCCH-Group ENUMERATED {supported} OPTIONAL,
+ diffNumerologyWithinPUCCH-GroupSmallerSCS ENUMERATED {supported} OPTIONAL,
+ supportedNumberTAG ENUMERATED {n2, n3, n4} OPTIONAL,
+ ...
+}
+
+CA-ParametersNR-v1540 ::= SEQUENCE {
+ simultaneousSRS-AssocCSI-RS-AllCC INTEGER (5..32) OPTIONAL,
+ csi-RS-IM-ReceptionForFeedbackPerBandComb SEQUENCE {
+ maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC INTEGER (1..64) OPTIONAL,
+ totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC INTEGER (2..256) OPTIONAL
+ } OPTIONAL,
+ simultaneousCSI-ReportsAllCC INTEGER (5..32) OPTIONAL,
+ dualPA-Architecture ENUMERATED {supported} OPTIONAL
+}
+
+CA-ParametersNR-v1550 ::= SEQUENCE {
+ dummy ENUMERATED {supported} OPTIONAL
+}
+
+CA-ParametersNR-v1560 ::= SEQUENCE {
+ diffNumerologyWithinPUCCH-GroupLargerSCS ENUMERATED {supported} OPTIONAL
+}
+
+CA-ParametersNR-v1610 ::= SEQUENCE {
+ -- R1 9-3: Parallel MsgA and SRS/PUCCH/PUSCH transmissions across CCs in inter-band CA
+ parallelTxMsgA-SRS-PUCCH-PUSCH-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 9-4: MsgA operation in a band combination including SUL
+ msgA-SUL-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-9c: Joint search space group switching across multiple cells
+ jointSearchSpaceGroupSwitchingAcrossCells-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 14-5: Half-duplex UE behaviour in TDD CA for same SCS
+ half-DuplexTDD-CA-SameSCS-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-4: SCell dormancy within active time
+ scellDormancyWithinActiveTime-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-4a: SCell dormancy outside active time
+ scellDormancyOutsideActiveTime-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-6: Cross-carrier A-CSI RS triggering with different SCS
+ crossCarrierA-CSI-trigDiffSCS-r16 ENUMERATED {higherA-CSI-SCS,lowerA-CSI-SCS,both} OPTIONAL,
+ -- R1 18-6a: Default QCL assumption for cross-carrier A-CSI-RS triggering
+ defaultQCL-CrossCarrierA-CSI-Trig-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-7: CA with non-aligned frame boundaries for inter-band CA
+ interCA-NonAlignedFrame-r16 ENUMERATED {supported} OPTIONAL,
+ simul-SRS-Trans-InterBandCA-r16 INTEGER (1..2) OPTIONAL,
+ daps-Parameters-r16 SEQUENCE {
+ asyncDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ interFreqDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ interFreqDiffSCS-DAPS-r16 ENUMERATED {supported} OPTIONAL,
+ multiUL-TransmissionDAPS-r16 ENUMERATED {supported} OPTIONAL,
+ semiStaticPowerSharingDAPS-Mode1-r16 ENUMERATED {supported} OPTIONAL,
+ semiStaticPowerSharingDAPS-Mode2-r16 ENUMERATED {supported} OPTIONAL,
+ dynamicPowersharingDAPS-r16 ENUMERATED {short, long} OPTIONAL,
+ ul-TransCancellationDAPS-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ codebookParametersPerBC-r16 CodebookParameters-v1610 OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSNR-STOP
+-- TAG-CA-PARAMETERS-NRDC-START
+
+CA-ParametersNRDC ::= SEQUENCE {
+ ca-ParametersNR-ForDC CA-ParametersNR OPTIONAL,
+ ca-ParametersNR-ForDC-v1540 CA-ParametersNR-v1540 OPTIONAL,
+ ca-ParametersNR-ForDC-v1550 CA-ParametersNR-v1550 OPTIONAL,
+ ca-ParametersNR-ForDC-v1560 CA-ParametersNR-v1560 OPTIONAL,
+ featureSetCombinationDC FeatureSetCombinationId OPTIONAL
+}
+
+CA-ParametersNRDC-v1610 ::= SEQUENCE {
+ -- R1 18-1: Semi-static power sharing mode1 between MCG and SCG cells of same FR for NR dual connectivity
+ intraFR-NR-DC-PwrSharingMode1-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-1a: Semi-static power sharing mode 2 between MCG and SCG cells of same FR for NR dual connectivity
+ intraFR-NR-DC-PwrSharingMode2-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-1b: Dynamic power sharing between MCG and SCG cells of same FR for NR dual connectivity
+ intraFR-NR-DC-DynamicPwrSharing-r16 ENUMERATED {short, long} OPTIONAL
+}
+
+-- TAG-CA-PARAMETERS-NRDC-STOP
+-- TAG-CARRIERAGGREGATIONVARIANT-START
+
+CarrierAggregationVariant ::= SEQUENCE {
+ fr1fdd-FR1TDD-CA-SpCellOnFR1FDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR1TDD-CA-SpCellOnFR1TDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR2TDD-CA-SpCellOnFR1FDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR2TDD-CA-SpCellOnFR2TDD ENUMERATED {supported} OPTIONAL,
+ fr1tdd-FR2TDD-CA-SpCellOnFR1TDD ENUMERATED {supported} OPTIONAL,
+ fr1tdd-FR2TDD-CA-SpCellOnFR2TDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1FDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1TDD ENUMERATED {supported} OPTIONAL,
+ fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR2TDD ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-CARRIERAGGREGATIONVARIANT-STOP
+-- TAG-CODEBOOKPARAMETERS-START
+
+CodebookParameters ::= SEQUENCE {
+ type1 SEQUENCE {
+ singlePanel SEQUENCE {
+ supportedCSI-RS-ResourceList SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+ modes ENUMERATED {mode1, mode1andMode2},
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+ },
+ multiPanel SEQUENCE {
+ supportedCSI-RS-ResourceList SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+ modes ENUMERATED {mode1, mode2, both},
+ nrofPanels ENUMERATED {n2, n4},
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+ } OPTIONAL
+ },
+ type2 SEQUENCE {
+ supportedCSI-RS-ResourceList SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+ parameterLx INTEGER (2..4),
+ amplitudeScalingType ENUMERATED {wideband, widebandAndSubband},
+ amplitudeSubsetRestriction ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ type2-PortSelection SEQUENCE {
+ supportedCSI-RS-ResourceList SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+ parameterLx INTEGER (2..4),
+ amplitudeScalingType ENUMERATED {wideband, widebandAndSubband}
+ } OPTIONAL
+}
+
+CodebookParameters-v1610 ::= SEQUENCE {
+ supportedCSI-RS-ResourceListAlt-r16 SEQUENCE {
+ type1-SinglePanel-r16 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16) OPTIONAL,
+ type1-MultiPanel-r16 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16) OPTIONAL,
+ type2-r16 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16) OPTIONAL,
+ type2-PortSelection-r16 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16) OPTIONAL
+ } OPTIONAL
+}
+
+CodebookVariantsList-r16 ::= SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesAlt-r16)) OF SupportedCSI-RS-Resource
+
+SupportedCSI-RS-Resource ::= SEQUENCE {
+ maxNumberTxPortsPerResource ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+ maxNumberResourcesPerBand INTEGER (1..64),
+ totalNumberTxPortsPerBand INTEGER (2..256)
+}
+
+-- TAG-CODEBOOKPARAMETERS-STOP
+-- TAG-FEATURESETCOMBINATION-START
+
+FeatureSetCombination ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF FeatureSetsPerBand
+
+FeatureSetsPerBand ::= SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSet
+
+FeatureSet ::= CHOICE {
+ eutra SEQUENCE {
+ downlinkSetEUTRA FeatureSetEUTRA-DownlinkId,
+ uplinkSetEUTRA FeatureSetEUTRA-UplinkId
+ },
+ nr SEQUENCE {
+ downlinkSetNR FeatureSetDownlinkId,
+ uplinkSetNR FeatureSetUplinkId
+ }
+}
+
+-- TAG-FEATURESETCOMBINATION-STOP
+-- TAG-FEATURESETCOMBINATIONID-START
+
+FeatureSetCombinationId ::= INTEGER (0.. maxFeatureSetCombinations)
+
+-- TAG-FEATURESETCOMBINATIONID-STOP
+-- TAG-FEATURESETDOWNLINK-START
+
+FeatureSetDownlink ::= SEQUENCE {
+ featureSetListPerDownlinkCC SEQUENCE (SIZE (1..maxNrofServingCells)) OF FeatureSetDownlinkPerCC-Id,
+
+ intraBandFreqSeparationDL FreqSeparationClass OPTIONAL,
+ scalingFactor ENUMERATED {f0p4, f0p75, f0p8} OPTIONAL,
+ crossCarrierScheduling-OtherSCS ENUMERATED {supported} OPTIONAL,
+ scellWithoutSSB ENUMERATED {supported} OPTIONAL,
+ csi-RS-MeasSCellWithoutSSB ENUMERATED {supported} OPTIONAL,
+ dummy1 ENUMERATED {supported} OPTIONAL,
+ type1-3-CSS ENUMERATED {supported} OPTIONAL,
+ pdcch-MonitoringAnyOccasions ENUMERATED {withoutDCI-Gap, withDCI-Gap} OPTIONAL,
+ dummy2 ENUMERATED {supported} OPTIONAL,
+ ue-SpecificUL-DL-Assignment ENUMERATED {supported} OPTIONAL,
+ searchSpaceSharingCA-DL ENUMERATED {supported} OPTIONAL,
+ timeDurationForQCL SEQUENCE {
+ scs-60kHz ENUMERATED {s7, s14, s28} OPTIONAL,
+ scs-120kHz ENUMERATED {s14, s28} OPTIONAL
+ } OPTIONAL,
+ pdsch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL,
+ dummy3 DummyA OPTIONAL,
+ dummy4 SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyB OPTIONAL,
+ dummy5 SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyC OPTIONAL,
+ dummy6 SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyD OPTIONAL,
+ dummy7 SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyE OPTIONAL
+}
+
+FeatureSetDownlink-v1540 ::= SEQUENCE {
+ oneFL-DMRS-TwoAdditionalDMRS-DL ENUMERATED {supported} OPTIONAL,
+ additionalDMRS-DL-Alt ENUMERATED {supported} OPTIONAL,
+ twoFL-DMRS-TwoAdditionalDMRS-DL ENUMERATED {supported} OPTIONAL,
+ oneFL-DMRS-ThreeAdditionalDMRS-DL ENUMERATED {supported} OPTIONAL,
+ pdcch-MonitoringAnyOccasionsWithSpanGap SEQUENCE {
+ scs-15kHz ENUMERATED {set1, set2, set3} OPTIONAL,
+ scs-30kHz ENUMERATED {set1, set2, set3} OPTIONAL,
+ scs-60kHz ENUMERATED {set1, set2, set3} OPTIONAL,
+ scs-120kHz ENUMERATED {set1, set2, set3} OPTIONAL
+ } OPTIONAL,
+ pdsch-SeparationWithGap ENUMERATED {supported} OPTIONAL,
+ pdsch-ProcessingType2 SEQUENCE {
+ scs-15kHz ProcessingParameters OPTIONAL,
+ scs-30kHz ProcessingParameters OPTIONAL,
+ scs-60kHz ProcessingParameters OPTIONAL
+ } OPTIONAL,
+ pdsch-ProcessingType2-Limited SEQUENCE {
+ differentTB-PerSlot-SCS-30kHz ENUMERATED {upto1, upto2, upto4, upto7}
+ } OPTIONAL,
+ dl-MCS-TableAlt-DynamicIndication ENUMERATED {supported} OPTIONAL
+}
+
+FeatureSetDownlink-v15a0 ::= SEQUENCE {
+ supportedSRS-Resources SRS-Resources OPTIONAL
+}
+
+FeatureSetDownlink-v1610 ::= SEQUENCE {
+ -- R1 22-4e/4f/4g/4h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 1
+ cbgPDSCH-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL,
+
+ -- R1 22-3e/3f/3g/3h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 2
+ cbgPDSCH-ProcessingType2-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {one-pdsch, upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL
+}
+
+DummyA ::= SEQUENCE {
+ maxNumberNZP-CSI-RS-PerCC INTEGER (1..32),
+ maxNumberPortsAcrossNZP-CSI-RS-PerCC ENUMERATED {p2, p4, p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+ p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+ p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256},
+ maxNumberCS-IM-PerCC ENUMERATED {n1, n2, n4, n8, n16, n32},
+ maxNumberSimultaneousCSI-RS-ActBWP-AllCC ENUMERATED {n5, n6, n7, n8, n9, n10, n12, n14, n16, n18, n20, n22, n24, n26,
+ n28, n30, n32, n34, n36, n38, n40, n42, n44, n46, n48, n50, n52,
+ n54, n56, n58, n60, n62, n64},
+ totalNumberPortsSimultaneousCSI-RS-ActBWP-AllCC ENUMERATED {p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+ p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+ p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256}
+}
+
+DummyB ::= SEQUENCE {
+ maxNumberTxPortsPerResource ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+ maxNumberResources INTEGER (1..64),
+ totalNumberTxPorts INTEGER (2..256),
+ supportedCodebookMode ENUMERATED {mode1, mode1AndMode2},
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+}
+
+DummyC ::= SEQUENCE {
+ maxNumberTxPortsPerResource ENUMERATED {p8, p16, p32},
+ maxNumberResources INTEGER (1..64),
+ totalNumberTxPorts INTEGER (2..256),
+ supportedCodebookMode ENUMERATED {mode1, mode2, both},
+ supportedNumberPanels ENUMERATED {n2, n4},
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+}
+
+DummyD ::= SEQUENCE {
+ maxNumberTxPortsPerResource ENUMERATED {p4, p8, p12, p16, p24, p32},
+ maxNumberResources INTEGER (1..64),
+ totalNumberTxPorts INTEGER (2..256),
+ parameterLx INTEGER (2..4),
+ amplitudeScalingType ENUMERATED {wideband, widebandAndSubband},
+ amplitudeSubsetRestriction ENUMERATED {supported} OPTIONAL,
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+}
+
+DummyE ::= SEQUENCE {
+ maxNumberTxPortsPerResource ENUMERATED {p4, p8, p12, p16, p24, p32},
+ maxNumberResources INTEGER (1..64),
+ totalNumberTxPorts INTEGER (2..256),
+ parameterLx INTEGER (2..4),
+ amplitudeScalingType ENUMERATED {wideband, widebandAndSubband},
+ maxNumberCSI-RS-PerResourceSet INTEGER (1..8)
+}
+
+-- TAG-FEATURESETDOWNLINK-STOP
+-- TAG-FEATURESETDOWNLINKID-START
+
+FeatureSetDownlinkId ::= INTEGER (0..maxDownlinkFeatureSets)
+
+-- TAG-FEATURESETDOWNLINKID-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-START
+
+FeatureSetDownlinkPerCC ::= SEQUENCE {
+ supportedSubcarrierSpacingDL SubcarrierSpacing,
+ supportedBandwidthDL SupportedBandwidth,
+ channelBW-90mhz ENUMERATED {supported} OPTIONAL,
+ maxNumberMIMO-LayersPDSCH MIMO-LayersDL OPTIONAL,
+ supportedModulationOrderDL ModulationOrder OPTIONAL
+}
+
+-- TAG-FEATURESETDOWNLINKPERCC-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-ID-START
+
+FeatureSetDownlinkPerCC-Id ::= INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETDOWNLINKPERCC-ID-STOP
+-- TAG-FEATURESETEUTRADOWNLINKID-START
+
+FeatureSetEUTRA-DownlinkId ::= INTEGER (0..maxEUTRA-DL-FeatureSets)
+
+-- TAG-FEATURESETEUTRADOWNLINKID-STOP
+-- TAG-FEATURESETEUTRAUPLINKID-START
+
+FeatureSetEUTRA-UplinkId ::= INTEGER (0..maxEUTRA-UL-FeatureSets)
+
+-- TAG-FEATURESETEUTRAUPLINKID-STOP
+-- TAG-FEATURESETS-START
+
+FeatureSets ::= SEQUENCE {
+ featureSetsDownlink SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink OPTIONAL,
+ featureSetsDownlinkPerCC SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetDownlinkPerCC OPTIONAL,
+ featureSetsUplink SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink OPTIONAL,
+ featureSetsUplinkPerCC SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC OPTIONAL,
+ ...,
+ [[
+ featureSetsDownlink-v1540 SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1540 OPTIONAL,
+ featureSetsUplink-v1540 SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1540 OPTIONAL,
+ featureSetsUplinkPerCC-v1540 SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC-v1540 OPTIONAL
+ ]],
+ [[
+ featureSetsDownlink-v15a0 SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v15a0 OPTIONAL
+ ]],
+ [[
+ featureSetsDownlink-v1610 SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1610 OPTIONAL,
+ featureSetsUplink-v1610 SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1610 OPTIONAL
+ ]]
+}
+
+-- TAG-FEATURESETS-STOP
+-- TAG-FEATURESETUPLINK-START
+
+FeatureSetUplink ::= SEQUENCE {
+ featureSetListPerUplinkCC SEQUENCE (SIZE (1.. maxNrofServingCells)) OF FeatureSetUplinkPerCC-Id,
+ scalingFactor ENUMERATED {f0p4, f0p75, f0p8} OPTIONAL,
+ crossCarrierScheduling-OtherSCS ENUMERATED {supported} OPTIONAL,
+ intraBandFreqSeparationUL FreqSeparationClass OPTIONAL,
+ searchSpaceSharingCA-UL ENUMERATED {supported} OPTIONAL,
+ dummy1 DummyI OPTIONAL,
+ supportedSRS-Resources SRS-Resources OPTIONAL,
+ twoPUCCH-Group ENUMERATED {supported} OPTIONAL,
+ dynamicSwitchSUL ENUMERATED {supported} OPTIONAL,
+ simultaneousTxSUL-NonSUL ENUMERATED {supported} OPTIONAL,
+ pusch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL,
+ dummy2 DummyF OPTIONAL
+}
+
+FeatureSetUplink-v1540 ::= SEQUENCE {
+ zeroSlotOffsetAperiodicSRS ENUMERATED {supported} OPTIONAL,
+ pa-PhaseDiscontinuityImpacts ENUMERATED {supported} OPTIONAL,
+ pusch-SeparationWithGap ENUMERATED {supported} OPTIONAL,
+ pusch-ProcessingType2 SEQUENCE {
+ scs-15kHz ProcessingParameters OPTIONAL,
+ scs-30kHz ProcessingParameters OPTIONAL,
+ scs-60kHz ProcessingParameters OPTIONAL
+ } OPTIONAL,
+ ul-MCS-TableAlt-DynamicIndication ENUMERATED {supported} OPTIONAL
+}
+
+FeatureSetUplink-v1610 ::= SEQUENCE {
+ -- R1 11-5: PUsCH repetition Type B
+ pusch-RepetitionTypeB-r16 SEQUENCE {
+ maxNumberPUSCH-Tx-r16 ENUMERATED {n2, n3, n4, n7, n8, n12},
+ hoppingScheme-r16 ENUMERATED {interSlotHopping, interRepetitionHopping, both}
+ } OPTIONAL,
+ -- R1 11-7: UL cancelation scheme for self-carrier
+ ul-CancellationSelfCarrier-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-7a: UL cancelation scheme for cross-carrier
+ ul-CancellationCrossCarrier-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 16-5c: The maximum number of SRS resources in one SRS resource set with usage set to 'codebook' for Mode 2
+ ul-FullPwrMode2-MaxSRS-ResInSet ENUMERATED {n1, n2, n4} OPTIONAL,
+
+ -- R1 22-4a/4b/4c/4d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 1
+ cbgPUSCH-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL,
+
+ -- R1 22-3a/3b/3c/3d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 2
+ cbgPUSCH-ProcessingType2-DifferentTB-PerSlot SEQUENCE {
+ scs-15kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-30kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-60kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL,
+ scs-120kHz ENUMERATED {one-pusch, upto2, upto4, upto7} OPTIONAL
+ } OPTIONAL,
+ supportedSRS-PosResources-r16 SRS-AllPosResources-r16 OPTIONAL
+}
+
+SRS-AllPosResources-r16 ::= SEQUENCE {
+ srs-PosResources-r16 SRS-PosResources-r16,
+ srs-PosResourceAP-r16 SRS-PosResourceAP-r16 OPTIONAL,
+ srs-PosResourceSP-r16 SRS-PosResourceSP-r16 OPTIONAL
+}
+
+SRS-PosResources-r16 ::= SEQUENCE {
+ maxNumberSRS-PosResourceSetPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n12, n16},
+ maxNumberSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberSRS-ResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14},
+ maxNumberPeriodicSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberPeriodicSRS-PosResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceAP-r16 ::= SEQUENCE {
+ maxNumberAP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberAP-SRS-PosResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceSP-r16 ::= SEQUENCE {
+ maxNumberSP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+ maxNumberSP-SRS-PosResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-Resources ::= SEQUENCE {
+ maxNumberAperiodicSRS-PerBWP ENUMERATED {n1, n2, n4, n8, n16},
+ maxNumberAperiodicSRS-PerBWP-PerSlot INTEGER (1..6),
+ maxNumberPeriodicSRS-PerBWP ENUMERATED {n1, n2, n4, n8, n16},
+ maxNumberPeriodicSRS-PerBWP-PerSlot INTEGER (1..6),
+ maxNumberSemiPersistentSRS-PerBWP ENUMERATED {n1, n2, n4, n8, n16},
+ maxNumberSemiPersistentSRS-PerBWP-PerSlot INTEGER (1..6),
+ maxNumberSRS-Ports-PerResource ENUMERATED {n1, n2, n4}
+}
+
+DummyF ::= SEQUENCE {
+ maxNumberPeriodicCSI-ReportPerBWP INTEGER (1..4),
+ maxNumberAperiodicCSI-ReportPerBWP INTEGER (1..4),
+ maxNumberSemiPersistentCSI-ReportPerBWP INTEGER (0..4),
+ simultaneousCSI-ReportsAllCC INTEGER (5..32)
+}
+
+-- TAG-FEATURESETUPLINK-STOP
+-- TAG-FEATURESETUPLINKID-START
+
+FeatureSetUplinkId ::= INTEGER (0..maxUplinkFeatureSets)
+
+-- TAG-FEATURESETUPLINKID-STOP
+-- TAG-FEATURESETUPLINKPERCC-START
+
+FeatureSetUplinkPerCC ::= SEQUENCE {
+ supportedSubcarrierSpacingUL SubcarrierSpacing,
+ supportedBandwidthUL SupportedBandwidth,
+ channelBW-90mhz ENUMERATED {supported} OPTIONAL,
+ mimo-CB-PUSCH SEQUENCE {
+ maxNumberMIMO-LayersCB-PUSCH MIMO-LayersUL OPTIONAL,
+ maxNumberSRS-ResourcePerSet INTEGER (1..2)
+ } OPTIONAL,
+ maxNumberMIMO-LayersNonCB-PUSCH MIMO-LayersUL OPTIONAL,
+ supportedModulationOrderUL ModulationOrder OPTIONAL
+}
+FeatureSetUplinkPerCC-v1540 ::= SEQUENCE {
+ mimo-NonCB-PUSCH SEQUENCE {
+ maxNumberSRS-ResourcePerSet INTEGER (1..4),
+ maxNumberSimultaneousSRS-ResourceTx INTEGER (1..4)
+ } OPTIONAL
+}
+
+-- TAG-FEATURESETUPLINKPERCC-STOP
+-- TAG-FEATURESETUPLINKPERCC-ID-START
+
+FeatureSetUplinkPerCC-Id ::= INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETUPLINKPERCC-ID-STOP
+-- TAG-FREQBANDINDICATOREUTRA-START
+
+FreqBandIndicatorEUTRA ::= INTEGER (1..maxBandsEUTRA)
+
+-- TAG-FREQBANDINDICATOREUTRA-STOP
+-- TAG-FREQBANDLIST-START
+
+FreqBandList ::= SEQUENCE (SIZE (1..maxBandsMRDC)) OF FreqBandInformation
+
+FreqBandInformation ::= CHOICE {
+ bandInformationEUTRA FreqBandInformationEUTRA,
+ bandInformationNR FreqBandInformationNR
+}
+
+FreqBandInformationEUTRA ::= SEQUENCE {
+ bandEUTRA FreqBandIndicatorEUTRA,
+ ca-BandwidthClassDL-EUTRA CA-BandwidthClassEUTRA OPTIONAL, -- Need N
+ ca-BandwidthClassUL-EUTRA CA-BandwidthClassEUTRA OPTIONAL -- Need N
+}
+
+FreqBandInformationNR ::= SEQUENCE {
+ bandNR FreqBandIndicatorNR,
+ maxBandwidthRequestedDL AggregatedBandwidth OPTIONAL, -- Need N
+ maxBandwidthRequestedUL AggregatedBandwidth OPTIONAL, -- Need N
+ maxCarriersRequestedDL INTEGER (1..maxNrofServingCells) OPTIONAL, -- Need N
+ maxCarriersRequestedUL INTEGER (1..maxNrofServingCells) OPTIONAL -- Need N
+}
+
+AggregatedBandwidth ::= ENUMERATED {mhz50, mhz100, mhz150, mhz200, mhz250, mhz300, mhz350,
+ mhz400, mhz450, mhz500, mhz550, mhz600, mhz650, mhz700, mhz750, mhz800}
+
+-- TAG-FREQBANDLIST-STOP
+-- TAG-FREQSEPARATIONCLASS-START
+
+FreqSeparationClass ::= ENUMERATED {c1, c2, c3, ...}
+
+-- TAG-FREQSEPARATIONCLASS-STOP
+-- TAG-HIGHSPEEDPARAMETERS-START
+
+HighSpeedParameters-r16 ::= SEQUENCE {
+ measurementEnhancement-r16 ENUMERATED {supported} OPTIONAL,
+ demodulationEnhancement-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-HIGHSPEEDPARAMETERS-STOP
+-- TAG-IMS-PARAMETERS-START
+
+IMS-Parameters ::= SEQUENCE {
+ ims-ParametersCommon IMS-ParametersCommon OPTIONAL,
+ ims-ParametersFRX-Diff IMS-ParametersFRX-Diff OPTIONAL,
+ ...
+}
+
+IMS-ParametersCommon ::= SEQUENCE {
+ voiceOverEUTRA-5GC ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ voiceOverSCG-BearerEUTRA-5GC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ voiceFallbackIndicationEPS-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+IMS-ParametersFRX-Diff ::= SEQUENCE {
+ voiceOverNR ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+-- TAG-IMS-PARAMETERS-STOP
+-- TAG-INTERRAT-PARAMETERS-START
+
+InterRAT-Parameters ::= SEQUENCE {
+ eutra EUTRA-Parameters OPTIONAL,
+ ...,
+ [[
+ utra-FDD-r16 UTRA-FDD-Parameters-r16 OPTIONAL
+ ]]
+
+}
+
+EUTRA-Parameters ::= SEQUENCE {
+ supportedBandListEUTRA SEQUENCE (SIZE (1..maxBandsEUTRA)) OF FreqBandIndicatorEUTRA,
+ eutra-ParametersCommon EUTRA-ParametersCommon OPTIONAL,
+ eutra-ParametersXDD-Diff EUTRA-ParametersXDD-Diff OPTIONAL,
+ ...
+}
+
+EUTRA-ParametersCommon ::= SEQUENCE {
+ mfbi-EUTRA ENUMERATED {supported} OPTIONAL,
+ modifiedMPR-BehaviorEUTRA BIT STRING (SIZE (32)) OPTIONAL,
+ multiNS-Pmax-EUTRA ENUMERATED {supported} OPTIONAL,
+ rs-SINR-MeasEUTRA ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ ne-DC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ nr-HO-ToEN-DC-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+EUTRA-ParametersXDD-Diff ::= SEQUENCE {
+ rsrqMeasWidebandEUTRA ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+UTRA-FDD-Parameters-r16 ::= SEQUENCE {
+ supportedBandListUTRA-FDD-r16 SEQUENCE (SIZE (1..maxBandsUTRA-FDD-r16)) OF SupportedBandUTRA-FDD-r16,
+ ...
+}
+
+SupportedBandUTRA-FDD-r16 ::= ENUMERATED {
+ bandI, bandII, bandIII, bandIV, bandV, bandVI,
+ bandVII, bandVIII, bandIX, bandX, bandXI,
+ bandXII, bandXIII, bandXIV, bandXV, bandXVI,
+ bandXVII, bandXVIII, bandXIX, bandXX,
+ bandXXI, bandXXII, bandXXIII, bandXXIV,
+ bandXXV, bandXXVI, bandXXVII, bandXXVIII,
+ bandXXIX, bandXXX, bandXXXI, bandXXXII}
+
+-- TAG-INTERRAT-PARAMETERS-STOP
+-- TAG-MAC-PARAMETERS-START
+
+MAC-Parameters ::= SEQUENCE {
+ mac-ParametersCommon MAC-ParametersCommon OPTIONAL,
+ mac-ParametersXDD-Diff MAC-ParametersXDD-Diff OPTIONAL
+}
+
+MAC-Parameters-v1610 ::= SEQUENCE {
+ mac-ParametersFRX-Diff-r16 MAC-ParametersFRX-Diff-r16 OPTIONAL
+}
+
+MAC-ParametersCommon ::= SEQUENCE {
+ lcp-Restriction ENUMERATED {supported} OPTIONAL,
+ dummy ENUMERATED {supported} OPTIONAL,
+ lch-ToSCellRestriction ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ recommendedBitRate ENUMERATED {supported} OPTIONAL,
+ recommendedBitRateQuery ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ recommendedBitRateMultiplier-r16 ENUMERATED {supported} OPTIONAL,
+ secondaryDRX-Group ENUMERATED {supported} OPTIONAL,
+ preEmptiveBSR-r16 ENUMERATED {supported} OPTIONAL,
+ autonomousTransmission-r16 ENUMERATED {supported} OPTIONAL,
+ lch-PriorityBasedPrioritization-r16 ENUMERATED {supported} OPTIONAL,
+ lch-ToConfiguredGrantMapping-r16 ENUMERATED {supported} OPTIONAL,
+ lch-ToGrantPriorityRestriction-r16 ENUMERATED {supported} OPTIONAL,
+ singlePHR-P-r16 ENUMERATED {supported} OPTIONAL,
+ ul-LBT-FailureDetectionRecovery-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+MAC-ParametersFRX-Diff-r16 ::= SEQUENCE {
+ directMCG-SCellActivation-r16 ENUMERATED {supported} OPTIONAL,
+ directMCG-SCellActivationResume-r16 ENUMERATED {supported} OPTIONAL,
+ directSCG-SCellActivation-r16 ENUMERATED {supported} OPTIONAL,
+ directSCG-SCellActivationResume-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 19-1: DRX Adaptation
+ drx-Adaptation-r16 SEQUENCE {
+ licensedBand-r16 MinTimeGap-r16 OPTIONAL,
+ unlicensedBand-r16 MinTimeGap-r16 OPTIONAL
+ } OPTIONAL,
+ ...
+}
+
+MAC-ParametersXDD-Diff ::= SEQUENCE {
+ skipUplinkTxDynamic ENUMERATED {supported} OPTIONAL,
+ logicalChannelSR-DelayTimer ENUMERATED {supported} OPTIONAL,
+ longDRX-Cycle ENUMERATED {supported} OPTIONAL,
+ shortDRX-Cycle ENUMERATED {supported} OPTIONAL,
+ multipleSR-Configurations ENUMERATED {supported} OPTIONAL,
+ multipleConfiguredGrants ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+MinTimeGap-r16 ::= SEQUENCE {
+ scs-15kHz-r16 ENUMERATED {sl1, sl3} OPTIONAL,
+ scs-30kHz-r16 ENUMERATED {sl1, sl6} OPTIONAL,
+ scs-60kHz-r16 ENUMERATED {sl1, sl12} OPTIONAL,
+ scs-120kHz-r16 ENUMERATED {sl2, sl24} OPTIONAL
+}
+
+-- TAG-MAC-PARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERS-START
+
+MeasAndMobParameters ::= SEQUENCE {
+ measAndMobParametersCommon MeasAndMobParametersCommon OPTIONAL,
+ measAndMobParametersXDD-Diff MeasAndMobParametersXDD-Diff OPTIONAL,
+ measAndMobParametersFRX-Diff MeasAndMobParametersFRX-Diff OPTIONAL
+}
+
+MeasAndMobParametersCommon ::= SEQUENCE {
+ supportedGapPattern BIT STRING (SIZE (22)) OPTIONAL,
+ ssb-RLM ENUMERATED {supported} OPTIONAL,
+ ssb-AndCSI-RS-RLM ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ eventB-MeasAndReport ENUMERATED {supported} OPTIONAL,
+ handoverFDD-TDD ENUMERATED {supported} OPTIONAL,
+ eutra-CGI-Reporting ENUMERATED {supported} OPTIONAL,
+ nr-CGI-Reporting ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ independentGapConfig ENUMERATED {supported} OPTIONAL,
+ periodicEUTRA-MeasAndReport ENUMERATED {supported} OPTIONAL,
+ handoverFR1-FR2 ENUMERATED {supported} OPTIONAL,
+ maxNumberCSI-RS-RRM-RS-SINR ENUMERATED {n4, n8, n16, n32, n64, n96} OPTIONAL
+ ]],
+ [[
+ nr-CGI-Reporting-ENDC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ eutra-CGI-Reporting-NEDC ENUMERATED {supported} OPTIONAL,
+ eutra-CGI-Reporting-NRDC ENUMERATED {supported} OPTIONAL,
+ nr-CGI-Reporting-NEDC ENUMERATED {supported} OPTIONAL,
+ nr-CGI-Reporting-NRDC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ reportAddNeighMeasForPeriodic-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverParametersCommon-r16 SEQUENCE {
+ condHandoverFDD-TDD-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverFR1-FR2-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ nr-NeedForGap-Reporting-r16 ENUMERATED {supported} OPTIONAL,
+ supportedGapPattern-NRonly-r16 BIT STRING (SIZE (10)) OPTIONAL,
+ supportedGapPattern-NRonly-NEDC-r16 ENUMERATED {supported} OPTIONAL,
+ maxNumberCLI-RSSI-r16 ENUMERATED {n8, n16, n32, n64} OPTIONAL,
+ maxNumberCLI-SRS-RSRP-r16 ENUMERATED {n4, n8, n16, n32} OPTIONAL,
+ maxNumberPerSlotCLI-SRS-RSRP-r16 ENUMERATED {n2, n4, n8} OPTIONAL,
+ mfbi-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ multipleNS-And-Pmax-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ nr-CGI-Reporting-NPN-r16 ENUMERATED {supported} OPTIONAL,
+ idleInactiveEUTRA-MeasReport-r16 ENUMERATED {supported} OPTIONAL,
+ idleInactive-ValidityArea-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+
+}
+
+MeasAndMobParametersXDD-Diff ::= SEQUENCE {
+ intraAndInterF-MeasAndReport ENUMERATED {supported} OPTIONAL,
+ eventA-MeasAndReport ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ handoverInterF ENUMERATED {supported} OPTIONAL,
+ handoverLTE-EPC ENUMERATED {supported} OPTIONAL,
+ handoverLTE-5GC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ sftd-MeasNR-Neigh ENUMERATED {supported} OPTIONAL,
+ sftd-MeasNR-Neigh-DRX ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ condHandoverParametersXDD-Diff-r16 SEQUENCE {
+ condHandover-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverFailure-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverTwoTriggerEvents-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ pcellT312-r16 ENUMERATED {supported} OPTIONAL,
+ handoverIntraF-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ eutra-AutonomousGaps-r16 ENUMERATED {supported} OPTIONAL,
+ eutra-AutonomousGapsNEDC-r16 ENUMERATED {supported} OPTIONAL,
+ eutra-AutonomousGapsNRDC-r16 ENUMERATED {supported} OPTIONAL,
+ nr-AutonomousGaps-r16 ENUMERATED {supported} OPTIONAL,
+ nr-AutonomousGaps-ENDC-r16 ENUMERATED {supported} OPTIONAL,
+ nr-AutonomousGapsNEDC-r16 ENUMERATED {supported} OPTIONAL,
+ nr-AutonomousGapsNRDC-r16 ENUMERATED {supported} OPTIONAL,
+ handoverUTRA-FDD-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+
+}
+
+MeasAndMobParametersFRX-Diff ::= SEQUENCE {
+ ss-SINR-Meas ENUMERATED {supported} OPTIONAL,
+ csi-RSRP-AndRSRQ-MeasWithSSB ENUMERATED {supported} OPTIONAL,
+ csi-RSRP-AndRSRQ-MeasWithoutSSB ENUMERATED {supported} OPTIONAL,
+ csi-SINR-Meas ENUMERATED {supported} OPTIONAL,
+ csi-RS-RLM ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ handoverInterF ENUMERATED {supported} OPTIONAL,
+ handoverLTE-EPC ENUMERATED {supported} OPTIONAL,
+ handoverLTE-5GC ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ maxNumberResource-CSI-RS-RLM ENUMERATED {n2, n4, n6, n8} OPTIONAL
+ ]],
+ [[
+ simultaneousRxDataSSB-DiffNumerology ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ nr-AutonomousGaps-r16 ENUMERATED {supported} OPTIONAL,
+ nr-AutonomousGaps-ENDC-r16 ENUMERATED {supported} OPTIONAL,
+ handoverUTRA-FDD-r16 ENUMERATED {supported} OPTIONAL,
+ cli-RSSI-Meas-r16 ENUMERATED {supported} OPTIONAL,
+ cli-SRS-RSRP-Meas-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverParametersFRX-Diff-r16 SEQUENCE {
+ condHandover-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverFailure-r16 ENUMERATED {supported} OPTIONAL,
+ condHandoverTwoTriggerEvents-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ pcellT312-r16 ENUMERATED {supported} OPTIONAL,
+ interFrequencyMeas-Nogap-r16 ENUMERATED {supported} OPTIONAL,
+ simultaneousRxDataSSB-DiffNumerology-Inter-r16 ENUMERATED {supported} OPTIONAL,
+ handoverIntraF-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ idleInactiveNR-MeasReport-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+-- TAG-MEASANDMOBPARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERSMRDC-START
+
+MeasAndMobParametersMRDC ::= SEQUENCE {
+ measAndMobParametersMRDC-Common MeasAndMobParametersMRDC-Common OPTIONAL,
+ measAndMobParametersMRDC-XDD-Diff MeasAndMobParametersMRDC-XDD-Diff OPTIONAL,
+ measAndMobParametersMRDC-FRX-Diff MeasAndMobParametersMRDC-FRX-Diff OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1560 ::= SEQUENCE {
+ measAndMobParametersMRDC-XDD-Diff-v1560 MeasAndMobParametersMRDC-XDD-Diff-v1560 OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1610 ::= SEQUENCE {
+ measAndMobParametersMRDC-Common-v1610 MeasAndMobParametersMRDC-Common-v1610 OPTIONAL,
+ measAndMobParametersMRDC-XDD-Diff-v1610 MeasAndMobParametersMRDC-XDD-Diff-v1610 OPTIONAL,
+ measAndMobParametersMRDC-FRX-Diff-v1610 MeasAndMobParametersMRDC-FRX-Diff-v1610 OPTIONAL,
+ interNR-MeasEUTRA-IAB-r16 ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common ::= SEQUENCE {
+ independentGapConfig ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common-v1610 ::= SEQUENCE {
+ condPSCellChangeParametersCommon-r16 SEQUENCE {
+ condPSCellChangeFDD-TDD-r16 ENUMERATED {supported} OPTIONAL,
+ condPSCellChangeFR1-FR2-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff ::= SEQUENCE {
+ sftd-MeasPSCell ENUMERATED {supported} OPTIONAL,
+ sftd-MeasNR-Cell ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff-v1560 ::= SEQUENCE {
+ sftd-MeasPSCell-NEDC ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff-v1610 ::= SEQUENCE {
+ condPSCellChangeParametersXDD-Diff-r16 SEQUENCE {
+ condPSCellChange-r16 ENUMERATED {supported} OPTIONAL,
+ condPSCellChangeTwoTriggerEvents-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ pscellT312-r16 ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-FRX-Diff ::= SEQUENCE {
+ simultaneousRxDataSSB-DiffNumerology ENUMERATED {supported} OPTIONAL
+}
+
+MeasAndMobParametersMRDC-FRX-Diff-v1610 ::= SEQUENCE {
+ condPSCellChangeParametersFRX-Diff-r16 SEQUENCE {
+ condPSCellChange-r16 ENUMERATED {supported} OPTIONAL,
+ condPSCellChangeTwoTriggerEvents-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ pscellT312-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-MEASANDMOBPARAMETERSMRDC-STOP
+-- TAG-MIMO-LAYERS-START
+
+MIMO-LayersDL ::= ENUMERATED {twoLayers, fourLayers, eightLayers}
+
+MIMO-LayersUL ::= ENUMERATED {oneLayer, twoLayers, fourLayers}
+
+-- TAG-MIMO-LAYERS-STOP
+-- TAG-MIMO-PARAMETERSPERBAND-START
+
+MIMO-ParametersPerBand ::= SEQUENCE {
+ tci-StatePDSCH SEQUENCE {
+ maxNumberConfiguredTCIstatesPerCC ENUMERATED {n4, n8, n16, n32, n64, n128} OPTIONAL,
+ maxNumberActiveTCI-PerBWP ENUMERATED {n1, n2, n4, n8} OPTIONAL
+ } OPTIONAL,
+ additionalActiveTCI-StatePDCCH ENUMERATED {supported} OPTIONAL,
+ pusch-TransCoherence ENUMERATED {nonCoherent, partialCoherent, fullCoherent} OPTIONAL,
+ beamCorrespondenceWithoutUL-BeamSweeping ENUMERATED {supported} OPTIONAL,
+ periodicBeamReport ENUMERATED {supported} OPTIONAL,
+ aperiodicBeamReport ENUMERATED {supported} OPTIONAL,
+ sp-BeamReportPUCCH ENUMERATED {supported} OPTIONAL,
+ sp-BeamReportPUSCH ENUMERATED {supported} OPTIONAL,
+ dummy1 DummyG OPTIONAL,
+ maxNumberRxBeam INTEGER (2..8) OPTIONAL,
+ maxNumberRxTxBeamSwitchDL SEQUENCE {
+ scs-15kHz ENUMERATED {n4, n7, n14} OPTIONAL,
+ scs-30kHz ENUMERATED {n4, n7, n14} OPTIONAL,
+ scs-60kHz ENUMERATED {n4, n7, n14} OPTIONAL,
+ scs-120kHz ENUMERATED {n4, n7, n14} OPTIONAL,
+ scs-240kHz ENUMERATED {n4, n7, n14} OPTIONAL
+ } OPTIONAL,
+ maxNumberNonGroupBeamReporting ENUMERATED {n1, n2, n4} OPTIONAL,
+ groupBeamReporting ENUMERATED {supported} OPTIONAL,
+ uplinkBeamManagement SEQUENCE {
+ maxNumberSRS-ResourcePerSet-BM ENUMERATED {n2, n4, n8, n16},
+ maxNumberSRS-ResourceSet INTEGER (1..8)
+ } OPTIONAL,
+ maxNumberCSI-RS-BFD INTEGER (1..64) OPTIONAL,
+ maxNumberSSB-BFD INTEGER (1..64) OPTIONAL,
+ maxNumberCSI-RS-SSB-CBD INTEGER (1..256) OPTIONAL,
+ dummy2 ENUMERATED {supported} OPTIONAL,
+ twoPortsPTRS-UL ENUMERATED {supported} OPTIONAL,
+ dummy5 SRS-Resources OPTIONAL,
+ dummy3 INTEGER (1..4) OPTIONAL,
+ beamReportTiming SEQUENCE {
+ scs-15kHz ENUMERATED {sym2, sym4, sym8} OPTIONAL,
+ scs-30kHz ENUMERATED {sym4, sym8, sym14, sym28} OPTIONAL,
+ scs-60kHz ENUMERATED {sym8, sym14, sym28} OPTIONAL,
+ scs-120kHz ENUMERATED {sym14, sym28, sym56} OPTIONAL
+ } OPTIONAL,
+ ptrs-DensityRecommendationSetDL SEQUENCE {
+ scs-15kHz PTRS-DensityRecommendationDL OPTIONAL,
+ scs-30kHz PTRS-DensityRecommendationDL OPTIONAL,
+ scs-60kHz PTRS-DensityRecommendationDL OPTIONAL,
+ scs-120kHz PTRS-DensityRecommendationDL OPTIONAL
+ } OPTIONAL,
+ ptrs-DensityRecommendationSetUL SEQUENCE {
+ scs-15kHz PTRS-DensityRecommendationUL OPTIONAL,
+ scs-30kHz PTRS-DensityRecommendationUL OPTIONAL,
+ scs-60kHz PTRS-DensityRecommendationUL OPTIONAL,
+ scs-120kHz PTRS-DensityRecommendationUL OPTIONAL
+ } OPTIONAL,
+ dummy4 DummyH OPTIONAL,
+ aperiodicTRS ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ dummy6 ENUMERATED {true} OPTIONAL,
+ beamManagementSSB-CSI-RS BeamManagementSSB-CSI-RS OPTIONAL,
+ beamSwitchTiming SEQUENCE {
+ scs-60kHz ENUMERATED {sym14, sym28, sym48, sym224, sym336} OPTIONAL,
+ scs-120kHz ENUMERATED {sym14, sym28, sym48, sym224, sym336} OPTIONAL
+ } OPTIONAL,
+ codebookParameters CodebookParameters OPTIONAL,
+ csi-RS-IM-ReceptionForFeedback CSI-RS-IM-ReceptionForFeedback OPTIONAL,
+ csi-RS-ProcFrameworkForSRS CSI-RS-ProcFrameworkForSRS OPTIONAL,
+ csi-ReportFramework CSI-ReportFramework OPTIONAL,
+ csi-RS-ForTracking CSI-RS-ForTracking OPTIONAL,
+ srs-AssocCSI-RS SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource OPTIONAL,
+ spatialRelations SpatialRelations OPTIONAL
+ ]],
+ [[
+ -- R1 16-2b-0: Support of default QCL assumption with two TCI states
+ defaultQCL-TwoTCI-r16 ENUMERATED {supported} OPTIONAL,
+ codebookParametersPerBand-r16 CodebookParameters-v1610 OPTIONAL
+ ]]
+
+}
+
+DummyG ::= SEQUENCE {
+ maxNumberSSB-CSI-RS-ResourceOneTx ENUMERATED {n8, n16, n32, n64},
+ maxNumberSSB-CSI-RS-ResourceTwoTx ENUMERATED {n0, n4, n8, n16, n32, n64},
+ supportedCSI-RS-Density ENUMERATED {one, three, oneAndThree}
+}
+
+BeamManagementSSB-CSI-RS ::= SEQUENCE {
+ maxNumberSSB-CSI-RS-ResourceOneTx ENUMERATED {n0, n8, n16, n32, n64},
+ maxNumberCSI-RS-Resource ENUMERATED {n0, n4, n8, n16, n32, n64},
+ maxNumberCSI-RS-ResourceTwoTx ENUMERATED {n0, n4, n8, n16, n32, n64},
+ supportedCSI-RS-Density ENUMERATED {one, three, oneAndThree} OPTIONAL,
+ maxNumberAperiodicCSI-RS-Resource ENUMERATED {n0, n1, n4, n8, n16, n32, n64}
+}
+
+DummyH ::= SEQUENCE {
+ burstLength INTEGER (1..2),
+ maxSimultaneousResourceSetsPerCC INTEGER (1..8),
+ maxConfiguredResourceSetsPerCC INTEGER (1..64),
+ maxConfiguredResourceSetsAllCC INTEGER (1..128)
+}
+
+CSI-RS-ForTracking ::= SEQUENCE {
+ maxBurstLength INTEGER (1..2),
+ maxSimultaneousResourceSetsPerCC INTEGER (1..8),
+ maxConfiguredResourceSetsPerCC INTEGER (1..64),
+ maxConfiguredResourceSetsAllCC INTEGER (1..256)
+}
+
+CSI-RS-IM-ReceptionForFeedback ::= SEQUENCE {
+ maxConfigNumberNZP-CSI-RS-PerCC INTEGER (1..64),
+ maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC INTEGER (2..256),
+ maxConfigNumberCSI-IM-PerCC ENUMERATED {n1, n2, n4, n8, n16, n32},
+ maxNumberSimultaneousNZP-CSI-RS-PerCC INTEGER (1..64),
+ totalNumberPortsSimultaneousNZP-CSI-RS-PerCC INTEGER (2..256)
+}
+
+CSI-RS-ProcFrameworkForSRS ::= SEQUENCE {
+ maxNumberPeriodicSRS-AssocCSI-RS-PerBWP INTEGER (1..4),
+ maxNumberAperiodicSRS-AssocCSI-RS-PerBWP INTEGER (1..4),
+ maxNumberSP-SRS-AssocCSI-RS-PerBWP INTEGER (0..4),
+ simultaneousSRS-AssocCSI-RS-PerCC INTEGER (1..8)
+}
+
+CSI-ReportFramework ::= SEQUENCE {
+ maxNumberPeriodicCSI-PerBWP-ForCSI-Report INTEGER (1..4),
+ maxNumberAperiodicCSI-PerBWP-ForCSI-Report INTEGER (1..4),
+ maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report INTEGER (0..4),
+ maxNumberPeriodicCSI-PerBWP-ForBeamReport INTEGER (1..4),
+ maxNumberAperiodicCSI-PerBWP-ForBeamReport INTEGER (1..4),
+ maxNumberAperiodicCSI-triggeringStatePerCC ENUMERATED {n3, n7, n15, n31, n63, n128},
+ maxNumberSemiPersistentCSI-PerBWP-ForBeamReport INTEGER (0..4),
+ simultaneousCSI-ReportsPerCC INTEGER (1..8)
+}
+
+PTRS-DensityRecommendationDL ::= SEQUENCE {
+ frequencyDensity1 INTEGER (1..276),
+ frequencyDensity2 INTEGER (1..276),
+ timeDensity1 INTEGER (0..29),
+ timeDensity2 INTEGER (0..29),
+ timeDensity3 INTEGER (0..29)
+}
+
+PTRS-DensityRecommendationUL ::= SEQUENCE {
+ frequencyDensity1 INTEGER (1..276),
+ frequencyDensity2 INTEGER (1..276),
+ timeDensity1 INTEGER (0..29),
+ timeDensity2 INTEGER (0..29),
+ timeDensity3 INTEGER (0..29),
+ sampleDensity1 INTEGER (1..276),
+ sampleDensity2 INTEGER (1..276),
+ sampleDensity3 INTEGER (1..276),
+ sampleDensity4 INTEGER (1..276),
+ sampleDensity5 INTEGER (1..276)
+}
+
+SpatialRelations ::= SEQUENCE {
+ maxNumberConfiguredSpatialRelations ENUMERATED {n4, n8, n16, n32, n64, n96},
+ maxNumberActiveSpatialRelations ENUMERATED {n1, n2, n4, n8, n14},
+ additionalActiveSpatialRelationPUCCH ENUMERATED {supported} OPTIONAL,
+ maxNumberDL-RS-QCL-TypeD ENUMERATED {n1, n2, n4, n8, n14}
+}
+
+DummyI ::= SEQUENCE {
+ supportedSRS-TxPortSwitch ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, tr-equal},
+ txSwitchImpactToRx ENUMERATED {true} OPTIONAL
+}
+
+-- TAG-MIMO-PARAMETERSPERBAND-STOP
+-- TAG-MODULATIONORDER-START
+
+ModulationOrder ::= ENUMERATED {bpsk-halfpi, bpsk, qpsk, qam16, qam64, qam256}
+
+-- TAG-MODULATIONORDER-STOP
+-- TAG-MRDC-PARAMETERS-START
+
+MRDC-Parameters ::= SEQUENCE {
+ singleUL-Transmission ENUMERATED {supported} OPTIONAL,
+ dynamicPowerSharingENDC ENUMERATED {supported} OPTIONAL,
+ tdm-Pattern ENUMERATED {supported} OPTIONAL,
+ ul-SharingEUTRA-NR ENUMERATED {tdm, fdm, both} OPTIONAL,
+ ul-SwitchingTimeEUTRA-NR ENUMERATED {type1, type2} OPTIONAL,
+ simultaneousRxTxInterBandENDC ENUMERATED {supported} OPTIONAL,
+ asyncIntraBandENDC ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ dualPA-Architecture ENUMERATED {supported} OPTIONAL,
+ intraBandENDC-Support ENUMERATED {non-contiguous, both} OPTIONAL,
+ ul-TimingAlignmentEUTRA-NR ENUMERATED {required} OPTIONAL
+ ]],
+ [[
+ maxUplinkDutyCycle-interBandENDC-TDD-PC2-r16 SEQUENCE{
+ eutra-TDD-Config0-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config1-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config2-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config3-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config4-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config5-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL,
+ eutra-TDD-Config6-r16 ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100} OPTIONAL
+ } OPTIONAL
+ ]]
+}
+
+MRDC-Parameters-v1580 ::= SEQUENCE {
+ dynamicPowerSharingNEDC ENUMERATED {supported} OPTIONAL
+}
+
+MRDC-Parameters-v1590 ::= SEQUENCE {
+ interBandContiguousMRDC ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-MRDC-PARAMETERS-STOP
+-- TAG-NRDC-PARAMETERS-START
+
+NRDC-Parameters ::= SEQUENCE {
+ measAndMobParametersNRDC MeasAndMobParametersMRDC OPTIONAL,
+ generalParametersNRDC GeneralParametersMRDC-XDD-Diff OPTIONAL,
+ fdd-Add-UE-NRDC-Capabilities UE-MRDC-CapabilityAddXDD-Mode OPTIONAL,
+ tdd-Add-UE-NRDC-Capabilities UE-MRDC-CapabilityAddXDD-Mode OPTIONAL,
+ fr1-Add-UE-NRDC-Capabilities UE-MRDC-CapabilityAddFRX-Mode OPTIONAL,
+ fr2-Add-UE-NRDC-Capabilities UE-MRDC-CapabilityAddFRX-Mode OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ dummy SEQUENCE {} OPTIONAL
+}
+
+NRDC-Parameters-v1570 ::= SEQUENCE {
+ sfn-SyncNRDC ENUMERATED {supported} OPTIONAL
+}
+
+NRDC-Parameters-v1610 ::= SEQUENCE {
+ measAndMobParametersNRDC-v1610 MeasAndMobParametersMRDC-v1610 OPTIONAL
+}
+
+
+-- TAG-NRDC-PARAMETERS-STOP
+-- TAG-OLPC-SRS-POS-START
+
+OLPC-SRS-Pos-r16 ::= SEQUENCE {
+ olpc-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ olpc-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ olpc-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ maxNumberPathLossEstimatePerServing-r16 ENUMERATED {n1, n4, n8, n16} OPTIONAL
+}
+
+--TAG-OLPC-SRS-POS-STOP
+-- TAG-PDCP-PARAMETERS-START
+
+PDCP-Parameters ::= SEQUENCE {
+ supportedROHC-Profiles SEQUENCE {
+ profile0x0000 BOOLEAN,
+ profile0x0001 BOOLEAN,
+ profile0x0002 BOOLEAN,
+ profile0x0003 BOOLEAN,
+ profile0x0004 BOOLEAN,
+ profile0x0006 BOOLEAN,
+ profile0x0101 BOOLEAN,
+ profile0x0102 BOOLEAN,
+ profile0x0103 BOOLEAN,
+ profile0x0104 BOOLEAN
+ },
+ maxNumberROHC-ContextSessions ENUMERATED {cs2, cs4, cs8, cs12, cs16, cs24, cs32, cs48, cs64,
+ cs128, cs256, cs512, cs1024, cs16384, spare2, spare1},
+ uplinkOnlyROHC-Profiles ENUMERATED {supported} OPTIONAL,
+ continueROHC-Context ENUMERATED {supported} OPTIONAL,
+ outOfOrderDelivery ENUMERATED {supported} OPTIONAL,
+ shortSN ENUMERATED {supported} OPTIONAL,
+ pdcp-DuplicationSRB ENUMERATED {supported} OPTIONAL,
+ pdcp-DuplicationMCG-OrSCG-DRB ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ drb-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ non-DRB-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ extendedDiscardTimer-r16 ENUMERATED {supported} OPTIONAL,
+ continueEHC-Context-r16 ENUMERATED {supported} OPTIONAL,
+ ehc-r16 ENUMERATED {supported} OPTIONAL,
+ maxNumberEHC-Contexts-r16 ENUMERATED {cs2, cs4, cs8, cs16, cs32, cs64, cs128, cs256, cs512,
+ cs1024, cs2048, cs4096, cs8192, cs16384, cs32768, cs65536} OPTIONAL,
+ jointEHC-ROHC-Config-r16 ENUMERATED {supported} OPTIONAL,
+ pdcp-DuplicationMoreThanTwoRLC-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+-- TAG-PDCP-PARAMETERS-STOP
+-- TAG-PDCP-PARAMETERSMRDC-START
+
+PDCP-ParametersMRDC ::= SEQUENCE {
+ pdcp-DuplicationSplitSRB ENUMERATED {supported} OPTIONAL,
+ pdcp-DuplicationSplitDRB ENUMERATED {supported} OPTIONAL
+}
+
+PDCP-ParametersMRDC-v1610 ::= SEQUENCE {
+ scg-DRB-NR-IAB-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-PDCP-PARAMETERSMRDC-STOP
+-- TAG-PHY-PARAMETERS-START
+
+Phy-Parameters ::= SEQUENCE {
+ phy-ParametersCommon Phy-ParametersCommon OPTIONAL,
+ phy-ParametersXDD-Diff Phy-ParametersXDD-Diff OPTIONAL,
+ phy-ParametersFRX-Diff Phy-ParametersFRX-Diff OPTIONAL,
+ phy-ParametersFR1 Phy-ParametersFR1 OPTIONAL,
+ phy-ParametersFR2 Phy-ParametersFR2 OPTIONAL
+}
+
+Phy-ParametersCommon ::= SEQUENCE {
+ csi-RS-CFRA-ForHO ENUMERATED {supported} OPTIONAL,
+ dynamicPRB-BundlingDL ENUMERATED {supported} OPTIONAL,
+ sp-CSI-ReportPUCCH ENUMERATED {supported} OPTIONAL,
+ sp-CSI-ReportPUSCH ENUMERATED {supported} OPTIONAL,
+ nzp-CSI-RS-IntefMgmt ENUMERATED {supported} OPTIONAL,
+ type2-SP-CSI-Feedback-LongPUCCH ENUMERATED {supported} OPTIONAL,
+ precoderGranularityCORESET ENUMERATED {supported} OPTIONAL,
+ dynamicHARQ-ACK-Codebook ENUMERATED {supported} OPTIONAL,
+ semiStaticHARQ-ACK-Codebook ENUMERATED {supported} OPTIONAL,
+ spatialBundlingHARQ-ACK ENUMERATED {supported} OPTIONAL,
+ dynamicBetaOffsetInd-HARQ-ACK-CSI ENUMERATED {supported} OPTIONAL,
+ pucch-Repetition-F1-3-4 ENUMERATED {supported} OPTIONAL,
+ ra-Type0-PUSCH ENUMERATED {supported} OPTIONAL,
+ dynamicSwitchRA-Type0-1-PDSCH ENUMERATED {supported} OPTIONAL,
+ dynamicSwitchRA-Type0-1-PUSCH ENUMERATED {supported} OPTIONAL,
+ pdsch-MappingTypeA ENUMERATED {supported} OPTIONAL,
+ pdsch-MappingTypeB ENUMERATED {supported} OPTIONAL,
+ interleavingVRB-ToPRB-PDSCH ENUMERATED {supported} OPTIONAL,
+ interSlotFreqHopping-PUSCH ENUMERATED {supported} OPTIONAL,
+ type1-PUSCH-RepetitionMultiSlots ENUMERATED {supported} OPTIONAL,
+ type2-PUSCH-RepetitionMultiSlots ENUMERATED {supported} OPTIONAL,
+ pusch-RepetitionMultiSlots ENUMERATED {supported} OPTIONAL,
+ pdsch-RepetitionMultiSlots ENUMERATED {supported} OPTIONAL,
+ downlinkSPS ENUMERATED {supported} OPTIONAL,
+ configuredUL-GrantType1 ENUMERATED {supported} OPTIONAL,
+ configuredUL-GrantType2 ENUMERATED {supported} OPTIONAL,
+ pre-EmptIndication-DL ENUMERATED {supported} OPTIONAL,
+ cbg-TransIndication-DL ENUMERATED {supported} OPTIONAL,
+ cbg-TransIndication-UL ENUMERATED {supported} OPTIONAL,
+ cbg-FlushIndication-DL ENUMERATED {supported} OPTIONAL,
+ dynamicHARQ-ACK-CodeB-CBG-Retx-DL ENUMERATED {supported} OPTIONAL,
+ rateMatchingResrcSetSemi-Static ENUMERATED {supported} OPTIONAL,
+ rateMatchingResrcSetDynamic ENUMERATED {supported} OPTIONAL,
+ bwp-SwitchingDelay ENUMERATED {type1, type2} OPTIONAL,
+ ...,
+ [[
+ dummy ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ maxNumberSearchSpaces ENUMERATED {n10} OPTIONAL,
+ rateMatchingCtrlResrcSetDynamic ENUMERATED {supported} OPTIONAL,
+ maxLayersMIMO-Indication ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ spCellPlacement CarrierAggregationVariant OPTIONAL
+ ]],
+ [[
+ -- R1 9-1: Basic channel structure and procedure of 2-step RACH
+ twoStepRACH-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-1: Monitoring DCI format 1_2 and DCI format 0_2
+ dci-Format1-2And0-2-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-1a: Monitoring both DCI format 0_1/1_1 and DCI format 0_2/1_2 in the same search space
+ monitoringDCI-SameSearchSpace-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-10: Type 2 configured grant release by DCI format 0_1
+ type2-CG-ReleaseDCI-0-1-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-11: Type 2 configured grant release by DCI format 0_2
+ type2-CG-ReleaseDCI-0-2-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 12-3: SPS release by DCI format 1_1
+ sps-ReleaseDCI-1-1-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 12-3a: SPS release by DCI format 1_2
+ sps-ReleaseDCI-1-2-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 14-8: CSI trigger states containing non-active BWP
+ csi-TriggerStateNon-ActiveBWP-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-2: Support up to 4 SMTCs configured for an IAB node MT per frequency location, including IAB-specific SMTC window periodicities
+ seperateSMTC-InterIAB-Support-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-3: Support RACH configuration separately from the RACH configuration for UE access, including new IAB-specific offset and scaling factors
+ seperateRACH-IAB-Support-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-5a: Support semi-static configuration/indication of UL-Flexible-DL slot formats for IAB-MT resources
+ ul-flexibleDL-SlotFormatSemiStatic-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-5b: Support dynamic indication of UL-Flexible-DL slot formats for IAB-MT resources
+ ul-flexibleDL-SlotFormatDynamics-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ dft-S-OFDM-WaveformUL-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-6: Support DCI Format 2_5 based indication of soft resource availability to an IAB node
+ dci-25-AI-RNTI-Support-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-7: Support T_delta reception.
+ t-DeltaReceptionSupport-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 20-8: Support of Desired guard symbol reporting and provided guard symbok reception.
+ guardSymbolReportReception-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 18-8 HARQ-ACK codebook type and spatial bundling per PUCCH group
+ harqACK-CB-SpatialBundlingPUCCH-Group-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 19-2: Cross Slot Scheduling
+ crossSlotScheduling-r16 SEQUENCE {
+ licensedBand-r16 ENUMERATED {supported} OPTIONAL,
+ unlicensedBand-r16 ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ maxNumberSRS-PosPathLossEstimateAllServingCells-r16 ENUMERATED {n1, n4, n8, n16} OPTIONAL,
+ maxNumberSRS-PosSpatialRelationsAllServingCells-r16 ENUMERATED {n0, n1, n2, n4, n8, n16} OPTIONAL,
+ extendedCG-Periodicities-r16 ENUMERATED {supported} OPTIONAL,
+ extendedSPS-Periodicities-r16 ENUMERATED {supported} OPTIONAL,
+ codebookVariantsList-r16 CodebookVariantsList-r16 OPTIONAL
+ ]]
+}
+
+Phy-ParametersXDD-Diff ::= SEQUENCE {
+ dynamicSFI ENUMERATED {supported} OPTIONAL,
+ twoPUCCH-F0-2-ConsecSymbols ENUMERATED {supported} OPTIONAL,
+ twoDifferentTPC-Loop-PUSCH ENUMERATED {supported} OPTIONAL,
+ twoDifferentTPC-Loop-PUCCH ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ dl-SchedulingOffset-PDSCH-TypeA ENUMERATED {supported} OPTIONAL,
+ dl-SchedulingOffset-PDSCH-TypeB ENUMERATED {supported} OPTIONAL,
+ ul-SchedulingOffset ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+Phy-ParametersFRX-Diff ::= SEQUENCE {
+ dynamicSFI ENUMERATED {supported} OPTIONAL,
+ dummy1 BIT STRING (SIZE (2)) OPTIONAL,
+ twoFL-DMRS BIT STRING (SIZE (2)) OPTIONAL,
+ dummy2 BIT STRING (SIZE (2)) OPTIONAL,
+ dummy3 BIT STRING (SIZE (2)) OPTIONAL,
+ supportedDMRS-TypeDL ENUMERATED {type1, type1And2} OPTIONAL,
+ supportedDMRS-TypeUL ENUMERATED {type1, type1And2} OPTIONAL,
+ semiOpenLoopCSI ENUMERATED {supported} OPTIONAL,
+ csi-ReportWithoutPMI ENUMERATED {supported} OPTIONAL,
+ csi-ReportWithoutCQI ENUMERATED {supported} OPTIONAL,
+ onePortsPTRS BIT STRING (SIZE (2)) OPTIONAL,
+ twoPUCCH-F0-2-ConsecSymbols ENUMERATED {supported} OPTIONAL,
+ pucch-F2-WithFH ENUMERATED {supported} OPTIONAL,
+ pucch-F3-WithFH ENUMERATED {supported} OPTIONAL,
+ pucch-F4-WithFH ENUMERATED {supported} OPTIONAL,
+ pucch-F0-2WithoutFH ENUMERATED {notSupported} OPTIONAL,
+ pucch-F1-3-4WithoutFH ENUMERATED {notSupported} OPTIONAL,
+ mux-SR-HARQ-ACK-CSI-PUCCH-MultiPerSlot ENUMERATED {supported} OPTIONAL,
+ uci-CodeBlockSegmentation ENUMERATED {supported} OPTIONAL,
+ onePUCCH-LongAndShortFormat ENUMERATED {supported} OPTIONAL,
+ twoPUCCH-AnyOthersInSlot ENUMERATED {supported} OPTIONAL,
+ intraSlotFreqHopping-PUSCH ENUMERATED {supported} OPTIONAL,
+ pusch-LBRM ENUMERATED {supported} OPTIONAL,
+ pdcch-BlindDetectionCA INTEGER (4..16) OPTIONAL,
+ tpc-PUSCH-RNTI ENUMERATED {supported} OPTIONAL,
+ tpc-PUCCH-RNTI ENUMERATED {supported} OPTIONAL,
+ tpc-SRS-RNTI ENUMERATED {supported} OPTIONAL,
+ absoluteTPC-Command ENUMERATED {supported} OPTIONAL,
+ twoDifferentTPC-Loop-PUSCH ENUMERATED {supported} OPTIONAL,
+ twoDifferentTPC-Loop-PUCCH ENUMERATED {supported} OPTIONAL,
+ pusch-HalfPi-BPSK ENUMERATED {supported} OPTIONAL,
+ pucch-F3-4-HalfPi-BPSK ENUMERATED {supported} OPTIONAL,
+ almostContiguousCP-OFDM-UL ENUMERATED {supported} OPTIONAL,
+ sp-CSI-RS ENUMERATED {supported} OPTIONAL,
+ sp-CSI-IM ENUMERATED {supported} OPTIONAL,
+ tdd-MultiDL-UL-SwitchPerSlot ENUMERATED {supported} OPTIONAL,
+ multipleCORESET ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ csi-RS-IM-ReceptionForFeedback CSI-RS-IM-ReceptionForFeedback OPTIONAL,
+ csi-RS-ProcFrameworkForSRS CSI-RS-ProcFrameworkForSRS OPTIONAL,
+ csi-ReportFramework CSI-ReportFramework OPTIONAL,
+ mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot SEQUENCE {
+ sameSymbol ENUMERATED {supported} OPTIONAL,
+ diffSymbol ENUMERATED {supported} OPTIONAL
+ } OPTIONAL,
+ mux-SR-HARQ-ACK-PUCCH ENUMERATED {supported} OPTIONAL,
+ mux-MultipleGroupCtrlCH-Overlap ENUMERATED {supported} OPTIONAL,
+ dl-SchedulingOffset-PDSCH-TypeA ENUMERATED {supported} OPTIONAL,
+ dl-SchedulingOffset-PDSCH-TypeB ENUMERATED {supported} OPTIONAL,
+ ul-SchedulingOffset ENUMERATED {supported} OPTIONAL,
+ dl-64QAM-MCS-TableAlt ENUMERATED {supported} OPTIONAL,
+ ul-64QAM-MCS-TableAlt ENUMERATED {supported} OPTIONAL,
+ cqi-TableAlt ENUMERATED {supported} OPTIONAL,
+ oneFL-DMRS-TwoAdditionalDMRS-UL ENUMERATED {supported} OPTIONAL,
+ twoFL-DMRS-TwoAdditionalDMRS-UL ENUMERATED {supported} OPTIONAL,
+ oneFL-DMRS-ThreeAdditionalDMRS-UL ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ pdcch-BlindDetectionNRDC SEQUENCE {
+ pdcch-BlindDetectionMCG-UE INTEGER (1..15),
+ pdcch-BlindDetectionSCG-UE INTEGER (1..15)
+ } OPTIONAL,
+ mux-HARQ-ACK-PUSCH-DiffSymbol ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ -- R1 11-1b: Type 1 HARQ-ACK codebook support for relative TDRA for DL
+ type1-HARQ-ACK-Codebook-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 11-8: Enhanced UL power control scheme
+ enhancedPowerControl-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 16-1b-1: TCI state activation across multiple CCs
+ simultaneousTCI-ActMultipleCC-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 16-1b-2: Spatial relation update across multiple CCs
+ simultaneousSpatialRelationMultipleCC-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 16-1c: Support of default spatial relation and pathloss reference RS for dedicated-PUCCH/SRS and PUSCH
+ defaultSpatialRelationPathlossRS-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 16-1d: Support of spatial relation update for AP-SRS via MAC CE
+ spatialRelationUpdateAP-SRS-r16 ENUMERATED {supported} OPTIONAL,
+ cli-RSSI-FDM-DL-r16 ENUMERATED {supported} OPTIONAL,
+ cli-SRS-RSRP-FDM-DL-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 19-3: Maximum MIMO Layer Adaptation
+ maxLayersMIMO-Adaptation-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+
+}
+
+Phy-ParametersFR1 ::= SEQUENCE {
+ pdcch-MonitoringSingleOccasion ENUMERATED {supported} OPTIONAL,
+ scs-60kHz ENUMERATED {supported} OPTIONAL,
+ pdsch-256QAM-FR1 ENUMERATED {supported} OPTIONAL,
+ pdsch-RE-MappingFR1-PerSymbol ENUMERATED {n10, n20} OPTIONAL,
+ ...,
+ [[
+ pdsch-RE-MappingFR1-PerSlot ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+ n144, n160, n176, n192, n208, n224, n240, n256} OPTIONAL
+ ]]
+}
+
+Phy-ParametersFR2 ::= SEQUENCE {
+ dummy ENUMERATED {supported} OPTIONAL,
+ pdsch-RE-MappingFR2-PerSymbol ENUMERATED {n6, n20} OPTIONAL,
+ ...,
+ [[
+ pCell-FR2 ENUMERATED {supported} OPTIONAL,
+ pdsch-RE-MappingFR2-PerSlot ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+ n144, n160, n176, n192, n208, n224, n240, n256} OPTIONAL
+ ]]
+}
+
+-- TAG-PHY-PARAMETERS-STOP
+-- TAG-PHY-PARAMETERSMRDC-START
+
+Phy-ParametersMRDC ::= SEQUENCE {
+ naics-Capability-List SEQUENCE (SIZE (1..maxNrofNAICS-Entries)) OF NAICS-Capability-Entry OPTIONAL,
+ ...,
+ [[
+ spCellPlacement CarrierAggregationVariant OPTIONAL
+ ]]
+}
+
+NAICS-Capability-Entry ::= SEQUENCE {
+ numberOfNAICS-CapableCC INTEGER(1..5),
+ numberOfAggregatedPRB ENUMERATED {n50, n75, n100, n125, n150, n175, n200, n225,
+ n250, n275, n300, n350, n400, n450, n500, spare},
+ ...
+}
+
+-- TAG-PHY-PARAMETERSMRDC-STOP
+-- TAG-POWSAV-PARAMETERS-START
+
+PowSav-Parameters-r16 ::= SEQUENCE {
+ powSav-ParametersCommon-r16 PowSav-ParametersCommon-r16 OPTIONAL,
+ powSav-ParametersFRX-Diff-r16 PowSav-ParametersFRX-Diff-r16 OPTIONAL,
+ ...
+}
+
+PowSav-ParametersCommon-r16 ::= SEQUENCE {
+ drx-Preference-r16 ENUMERATED {supported} OPTIONAL,
+ maxCC-Preference-r16 ENUMERATED {supported} OPTIONAL,
+ releasePreference-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 19-4a: UE assistance information
+ minSchedulingOffsetPreference-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+PowSav-ParametersFRX-Diff-r16 ::= SEQUENCE {
+ maxBW-Preference-r16 ENUMERATED {supported} OPTIONAL,
+ maxMIMO-LayerPreference-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+-- TAG-POWSAV-PARAMETERS-STOP
+-- TAG-PROCESSINGPARAMETERS-START
+
+ProcessingParameters ::= SEQUENCE {
+ fallback ENUMERATED {sc, cap1-only},
+ differentTB-PerSlot SEQUENCE {
+ upto1 NumberOfCarriers OPTIONAL,
+ upto2 NumberOfCarriers OPTIONAL,
+ upto4 NumberOfCarriers OPTIONAL,
+ upto7 NumberOfCarriers OPTIONAL
+ } OPTIONAL
+}
+
+NumberOfCarriers ::= INTEGER (1..16)
+
+-- TAG-PROCESSINGPARAMETERS-STOP
+-- TAG-RAT-TYPE-START
+
+RAT-Type ::= ENUMERATED {nr, eutra-nr, eutra, utra-fdd-v1610, ...}
+
+-- TAG-RAT-TYPE-STOP
+-- TAG-RF-PARAMETERS-START
+
+RF-Parameters ::= SEQUENCE {
+ supportedBandListNR SEQUENCE (SIZE (1..maxBands)) OF BandNR,
+ supportedBandCombinationList BandCombinationList OPTIONAL,
+ appliedFreqBandListFilter FreqBandList OPTIONAL,
+ ...,
+ [[
+ supportedBandCombinationList-v1540 BandCombinationList-v1540 OPTIONAL,
+ srs-SwitchingTimeRequested ENUMERATED {true} OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1550 BandCombinationList-v1550 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1560 BandCombinationList-v1560 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1610 BandCombinationList-v1610 OPTIONAL,
+ supportedBandCombinationListSidelink-r16 BandCombinationListSidelink-r16 OPTIONAL,
+ supportedBandCombinationList-UplinkTxSwitch-r16 BandCombinationList-UplinkTxSwitch-r16 OPTIONAL
+ ]]
+}
+
+BandNR ::= SEQUENCE {
+ bandNR FreqBandIndicatorNR,
+ modifiedMPR-Behaviour BIT STRING (SIZE (8)) OPTIONAL,
+ mimo-ParametersPerBand MIMO-ParametersPerBand OPTIONAL,
+ extendedCP ENUMERATED {supported} OPTIONAL,
+ multipleTCI ENUMERATED {supported} OPTIONAL,
+ bwp-WithoutRestriction ENUMERATED {supported} OPTIONAL,
+ bwp-SameNumerology ENUMERATED {upto2, upto4} OPTIONAL,
+ bwp-DiffNumerology ENUMERATED {upto4} OPTIONAL,
+ crossCarrierScheduling-SameSCS ENUMERATED {supported} OPTIONAL,
+ pdsch-256QAM-FR2 ENUMERATED {supported} OPTIONAL,
+ pusch-256QAM ENUMERATED {supported} OPTIONAL,
+ ue-PowerClass ENUMERATED {pc1, pc2, pc3, pc4} OPTIONAL,
+ rateMatchingLTE-CRS ENUMERATED {supported} OPTIONAL,
+ channelBWs-DL CHOICE {
+ fr1 SEQUENCE {
+ scs-15kHz BIT STRING (SIZE (10)) OPTIONAL,
+ scs-30kHz BIT STRING (SIZE (10)) OPTIONAL,
+ scs-60kHz BIT STRING (SIZE (10)) OPTIONAL
+ },
+ fr2 SEQUENCE {
+ scs-60kHz BIT STRING (SIZE (3)) OPTIONAL,
+ scs-120kHz BIT STRING (SIZE (3)) OPTIONAL
+ }
+ } OPTIONAL,
+ channelBWs-UL CHOICE {
+ fr1 SEQUENCE {
+ scs-15kHz BIT STRING (SIZE (10)) OPTIONAL,
+ scs-30kHz BIT STRING (SIZE (10)) OPTIONAL,
+ scs-60kHz BIT STRING (SIZE (10)) OPTIONAL
+ },
+ fr2 SEQUENCE {
+ scs-60kHz BIT STRING (SIZE (3)) OPTIONAL,
+ scs-120kHz BIT STRING (SIZE (3)) OPTIONAL
+ }
+ } OPTIONAL,
+ ...,
+ [[
+ maxUplinkDutyCycle-PC2-FR1 ENUMERATED {n60, n70, n80, n90, n100} OPTIONAL
+ ]],
+ [[
+ pucch-SpatialRelInfoMAC-CE ENUMERATED {supported} OPTIONAL,
+ powerBoosting-pi2BPSK ENUMERATED {supported} OPTIONAL
+ ]],
+ [[
+ maxUplinkDutyCycle-FR2 ENUMERATED {n15, n20, n25, n30, n40, n50, n60, n70, n80, n90, n100} OPTIONAL
+ ]],
+ [[
+ channelBWs-DL-v1590 CHOICE {
+ fr1 SEQUENCE {
+ scs-15kHz BIT STRING (SIZE (16)) OPTIONAL,
+ scs-30kHz BIT STRING (SIZE (16)) OPTIONAL,
+ scs-60kHz BIT STRING (SIZE (16)) OPTIONAL
+ },
+ fr2 SEQUENCE {
+ scs-60kHz BIT STRING (SIZE (8)) OPTIONAL,
+ scs-120kHz BIT STRING (SIZE (8)) OPTIONAL
+ }
+ } OPTIONAL,
+ channelBWs-UL-v1590 CHOICE {
+ fr1 SEQUENCE {
+ scs-15kHz BIT STRING (SIZE (16)) OPTIONAL,
+ scs-30kHz BIT STRING (SIZE (16)) OPTIONAL,
+ scs-60kHz BIT STRING (SIZE (16)) OPTIONAL
+ },
+ fr2 SEQUENCE {
+ scs-60kHz BIT STRING (SIZE (8)) OPTIONAL,
+ scs-120kHz BIT STRING (SIZE (8)) OPTIONAL
+ }
+ } OPTIONAL
+ ]],
+ [[
+ asymmetricBandwidthCombinationSet BIT STRING (SIZE (1..32)) OPTIONAL
+ ]],
+ [[
+ -- R1 10: NR-unlicensed
+ unlicensedParametersPerBand-r16 UnlicensedParametersPerBand-r16 OPTIONAL,
+ -- R1 11-7b: Independent cancellation of the overlapping PUSCHs in an intra-band UL CA
+ cancelOverlappingPUSCH-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 14-1: Multiple LTE-CRS rate matching patterns
+ multipleRateMatchingEUTRA-CRS-r16 SEQUENCE {
+ maxNumberPatterns-r16 INTEGER (2..6),
+ maxNumberNon-OverlapPatterns-r16 INTEGER (1..3)
+ } OPTIONAL,
+ -- R1 14-1a: Two LTE-CRS overlapping rate matching patterns within a part of NR carrier using 15 kHz overlapping with a LTE carrier
+ overlapRateMatchingEUTRA-CRS-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 14-2: PDSCH Type B mapping of length 9 and 10 OFDM symbols
+ pdsch-MappingTypeB-Alt-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 14-3: One slot periodic TRS configuration for FR1
+ oneShotPeriodicTRS-r16 ENUMERATED {supported} OPTIONAL,
+ olpc-SRS-Pos-r16 OLPC-SRS-Pos-r16 OPTIONAL,
+ spatialRelationsSRS-Pos-r16 SpatialRelationsSRS-Pos-r16 OPTIONAL,
+ simul-SRS-Trans-IntraBandCA-r16 INTEGER (1..2) OPTIONAL,
+ channelBW-DL-IAB-r16 CHOICE {
+ fr1-100mhz SEQUENCE {
+ scs-15kHz ENUMERATED {supported} OPTIONAL,
+ scs-30kHz ENUMERATED {supported} OPTIONAL,
+ scs-60kHz ENUMERATED {supported} OPTIONAL
+ },
+ fr2-200mhz SEQUENCE {
+ scs-60kHz ENUMERATED {supported} OPTIONAL,
+ scs-120kHz ENUMERATED {supported} OPTIONAL
+ }
+ } OPTIONAL,
+ channelBW-UL-IAB-r16 CHOICE {
+ fr1-100mhz SEQUENCE {
+ scs-15kHz ENUMERATED {supported} OPTIONAL,
+ scs-30kHz ENUMERATED {supported} OPTIONAL,
+ scs-60kHz ENUMERATED {supported} OPTIONAL
+ },
+ fr2-200mhz SEQUENCE {
+ scs-60kHz ENUMERATED {supported} OPTIONAL,
+ scs-120kHz ENUMERATED {supported} OPTIONAL
+ }
+ } OPTIONAL,
+ rasterShift7dot5-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ ue-PowerClass-v1610 ENUMERATED {pc1dot5} OPTIONAL
+ ]]
+}
+
+-- TAG-RF-PARAMETERS-STOP
+-- TAG-RF-PARAMETERSMRDC-START
+
+RF-ParametersMRDC ::= SEQUENCE {
+ supportedBandCombinationList BandCombinationList OPTIONAL,
+ appliedFreqBandListFilter FreqBandList OPTIONAL,
+ ...,
+ [[
+ srs-SwitchingTimeRequested ENUMERATED {true} OPTIONAL,
+ supportedBandCombinationList-v1540 BandCombinationList-v1540 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1550 BandCombinationList-v1550 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1560 BandCombinationList-v1560 OPTIONAL,
+ supportedBandCombinationListNEDC-Only BandCombinationList OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1570 BandCombinationList-v1570 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1580 BandCombinationList-v1580 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1590 BandCombinationList-v1590 OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationListNEDC-Only-v15a0 SEQUENCE {
+ supportedBandCombinationList-v1540 BandCombinationList-v1540 OPTIONAL,
+ supportedBandCombinationList-v1560 BandCombinationList-v1560 OPTIONAL,
+ supportedBandCombinationList-v1570 BandCombinationList-v1570 OPTIONAL,
+ supportedBandCombinationList-v1580 BandCombinationList-v1580 OPTIONAL,
+ supportedBandCombinationList-v1590 BandCombinationList-v1590 OPTIONAL
+ } OPTIONAL
+ ]],
+ [[
+ supportedBandCombinationList-v1610 BandCombinationList-v1610 OPTIONAL,
+ supportedBandCombinationListNEDC-Only-v1610 BandCombinationList-v1610 OPTIONAL,
+ supportedBandCombinationList-UplinkTxSwitch-r16 BandCombinationList-UplinkTxSwitch-r16 OPTIONAL
+ ]]
+}
+
+-- TAG-RF-PARAMETERSMRDC-STOP
+-- TAG-RLC-PARAMETERS-START
+
+RLC-Parameters ::= SEQUENCE {
+ am-WithShortSN ENUMERATED {supported} OPTIONAL,
+ um-WithShortSN ENUMERATED {supported} OPTIONAL,
+ um-WithLongSN ENUMERATED {supported} OPTIONAL,
+ ...,
+ [[
+ extendedT-PollRetransmit-r16 ENUMERATED {supported} OPTIONAL,
+ extendedT-StatusProhibit-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+}
+
+-- TAG-RLC-PARAMETERS-STOP
+-- TAG-SDAP-PARAMETERS-START
+
+SDAP-Parameters ::= SEQUENCE {
+ as-ReflectiveQoS ENUMERATED {true} OPTIONAL,
+ ...,
+ [[
+ sdap-QOS-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ sdapHeaderIAB-r16 ENUMERATED {supported} OPTIONAL
+ ]]
+
+}
+
+-- TAG-SDAP-PARAMETERS-STOP
+-- TAG-SIDELINKPARAMETERS-START
+
+SidelinkParameters-r16 ::= SEQUENCE {
+ sidelinkParametersNR-r16 SidelinkParametersNR-r16 OPTIONAL,
+ sidelinkParametersEUTRA-r16 SidelinkParametersEUTRA-r16 OPTIONAL
+}
+
+SidelinkParametersNR-r16 ::= SEQUENCE {
+ rlc-ParametersSidelink-r16 RLC-ParametersSidelink-r16 OPTIONAL,
+ mac-ParametersSidelink-r16 MAC-ParametersSidelink-r16 OPTIONAL,
+ fdd-Add-UE-Sidelink-Capabilities-r16 UE-SidelinkCapabilityAddXDD-Mode-r16 OPTIONAL,
+ tdd-Add-UE-Sidelink-Capabilities-r16 UE-SidelinkCapabilityAddXDD-Mode-r16 OPTIONAL,
+ ...
+}
+
+SidelinkParametersEUTRA-r16 ::= SEQUENCE {
+ sl-ParametersEUTRA1-r16 OCTET STRING OPTIONAL,
+ sl-ParametersEUTRA2-r16 OCTET STRING OPTIONAL,
+ sl-ParametersEUTRA3-r16 OCTET STRING OPTIONAL,
+ supportedBandListSidelinkEUTRA-r16 SEQUENCE (SIZE (1..maxBandsEUTRA)) OF BandSidelinkEUTRA-r16 OPTIONAL,
+ ...
+}
+
+RLC-ParametersSidelink-r16 ::= SEQUENCE {
+ am-WithLongSN-Sidelink-r16 ENUMERATED {supported} OPTIONAL,
+ um-WithLongSN-Sidelink-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+MAC-ParametersSidelink-r16 ::= SEQUENCE {
+ mac-ParametersSidelinkCommon-r16 MAC-ParametersSidelinkCommon-r16 OPTIONAL,
+ mac-ParametersSidelinkXDD-Diff-r16 MAC-ParametersSidelinkXDD-Diff-r16 OPTIONAL,
+ ...
+}
+
+UE-SidelinkCapabilityAddXDD-Mode-r16 ::= SEQUENCE {
+ mac-ParametersSidelinkXDD-Diff-r16 MAC-ParametersSidelinkXDD-Diff-r16 OPTIONAL
+}
+
+MAC-ParametersSidelinkCommon-r16 ::= SEQUENCE {
+ lcp-RestrictionSidelink-r16 ENUMERATED {supported} OPTIONAL,
+ multipleConfiguredGrantsSidelink-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+MAC-ParametersSidelinkXDD-Diff-r16 ::= SEQUENCE {
+ multipleSR-ConfigurationsSidelink-r16 ENUMERATED {supported} OPTIONAL,
+ logicalChannelSR-DelayTimerSidelink-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+BandSidelinkEUTRA-r16 ::= SEQUENCE {
+ freqBandSidelinkEUTRA-r16 FreqBandIndicatorEUTRA,
+ -- R1 15-7: Transmitting LTE sidelink mode 3 scheduled by NR Uu
+ gnb-ScheduledMode3SidelinkEUTRA-r16 SEQUENCE {
+ gnb-ScheduledMode3DelaySidelinkEUTRA-r16 ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1,
+ ms1dot25, ms1dot5, ms1dot75, ms2, ms2dot5, ms3, ms4,
+ ms5, ms6, ms8, ms10, ms20}
+ } OPTIONAL,
+ -- R1 15-9: Transmitting LTE sidelink mode 4 configured by NR Uu
+ gnb-ScheduledMode4SidelinkEUTRA-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-SIDELINKPARAMETERS-STOP
+-- TAG-SON-PARAMETERS-START
+
+SON-Parameters-r16 ::= SEQUENCE {
+ rach-Report-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+-- TAG-SON-PARAMETERS-STOP
+-- TAG-SPATIALRELATIONSSRS-POS-START
+
+SpatialRelationsSRS-Pos-r16 ::= SEQUENCE {
+ spatialRelation-SRS-PosBasedOnSSB-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnCSI-RS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnSRS-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL,
+ spatialRelation-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL
+}
+
+--TAG-SPATIALRELATIONSSRS-POS-STOP
+-- TAG-SRS-SWITCHINGTIMENR-START
+
+SRS-SwitchingTimeNR ::= SEQUENCE {
+ switchingTimeDL ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us} OPTIONAL,
+ switchingTimeUL ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us} OPTIONAL
+}
+
+-- TAG-SRS-SWITCHINGTIMENR-STOP
+-- TAG-SRS-SWITCHINGTIMEEUTRA-START
+
+SRS-SwitchingTimeEUTRA ::= SEQUENCE {
+ switchingTimeDL ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+ OPTIONAL,
+ switchingTimeUL ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+ OPTIONAL
+}
+-- TAG-SRS-SWITCHINGTIMEEUTRA-STOP
+-- TAG-SUPPORTEDBANDWIDTH-START
+
+SupportedBandwidth ::= CHOICE {
+ fr1 ENUMERATED {mhz5, mhz10, mhz15, mhz20, mhz25, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100},
+ fr2 ENUMERATED {mhz50, mhz100, mhz200, mhz400}
+}
+
+-- TAG-SUPPORTEDBANDWIDTH-STOP
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-START
+
+UE-BasedPerfMeas-Parameters-r16 ::= SEQUENCE {
+ barometerMeasReport-r16 ENUMERATED {supported} OPTIONAL,
+ immMeasBT-r16 ENUMERATED {supported} OPTIONAL,
+ immMeasWLAN-r16 ENUMERATED {supported} OPTIONAL,
+ loggedMeasBT-r16 ENUMERATED {supported} OPTIONAL,
+ loggedMeasurements-r16 ENUMERATED {supported} OPTIONAL,
+ loggedMeasWLAN-r16 ENUMERATED {supported} OPTIONAL,
+ orientationMeasReport-r16 ENUMERATED {supported} OPTIONAL,
+ speedMeasReport-r16 ENUMERATED {supported} OPTIONAL,
+ gnss-Location-r16 ENUMERATED {supported} OPTIONAL,
+ ulPDCP-Delay-r16 ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-STOP
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-START
+
+UE-CapabilityRAT-ContainerList ::= SEQUENCE (SIZE (0..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Container
+
+UE-CapabilityRAT-Container ::= SEQUENCE {
+ rat-Type RAT-Type,
+ ue-CapabilityRAT-Container OCTET STRING
+}
+
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-STOP
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-START
+
+UE-CapabilityRAT-RequestList ::= SEQUENCE (SIZE (1..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Request
+
+UE-CapabilityRAT-Request ::= SEQUENCE {
+ rat-Type RAT-Type,
+ capabilityRequestFilter OCTET STRING OPTIONAL, -- Need N
+ ...
+}
+
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-START
+
+UE-CapabilityRequestFilterCommon ::= SEQUENCE {
+ mrdc-Request SEQUENCE {
+ omitEN-DC ENUMERATED {true} OPTIONAL, -- Need N
+ includeNR-DC ENUMERATED {true} OPTIONAL, -- Need N
+ includeNE-DC ENUMERATED {true} OPTIONAL -- Need N
+ } OPTIONAL, -- Need N
+ ...,
+ [[
+ codebookTypeRequest-r16 SEQUENCE {
+ type1-SinglePanel-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ type1-MultiPanel-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ type2-r16 ENUMERATED {true} OPTIONAL, -- Need N
+ type2-PortSelection-r16 ENUMERATED {true} OPTIONAL -- Need N
+ } OPTIONAL, -- Need N
+ uplinkTxSwitchRequest-r16 ENUMERATED {true} OPTIONAL -- Need N
+ ]]
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-START
+
+UE-CapabilityRequestFilterNR ::= SEQUENCE {
+ frequencyBandListFilter FreqBandList OPTIONAL, -- Need N
+ nonCriticalExtension UE-CapabilityRequestFilterNR-v1540 OPTIONAL
+}
+
+UE-CapabilityRequestFilterNR-v1540 ::= SEQUENCE {
+ srs-SwitchingTimeRequest ENUMERATED {true} OPTIONAL, -- Need N
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-STOP
+-- TAG-UE-MRDC-CAPABILITY-START
+
+UE-MRDC-Capability ::= SEQUENCE {
+ measAndMobParametersMRDC MeasAndMobParametersMRDC OPTIONAL,
+ phy-ParametersMRDC-v1530 Phy-ParametersMRDC OPTIONAL,
+ rf-ParametersMRDC RF-ParametersMRDC,
+ generalParametersMRDC GeneralParametersMRDC-XDD-Diff OPTIONAL,
+ fdd-Add-UE-MRDC-Capabilities UE-MRDC-CapabilityAddXDD-Mode OPTIONAL,
+ tdd-Add-UE-MRDC-Capabilities UE-MRDC-CapabilityAddXDD-Mode OPTIONAL,
+ fr1-Add-UE-MRDC-Capabilities UE-MRDC-CapabilityAddFRX-Mode OPTIONAL,
+ fr2-Add-UE-MRDC-Capabilities UE-MRDC-CapabilityAddFRX-Mode OPTIONAL,
+ featureSetCombinations SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination OPTIONAL,
+ pdcp-ParametersMRDC-v1530 PDCP-ParametersMRDC OPTIONAL,
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension UE-MRDC-Capability-v1560 OPTIONAL
+}
+
+UE-MRDC-Capability-v1560 ::= SEQUENCE {
+ receivedFilters OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs) OPTIONAL,
+ measAndMobParametersMRDC-v1560 MeasAndMobParametersMRDC-v1560 OPTIONAL,
+ fdd-Add-UE-MRDC-Capabilities-v1560 UE-MRDC-CapabilityAddXDD-Mode-v1560 OPTIONAL,
+ tdd-Add-UE-MRDC-Capabilities-v1560 UE-MRDC-CapabilityAddXDD-Mode-v1560 OPTIONAL,
+ nonCriticalExtension UE-MRDC-Capability-v1610 OPTIONAL
+}
+
+UE-MRDC-Capability-v1610 ::= SEQUENCE {
+ measAndMobParametersMRDC-v1610 MeasAndMobParametersMRDC-v1610 OPTIONAL,
+ generalParametersMRDC-v1610 GeneralParametersMRDC-v1610 OPTIONAL,
+ pdcp-ParametersMRDC-v1610 PDCP-ParametersMRDC-v1610 OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode ::= SEQUENCE {
+ measAndMobParametersMRDC-XDD-Diff MeasAndMobParametersMRDC-XDD-Diff OPTIONAL,
+ generalParametersMRDC-XDD-Diff GeneralParametersMRDC-XDD-Diff OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode-v1560 ::= SEQUENCE {
+ measAndMobParametersMRDC-XDD-Diff-v1560 MeasAndMobParametersMRDC-XDD-Diff-v1560 OPTIONAL
+}
+
+UE-MRDC-CapabilityAddFRX-Mode ::= SEQUENCE {
+ measAndMobParametersMRDC-FRX-Diff MeasAndMobParametersMRDC-FRX-Diff
+}
+
+
+GeneralParametersMRDC-XDD-Diff ::= SEQUENCE {
+ splitSRB-WithOneUL-Path ENUMERATED {supported} OPTIONAL,
+ splitDRB-withUL-Both-MCG-SCG ENUMERATED {supported} OPTIONAL,
+ srb3 ENUMERATED {supported} OPTIONAL,
+ v2x-EUTRA ENUMERATED {supported} OPTIONAL,
+ ...
+}
+
+GeneralParametersMRDC-v1610 ::= SEQUENCE {
+ f1c-OverEUTRA-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-UE-MRDC-CAPABILITY-STOP
+-- TAG-UE-NR-CAPABILITY-START
+
+UE-NR-Capability ::= SEQUENCE {
+ accessStratumRelease AccessStratumRelease,
+ pdcp-Parameters PDCP-Parameters,
+ rlc-Parameters RLC-Parameters OPTIONAL,
+ mac-Parameters MAC-Parameters OPTIONAL,
+ phy-Parameters Phy-Parameters,
+ rf-Parameters RF-Parameters,
+ measAndMobParameters MeasAndMobParameters OPTIONAL,
+ fdd-Add-UE-NR-Capabilities UE-NR-CapabilityAddXDD-Mode OPTIONAL,
+ tdd-Add-UE-NR-Capabilities UE-NR-CapabilityAddXDD-Mode OPTIONAL,
+ fr1-Add-UE-NR-Capabilities UE-NR-CapabilityAddFRX-Mode OPTIONAL,
+ fr2-Add-UE-NR-Capabilities UE-NR-CapabilityAddFRX-Mode OPTIONAL,
+ featureSets FeatureSets OPTIONAL,
+ featureSetCombinations SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination OPTIONAL,
+
+ lateNonCriticalExtension OCTET STRING OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1530 OPTIONAL
+}
+
+UE-NR-Capability-v1530 ::= SEQUENCE {
+ fdd-Add-UE-NR-Capabilities-v1530 UE-NR-CapabilityAddXDD-Mode-v1530 OPTIONAL,
+ tdd-Add-UE-NR-Capabilities-v1530 UE-NR-CapabilityAddXDD-Mode-v1530 OPTIONAL,
+ dummy ENUMERATED {supported} OPTIONAL,
+ interRAT-Parameters InterRAT-Parameters OPTIONAL,
+ inactiveState ENUMERATED {supported} OPTIONAL,
+ delayBudgetReporting ENUMERATED {supported} OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1540 OPTIONAL
+}
+
+UE-NR-Capability-v1540 ::= SEQUENCE {
+ sdap-Parameters SDAP-Parameters OPTIONAL,
+ overheatingInd ENUMERATED {supported} OPTIONAL,
+ ims-Parameters IMS-Parameters OPTIONAL,
+ fr1-Add-UE-NR-Capabilities-v1540 UE-NR-CapabilityAddFRX-Mode-v1540 OPTIONAL,
+ fr2-Add-UE-NR-Capabilities-v1540 UE-NR-CapabilityAddFRX-Mode-v1540 OPTIONAL,
+ fr1-fr2-Add-UE-NR-Capabilities UE-NR-CapabilityAddFRX-Mode OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1550 OPTIONAL
+}
+
+UE-NR-Capability-v1550 ::= SEQUENCE {
+ reducedCP-Latency ENUMERATED {supported} OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1560 OPTIONAL
+}
+
+UE-NR-Capability-v1560 ::= SEQUENCE {
+ nrdc-Parameters NRDC-Parameters OPTIONAL,
+ receivedFilters OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs) OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1570 OPTIONAL
+}
+
+UE-NR-Capability-v1570 ::= SEQUENCE {
+ nrdc-Parameters-v1570 NRDC-Parameters-v1570 OPTIONAL,
+ nonCriticalExtension UE-NR-Capability-v1610 OPTIONAL
+}
+
+UE-NR-Capability-v1610 ::= SEQUENCE {
+ inDeviceCoexInd-r16 ENUMERATED {supported} OPTIONAL,
+ dl-DedicatedMessageSegmentation-r16 ENUMERATED {supported} OPTIONAL,
+ nrdc-Parameters-v1610 NRDC-Parameters-v1610 OPTIONAL,
+ powSav-Parameters-r16 PowSav-Parameters-r16 OPTIONAL,
+ fr1-Add-UE-NR-Capabilities-v1610 UE-NR-CapabilityAddFRX-Mode-v1610 OPTIONAL,
+ fr2-Add-UE-NR-Capabilities-v1610 UE-NR-CapabilityAddFRX-Mode-v1610 OPTIONAL,
+ bh-RLF-Indication-r16 ENUMERATED {supported} OPTIONAL,
+ directSN-AdditionFirstRRC-IAB-r16 ENUMERATED {supported} OPTIONAL,
+ bap-Parameters-r16 BAP-Parameters-r16 OPTIONAL,
+ referenceTimeProvision-r16 ENUMERATED {supported} OPTIONAL,
+ sidelinkParameters-r16 SidelinkParameters-r16 OPTIONAL,
+ highSpeedParameters-r16 HighSpeedParameters-r16 OPTIONAL,
+ mac-Parameters-v1610 MAC-Parameters-v1610 OPTIONAL,
+ mcgRLF-RecoveryViaSCG-r16 ENUMERATED {supported} OPTIONAL,
+ resumeWithStoredMCG-SCells-r16 ENUMERATED {supported} OPTIONAL,
+ resumeWithStoredSCG-r16 ENUMERATED {supported} OPTIONAL,
+ resumeWithSCG-Config-r16 ENUMERATED {supported} OPTIONAL,
+ ue-BasedPerfMeas-Parameters-r16 UE-BasedPerfMeas-Parameters-r16 OPTIONAL,
+ son-Parameters-r16 SON-Parameters-r16 OPTIONAL,
+ onDemandSIB-Connected-r16 ENUMERATED {supported} OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode ::= SEQUENCE {
+ phy-ParametersXDD-Diff Phy-ParametersXDD-Diff OPTIONAL,
+ mac-ParametersXDD-Diff MAC-ParametersXDD-Diff OPTIONAL,
+ measAndMobParametersXDD-Diff MeasAndMobParametersXDD-Diff OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode-v1530 ::= SEQUENCE {
+ eutra-ParametersXDD-Diff EUTRA-ParametersXDD-Diff
+}
+
+UE-NR-CapabilityAddFRX-Mode ::= SEQUENCE {
+ phy-ParametersFRX-Diff Phy-ParametersFRX-Diff OPTIONAL,
+ measAndMobParametersFRX-Diff MeasAndMobParametersFRX-Diff OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1540 ::= SEQUENCE {
+ ims-ParametersFRX-Diff IMS-ParametersFRX-Diff OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1610 ::= SEQUENCE {
+ powSav-ParametersFRX-Diff-r16 PowSav-ParametersFRX-Diff-r16 OPTIONAL,
+ mac-ParametersFRX-Diff-r16 MAC-ParametersFRX-Diff-r16 OPTIONAL
+}
+
+BAP-Parameters-r16 ::= SEQUENCE {
+ flowControlBH-RLC-ChannelBased-r16 ENUMERATED {supported} OPTIONAL,
+ flowControlRouting-ID-Based-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-UE-NR-CAPABILITY-STOP
+-- TAG-UNLICENSEDPARAMETERSPERBAND-START
+
+UnlicensedParametersPerBand-r16 ::= SEQUENCE {
+ -- R1 10-2g: SSB-based BFD/CBD for dynamic channel access mode
+ ssb-BFD-CBD-dynamicChannelAccess-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-2h: SSB-based BFD/CBD for semi-static channel access mode
+ ssb-BFD-CBD-semi-staticChannelAccess-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-2i: CSI-RS-based BFD/CBD for NR-U
+ csi-RS-BFD-CBD-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-10: RSSI and channel occupancy measurement and reporting
+ rssi-ChannelOccupancyReporting-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-11:SRS starting position at any OFDM symbol in a slot
+ srs-StartAnyOFDM-Symbol-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-20: Support search space set configuration with freqMonitorLocation-r16
+ searchSpaceFreqMonitorLocation-r16 INTEGER (1..5) OPTIONAL,
+ -- R1 10-20a: Support coreset configuration with rb-Offset
+ coreset-RB-Offset-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-23:CGI reading on unlicensed cell for ANR functionality
+ cgi-Acquisition-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-25: Enable configured UL transmissions when DCI 2_0 is configured but not detected
+ configuredUL-Tx-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-8: Type B PDSCH length {3, 5, 6, 8, 9, 10, 11, 12, 13} without DMRS shift due to CRS collision
+ typeB-PDSCH-length-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-9: Search space set group switching with explicit DCI 2_0 bit field trigger or with implicit PDCCH decoding with DCI 2_0 monitoring
+ searchSpaceSetGroupSwitchingwithDCI-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-9b: Search space set group switching with implicit PDCCH decoding without DCI 2_0 monitoring FFS:per band or per UE
+ searchSpaceSetGroupSwitchingwithoutDCI-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-9d: Support Search space set group switching capability 2
+ searchSpaceSetGroupSwitchingcapability2-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-14: Non-numerical PDSCH to HARQ-ACK timing
+ non-numericalPDSCH-HARQ-timing-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-15: Enhanced dynamic HARQ codebook
+ enhancedDynamicHARQ-codebook-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-16: One-shot HARQ ACK feedback
+ oneShotHARQ-feedback-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-17: Multi-PUSCH UL grant
+ multiPUSCH-UL-grant-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-26: CSI-RS based RLM for NR-U
+ csi-RS-RLM-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-26a: CSI-RS based RRM for NR-U
+ vcsi-RS-RRM-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-3: PRB interlace mapping for PUSCH
+ pusch-PRB-interlace-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-3a: PRB interlace mapping for PUCCH
+ pucch-F0-F1-PRB-Interlace-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-12: OCC for PRB interlace mapping for PF2 and PF3
+ occ-PRB-PF2-PF3-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-13a: Extended CP range of more than one symbol for CG-PUSCH
+ extCP-rangeCG-PUSCH-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-18: Configured grant with retransmission in CG resources
+ configuredGrantWithReTx-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-24: CG-UCI multiplexing with HARQ ACK
+ mux-CG-UCI-HARQ-ACK-r16 ENUMERATED {supported} OPTIONAL,
+ -- R1 10-28: Configured grant with Rel-16 enhanced resource configuration
+ cg-resourceConfig-r16 ENUMERATED {supported} OPTIONAL
+}
+
+-- TAG-UNLICENSEDPARAMETERSPERBAND-STOP
+-- TAG-ABSOLUTETIMEINFO-START
+
+AbsoluteTimeInfo-r16 ::= BIT STRING (SIZE (48))
+
+-- TAG-ABSOLUTETIMEINFO-STOP
+-- TAG-AREACONFIGURATION-START
+
+AreaConfiguration-r16 ::= SEQUENCE {
+ areaConfig-r16 AreaConfig-r16,
+ interFreqTargetList-r16 SEQUENCE(SIZE (1..maxFreq)) OF InterFreqTargetInfo-r16 OPTIONAL -- Need R
+}
+
+AreaConfig-r16 ::= CHOICE {
+ cellGlobalIdList-r16 CellGlobalIdList-r16,
+ trackingAreaCodeList-r16 TrackingAreaCodeList-r16,
+ trackingAreaIdentityList-r16 TrackingAreaIdentityList-r16
+}
+
+InterFreqTargetInfo-r16 ::= SEQUENCE {
+ dl-CarrierFreq ARFCN-ValueNR,
+ cellList SEQUENCE (SIZE (1..32)) OF PhysCellId OPTIONAL
+}
+
+CellGlobalIdList-r16 ::= SEQUENCE (SIZE (1..32)) OF CGI-Info-Logging-r16
+
+TrackingAreaCodeList-r16 ::= SEQUENCE (SIZE (1..8)) OF TrackingAreaCode
+
+TrackingAreaIdentityList-r16 ::= SEQUENCE (SIZE (1..8)) OF TrackingAreaIdentity-r16
+
+TrackingAreaIdentity-r16 ::= SEQUENCE {
+ plmn-Identity-r16 PLMN-Identity,
+ trackingAreaCode-r16 TrackingAreaCode
+}
+
+-- TAG-AREACONFIGURATION-STOP
+-- TAG-BTNAMELIST-START
+
+BT-NameList-r16 ::= SEQUENCE (SIZE (1..maxBT-Name-r16)) OF BT-Name-r16
+
+BT-Name-r16 ::= OCTET STRING (SIZE (1..248))
+
+-- TAG-BTNAMELIST-STOP
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-START
+
+EUTRA-AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100}
+
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-STOP
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-START
+
+EUTRA-MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF EUTRA-MBSFN-SubframeConfig
+
+EUTRA-MBSFN-SubframeConfig ::= SEQUENCE {
+ radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32},
+ radioframeAllocationOffset INTEGER (0..7),
+ subframeAllocation1 CHOICE {
+ oneFrame BIT STRING (SIZE(6)),
+ fourFrames BIT STRING (SIZE(24))
+ },
+ subframeAllocation2 CHOICE {
+ oneFrame BIT STRING (SIZE(2)),
+ fourFrames BIT STRING (SIZE(8))
+ } OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-STOP
+-- TAG-EUTRA-MULTIBANDINFOLIST-START
+
+EUTRA-MultiBandInfoList ::= SEQUENCE (SIZE (1..maxMultiBands)) OF EUTRA-MultiBandInfo
+
+EUTRA-MultiBandInfo ::= SEQUENCE {
+ eutra-FreqBandIndicator FreqBandIndicatorEUTRA,
+ eutra-NS-PmaxList EUTRA-NS-PmaxList OPTIONAL -- Need R
+}
+
+-- TAG-EUTRA-MULTIBANDINFOLIST-STOP
+-- TAG-EUTRA-NS-PMAXLIST-START
+
+EUTRA-NS-PmaxList ::= SEQUENCE (SIZE (1..maxEUTRA-NS-Pmax)) OF EUTRA-NS-PmaxValue
+
+EUTRA-NS-PmaxValue ::= SEQUENCE {
+ additionalPmax INTEGER (-30..33) OPTIONAL, -- Need R
+ additionalSpectrumEmission INTEGER (1..288) OPTIONAL -- Need R
+}
+
+-- TAG-EUTRA-NS-PMAXLIST-STOP
+-- TAG-EUTRA-PHYSCELLID-START
+
+EUTRA-PhysCellId ::= INTEGER (0..503)
+
+-- TAG-EUTRA-PHYSCELLID-STOP
+-- TAG-EUTRA-PHYSCELLIDRANGE-START
+
+EUTRA-PhysCellIdRange ::= SEQUENCE {
+ start EUTRA-PhysCellId,
+ range ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84, n96,
+ n128, n168, n252, n504, spare2, spare1} OPTIONAL -- Need N
+}
+
+-- TAG-EUTRA-PHYSCELLIDRANGE-STOP
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-START
+
+EUTRA-PresenceAntennaPort1 ::= BOOLEAN
+
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-STOP
+-- TAG-EUTRA-Q-OFFSETRANGE-START
+
+EUTRA-Q-OffsetRange ::= ENUMERATED {
+ dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+ dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+ dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+ dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+ dB20, dB22, dB24}
+
+-- TAG-EUTRA-Q-OFFSETRANGE-STOP
+-- TAG-IABIPADDRESS-START
+
+IAB-IP-Address-r16 ::= CHOICE {
+ iPv4-Address-r16 BIT STRING (SIZE(32)),
+ iPv6-Address-r16 BIT STRING (SIZE(128)),
+ iPv6-Prefix-r16 BIT STRING (SIZE(64)),
+ ...
+}
+
+-- TAG-IABIPADDRESS-STOP
+-- TAG-IABIPADDRESSINDEX-START
+
+IAB-IP-AddressIndex-r16 ::= INTEGER (1..maxIAB-IP-Address-r16)
+
+-- TAG-IABIPADDRESSINDEX-STOP
+-- TAG-IAB-IP-USAGE-START
+
+IAB-IP-Usage-r16 ::= ENUMERATED {f1-c, f1-U, non-F1, spare}
+
+-- TAG-IAB-IP-USAGE-STOP
+-- TAG-LOGGINGDURATION-START
+
+LoggingDuration-r16 ::= ENUMERATED {
+ min10, min20, min40, min60, min90, min120, spare2, spare1}
+
+-- TAG-LOGGINGDURATION-STOP
+-- TAG-LOGGINGINTERVAL-START
+
+LoggingInterval-r16 ::= ENUMERATED {
+ ms320, ms640, ms1280, ms2560, ms5120, ms10240, ms20480,
+ ms30720, ms40960, ms61440 , infinity}
+
+-- TAG-LOGGINGINTERVAL-STOP
+-- TAG-LOGMEASRESULTLISTBT-START
+
+LogMeasResultListBT-r16 ::= SEQUENCE (SIZE (1..maxBT-IdReport-r16)) OF LogMeasResultBT-r16
+
+LogMeasResultBT-r16 ::= SEQUENCE {
+ bt-Addr-r16 BIT STRING (SIZE (48)),
+ rssi-BT-r16 INTEGER (-128..127) OPTIONAL,
+ ...
+}
+
+-- TAG-LOGMEASRESULTLISTBT-STOP
+-- TAG-LOGMEASRESULTLISTWLAN-START
+
+LogMeasResultListWLAN-r16 ::= SEQUENCE (SIZE (1..maxWLAN-Id-Report-r16)) OF LogMeasResultWLAN-r16
+
+LogMeasResultWLAN-r16 ::= SEQUENCE {
+ wlan-Identifiers-r16 WLAN-Identifiers-r16,
+ rssiWLAN-r16 WLAN-RSSI-Range-r16 OPTIONAL,
+ rtt-WLAN-r16 WLAN-RTT-r16 OPTIONAL,
+ ...
+}
+
+WLAN-Identifiers-r16 ::= SEQUENCE {
+ ssid-r16 OCTET STRING (SIZE (1..32)) OPTIONAL,
+ bssid-r16 OCTET STRING (SIZE (6)) OPTIONAL,
+ hessid-r16 OCTET STRING (SIZE (6)) OPTIONAL,
+ ...
+}
+
+WLAN-RSSI-Range-r16 ::= INTEGER(0..141)
+
+WLAN-RTT-r16 ::= SEQUENCE {
+ rttValue-r16 INTEGER (0..16777215),
+ rttUnits-r16 ENUMERATED {
+ microseconds,
+ hundredsofnanoseconds,
+ tensofnanoseconds,
+ nanoseconds,
+ tenthsofnanoseconds,
+... },
+ rttAccuracy-r16 INTEGER (0..255) OPTIONAL,
+ ...
+}
+
+-- TAG-OTHERCONFIG-START
+
+OtherConfig ::= SEQUENCE {
+ delayBudgetReportingConfig CHOICE{
+ release NULL,
+ setup SEQUENCE{
+ delayBudgetReportingProhibitTimer ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30}
+ }
+ } OPTIONAL -- Need M
+}
+
+OtherConfig-v1540 ::= SEQUENCE {
+ overheatingAssistanceConfig SetupRelease {OverheatingAssistanceConfig} OPTIONAL, -- Need M
+ ...
+}
+CandidateServingFreqListNR-r16 ::= SEQUENCE (SIZE (1..maxFreqIDC-r16)) OF ARFCN-ValueNR
+
+OtherConfig-v1610 ::= SEQUENCE {
+ idc-AssistanceConfig-r16 SetupRelease {IDC-AssistanceConfig-r16} OPTIONAL, -- Need M
+ drx-PreferenceConfig-r16 SetupRelease {DRX-PreferenceConfig-r16} OPTIONAL, -- Need M
+ maxBW-PreferenceConfig-r16 SetupRelease {MaxBW-PreferenceConfig-r16} OPTIONAL, -- Need M
+ maxCC-PreferenceConfig-r16 SetupRelease {MaxCC-PreferenceConfig-r16} OPTIONAL, -- Need M
+ maxMIMO-LayerPreferenceConfig-r16 SetupRelease {MaxMIMO-LayerPreferenceConfig-r16} OPTIONAL, -- Need M
+ minSchedulingOffsetPreferenceConfig-r16 SetupRelease {MinSchedulingOffsetPreferenceConfig-r16} OPTIONAL, -- Need M
+ releasePreferenceConfig-r16 SetupRelease {ReleasePreferenceConfig-r16} OPTIONAL, -- Need M
+ referenceTimePreferenceReporting-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ btNameList-r16 SetupRelease {BT-NameList-r16} OPTIONAL, -- Need M
+ wlanNameList-r16 SetupRelease {WLAN-NameList-r16} OPTIONAL, -- Need M
+ sensorNameList-r16 SetupRelease {Sensor-NameList-r16} OPTIONAL, -- Need M
+ obtainCommonLocation-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ sl-AssistanceConfigNR-r16 ENUMERATED{true} OPTIONAL -- Need R
+}
+
+OverheatingAssistanceConfig ::= SEQUENCE {
+ overheatingIndicationProhibitTimer ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30,
+ s60, s90, s120, s300, s600, spare3, spare2, spare1}
+}
+
+IDC-AssistanceConfig-r16 ::= SEQUENCE {
+ candidateServingFreqListNR-r16 CandidateServingFreqListNR-r16 OPTIONAL, -- Need R
+ ...
+}
+
+DRX-PreferenceConfig-r16 ::= SEQUENCE {
+ drx-PreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxBW-PreferenceConfig-r16 ::= SEQUENCE {
+ maxBW-PreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxCC-PreferenceConfig-r16 ::= SEQUENCE {
+ maxCC-PreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxMIMO-LayerPreferenceConfig-r16 ::= SEQUENCE {
+ maxMIMO-LayerPreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MinSchedulingOffsetPreferenceConfig-r16 ::= SEQUENCE {
+ minSchedulingOffsetPreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+ReleasePreferenceConfig-r16 ::= SEQUENCE {
+ releasePreferenceProhibitTimer-r16 ENUMERATED {
+ s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+ s8, s9, s10, s20, s30, infinity, spare1},
+ connectedReporting ENUMERATED {true} OPTIONAL -- Need R
+}
+
+-- TAG-OTHERCONFIG-STOP
+-- TAG-PHYSCELLIDUTRA-FDD-START
+
+PhysCellIdUTRA-FDD-r16 ::= INTEGER (0..511)
+
+-- TAG-PHYSCELLIDUTRA-FDD-STOP
+-- TAG-RRC-TRANSACTIONIDENTIFIER-START
+
+RRC-TransactionIdentifier ::= INTEGER (0..3)
+
+-- TAG-RRC-TRANSACTIONIDENTIFIER-STOP
+-- TAG-SENSORNAMELIST-START
+
+Sensor-NameList-r16 ::= SEQUENCE {
+ measUncomBarPre-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ measUeSpeed ENUMERATED {true} OPTIONAL, -- Need R
+ measUeOrientation ENUMERATED {true} OPTIONAL -- Need R
+}
+
+-- TAG-SENSORNAMELIST-STOP
+-- TAG-TRACEREFERENCE-START
+
+TraceReference-r16 ::= SEQUENCE {
+ plmn-Identity-r16 PLMN-Identity,
+ traceId-r16 OCTET STRING (SIZE (3))
+}
+
+-- TAG-TRACEREFERENCE-STOP
+-- TAG-UEMeasurementsAvailable-START
+
+UEMeasurementsAvailable-r16 ::= SEQUENCE {
+ logMeasAvailable-r16 ENUMERATED {true} OPTIONAL,
+ logMeasAvailableBT-r16 ENUMERATED {true} OPTIONAL,
+ logMeasAvailableWLAN-r16 ENUMERATED {true} OPTIONAL,
+ connEstFailInfoAvailable-r16 ENUMERATED {true} OPTIONAL,
+ rlf-InfoAvailable-r16 ENUMERATED {true} OPTIONAL,
+ ...
+}
+
+-- TAG-UEMeasurementsAvailable-STOP
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-START
+
+UTRA-FDD-Q-OffsetRange-r16 ::= ENUMERATED {
+ dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+ dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+ dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+ dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+ dB20, dB22, dB24}
+
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-STOP
+-- TAG-VISITEDCELLINFOLIST-START
+
+VisitedCellInfoList-r16 ::= SEQUENCE (SIZE (1..maxCellHistory-r16)) OF VisitedCellInfo-r16
+
+VisitedCellInfo-r16 ::= SEQUENCE {
+ visitedCellId-r16 CHOICE {
+ nr-CellId-r16 CHOICE {
+ cgi-Info CGI-Info-Logging-r16,
+ pci-arfcn-r16 SEQUENCE {
+ physCellId-r16 PhysCellId,
+ carrierFreq-r16 ARFCN-ValueNR
+ }
+ },
+ eutra-CellId-r16 CHOICE {
+ cellGlobalId-r16 CGI-InfoEUTRA,
+ pci-arfcn-r16 SEQUENCE {
+ physCellId-r16 EUTRA-PhysCellId,
+ carrierFreq-r16 ARFCN-ValueEUTRA
+ }
+ }
+ } OPTIONAL,
+ timeSpent-r16 INTEGER (0..4095),
+ ...
+}
+
+-- TAG-VISITEDCELLINFOLIST-STOP
+-- TAG-WLANNAMELIST-START
+
+WLAN-NameList-r16 ::= SEQUENCE (SIZE (1..maxWLAN-Name-r16)) OF WLAN-Name-r16
+
+WLAN-Name-r16 ::= OCTET STRING (SIZE (1..32))
+
+-- TAG-SL-BWP-CONFIG-START
+
+SL-BWP-Config-r16 ::= SEQUENCE {
+ sl-BWP-Id BWP-Id,
+ sl-BWP-Generic-r16 SL-BWP-Generic-r16 OPTIONAL, -- Need M
+ sl-BWP-PoolConfig-r16 SL-BWP-PoolConfig-r16 OPTIONAL, -- Need M
+ ...
+}
+
+SL-BWP-Generic-r16 ::= SEQUENCE {
+ sl-BWP-r16 BWP OPTIONAL, -- Need M
+ sl-LengthSymbols-r16 ENUMERATED {sym7, sym8, sym9, sym10, sym11, sym12, sym13, sym14} OPTIONAL, -- Need M
+ sl-StartSymbol-r16 ENUMERATED {sym0, sym1, sym2, sym3, sym4, sym5, sym6, sym7} OPTIONAL, -- Need M
+ sl-PSBCH-Config-r16 SetupRelease {SL-PSBCH-Config-r16} OPTIONAL, -- Need M
+ sl-TxDirectCurrentLocation-r16 INTEGER (0..3301) OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-SL-BWP-CONFIG-STOP
+-- TAG-SL-BWP-CONFIGCOMMON-START
+
+SL-BWP-ConfigCommon-r16 ::= SEQUENCE {
+ sl-BWP-Generic-r16 SL-BWP-Generic-r16 OPTIONAL, -- Need R
+ sl-BWP-PoolConfigCommon-r16 SL-BWP-PoolConfigCommon-r16 OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-SL-BWP-CONFIGCOMMON-STOP
+-- TAG-SL-BWP-POOLCONFIG-START
+
+SL-BWP-PoolConfig-r16 ::= SEQUENCE {
+ sl-RxPool-r16 SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16 OPTIONAL, -- Cond HO
+ sl-TxPoolSelectedNormal-r16 SL-TxPoolDedicated-r16 OPTIONAL, -- Need M
+ sl-TxPoolScheduling-r16 SL-TxPoolDedicated-r16 OPTIONAL, -- Need N
+ sl-TxPoolExceptional-r16 SL-ResourcePoolConfig-r16 OPTIONAL -- Need M
+}
+
+SL-TxPoolDedicated-r16 ::= SEQUENCE {
+ sl-PoolToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolID-r16 OPTIONAL, -- Need N
+ sl-PoolToAddModList-r16 SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16 OPTIONAL -- Need N
+}
+
+SL-ResourcePoolConfig-r16 ::= SEQUENCE {
+ sl-ResourcePoolID-r16 SL-ResourcePoolID-r16,
+ sl-ResourcePool-r16 SL-ResourcePool-r16 OPTIONAL -- Need M
+}
+
+SL-ResourcePoolID-r16 ::= INTEGER (1..maxNrofPoolID-r16)
+
+-- TAG-SL-BWP-POOLCONFIG-STOP
+-- TAG-SL-BWP-POOLCONFIGCOMMON-START
+
+SL-BWP-PoolConfigCommon-r16 ::= SEQUENCE {
+ sl-RxPool-r16 SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16 OPTIONAL, -- Need R
+ sl-TxPoolSelectedNormal-r16 SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16 OPTIONAL, -- Need R
+ sl-TxPoolExceptional-r16 SL-ResourcePoolConfig-r16 OPTIONAL -- Need R
+}
+
+-- TAG-SL-BWP-POOLCONFIGCOMMON-STOP
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-START
+
+SL-CBR-PriorityTxConfigList-r16 ::= SEQUENCE (SIZE (1..8)) OF SL-PriorityTxConfigIndex-r16
+
+SL-PriorityTxConfigIndex-r16 ::= SEQUENCE {
+ sl-PriorityThreshold-r16 INTEGER (1..8) OPTIONAL, -- Need M
+ sl-DefaultTxConfigIndex-r16 INTEGER (0..maxCBR-Level-1-r16) OPTIONAL, -- Need M
+ sl-CBR-ConfigIndex-r16 INTEGER (0..maxCBR-Config-1-r16) OPTIONAL, -- Need M
+ sl-Tx-ConfigIndexList-r16 SEQUENCE (SIZE (1.. maxCBR-Level-r16)) OF SL-TxConfigIndex-r16 OPTIONAL -- Need M
+}
+
+SL-TxConfigIndex-r16 ::= INTEGER (0..maxTxConfig-1-r16)
+
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-STOP
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-START
+
+SL-CBR-CommonTxConfigList-r16 ::= SEQUENCE {
+ sl-CBR-RangeConfigList-r16 SEQUENCE (SIZE (1..maxCBR-Config-r16)) OF SL-CBR-LevelsConfig-r16 OPTIONAL, -- Need M
+ sl-CBR-PSSCH-TxConfigList-r16 SEQUENCE (SIZE (1.. maxTxConfig-r16)) OF SL-CBR-PSSCH-TxConfig-r16 OPTIONAL -- Need M
+}
+
+SL-CBR-LevelsConfig-r16 ::= SEQUENCE (SIZE (1..maxCBR-Level-r16)) OF SL-CBR-r16
+
+SL-CBR-PSSCH-TxConfig-r16 ::= SEQUENCE {
+ sl-CR-Limit-r16 INTEGER(0..10000) OPTIONAL, -- Need M
+ sl-TxParameters-r16 SL-PSSCH-TxParameters-r16 OPTIONAL -- Need M
+}
+
+SL-CBR-r16 ::= INTEGER (0..100)
+
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-STOP
+-- TAG-SL-CONFIGDEDICATEDNR-START
+
+SL-ConfigDedicatedNR-r16 ::= SEQUENCE {
+ sl-PHY-MAC-RLC-Config-r16 SL-PHY-MAC-RLC-Config-r16 OPTIONAL, -- Need M
+ sl-RadioBearerToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-Uu-ConfigIndex-r16 OPTIONAL, -- Need N
+ sl-RadioBearerToAddModList-r16 SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16 OPTIONAL, -- Need N
+ sl-MeasConfigInfoToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-DestinationIndex-r16 OPTIONAL, -- Need N
+ sl-MeasConfigInfoToAddModList-r16 SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-MeasConfigInfo-r16 OPTIONAL, -- Need M
+ t400-r16 ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL, -- Need M
+ ...
+}
+
+SL-DestinationIndex-r16 ::= INTEGER (0..maxNrofSL-Dest-1-r16)
+
+SL-PHY-MAC-RLC-Config-r16::= SEQUENCE {
+ sl-ScheduledConfig-r16 SetupRelease { SL-ScheduledConfig-r16 } OPTIONAL, -- Need M
+ sl-UE-SelectedConfig-r16 SetupRelease { SL-UE-SelectedConfig-r16 } OPTIONAL, -- Need M
+ sl-FreqInfoToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-Freq-Id-r16 OPTIONAL, -- Need N
+ sl-FreqInfoToAddModList-r16 SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfig-r16 OPTIONAL, -- Need N
+ sl-RLC-BearerToReleaseList-r16 SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfigIndex-r16 OPTIONAL, -- Need N
+ sl-RLC-BearerToAddModList-r16 SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16 OPTIONAL, -- Need N
+ sl-MaxNumConsecutiveDTX-r16 ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32} OPTIONAL, -- Need M
+ sl-CSI-Acquisition-r16 ENUMERATED {enabled} OPTIONAL, -- Need R
+ sl-CSI-SchedulingRequestId-r16 SetupRelease {SchedulingRequestId} OPTIONAL, -- Need M
+ sl-SSB-PriorityNR-r16 INTEGER (1..8) OPTIONAL, -- Need R
+ networkControlledSyncTx-r16 ENUMERATED {on, off} OPTIONAL -- Need M
+}
+
+-- TAG-SL-CONFIGDEDICATEDNR-STOP
+-- TAG-SL-CONFIGUREDGRANTCONFIG-START
+
+SL-ConfiguredGrantConfig-r16 ::= SEQUENCE {
+ sl-ConfigIndexCG-r16 SL-ConfigIndexCG-r16,
+ sl-PeriodCG-r16 SL-PeriodCG-r16 OPTIONAL, -- Need M
+ sl-NrOfHARQ-Processes-r16 INTEGER (1..16) OPTIONAL, -- Need M
+ sl-HARQ-ProcID-offset-r16 INTEGER (1..16) OPTIONAL, -- Need M
+ sl-CG-MaxTransNumList-r16 SL-CG-MaxTransNumList-r16 OPTIONAL, -- Need M
+ rrc-ConfiguredSidelinkGrant SEQUENCE {
+ sl-TimeResourceCG-Type1-r16 INTEGER (0..496) OPTIONAL, -- Need M
+ sl-StartSubchannelCG-Type1-r16 INTEGER (0..26) OPTIONAL, -- Need M
+ sl-FreqResourceCG-Type1-r16 INTEGER (0..6929) OPTIONAL, -- Need M
+ sl-TimeOffsetCG-Type1-r16 INTEGER (0..7999) OPTIONAL, -- Need R
+ sl-N1PUCCH-AN-r16 PUCCH-ResourceId OPTIONAL, -- Need M
+ sl-PSFCH-ToPUCCH-CG-Type1-r16 INTEGER (0..15) OPTIONAL -- Need M
+ } OPTIONAL, -- Need M
+ ...
+}
+
+SL-ConfigIndexCG-r16 ::= INTEGER (1..maxNrofCG-SL-r16)
+
+SL-CG-MaxTransNumList-r16 ::= SEQUENCE (SIZE (1..8)) OF SL-CG-MaxTransNum-r16
+
+SL-CG-MaxTransNum-r16 ::= SEQUENCE {
+ sl-Priority-r16 INTEGER (1..8),
+ sl-MaxTransNum-r16 INTEGER (1..32)
+}
+
+SL-PeriodCG-r16 ::= CHOICE{
+ sl-PeriodCG1-r16 ENUMERATED {ms0, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+ sl-PeriodCG2-r16 INTEGER (1..99)
+}
+
+-- TAG-SL-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-SL-DESTINATIONIDENTITY-START
+
+SL-DestinationIdentity-r16 ::= BIT STRING (SIZE (24))
+
+-- TAG-SL-DESTINATIONIDENTITY-STOP
+-- TAG-SL-FREQCONFIG-START
+
+SL-FreqConfig-r16 ::= SEQUENCE {
+ sl-Freq-Id-r16 SL-Freq-Id-r16,
+ sl-SCS-SpecificCarrierList-r16 SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+ sl-AbsoluteFrequencyPointA-r16 ARFCN-ValueNR OPTIONAL, -- Need M
+ sl-AbsoluteFrequencySSB-r16 ARFCN-ValueNR OPTIONAL, -- Need R
+ frequencyShift7p5khzSL-r16 ENUMERATED {true} OPTIONAL, -- Cond V2X-SL-Shared
+ valueN-r16 INTEGER (-1..1),
+ sl-BWP-ToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF BWP-Id OPTIONAL, -- Need N
+ sl-BWP-ToAddModList-r16 SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-Config-r16 OPTIONAL, -- Need N
+ sl-SyncConfigList-r16 SL-SyncConfigList-r16 OPTIONAL, -- Need M
+ sl-SyncPriority-r16 ENUMERATED {gnss, gnbEnb} OPTIONAL -- Need M
+}
+
+SL-Freq-Id-r16 ::= INTEGER (1.. maxNrofFreqSL-r16)
+
+-- TAG-SL-FREQCONFIG-STOP
+-- TAG-SL-FREQCONFIGCOMMON-START
+
+SL-FreqConfigCommon-r16 ::= SEQUENCE {
+ sl-SCS-SpecificCarrierList-r16 SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+ sl-AbsoluteFrequencyPointA-r16 ARFCN-ValueNR,
+ sl-AbsoluteFrequencySSB-r16 ARFCN-ValueNR OPTIONAL, -- Need R
+ frequencyShift7p5khzSL-r16 ENUMERATED {true} OPTIONAL, -- Cond V2X-SL-Shared
+ valueN-r16 INTEGER (-1..1),
+ sl-BWP-List-r16 SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-ConfigCommon-r16 OPTIONAL, -- Need R
+ sl-SyncPriority-r16 ENUMERATED {gnss, gnbEnb} OPTIONAL, -- Need R
+ sl-NbAsSync-r16 BOOLEAN OPTIONAL, -- Need R
+ sl-SyncConfigList-r16 SL-SyncConfigList-r16 OPTIONAL, -- Need R
+ ...
+}
+-- TAG-SL-FREQCONFIGCOMMON-STOP
+-- TAG-SL-LOGICALCHANNELCONFIG-START
+
+SL-LogicalChannelConfig-r16 ::= SEQUENCE {
+ sl-Priority-r16 INTEGER (1..8),
+ sl-PrioritisedBitRate-r16 ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+ kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+ sl-BucketSizeDuration-r16 ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+ spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+ sl-ConfiguredGrantType1Allowed-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ sl-HARQ-FeedbackEnabled-r16 ENUMERATED {enabled, disabled } OPTIONAL, -- Need R
+ sl-AllowedCG-List-r16 SEQUENCE (SIZE (0.. maxNrofCG-SL-r16-1)) OF SL-ConfigIndexCG-r16
+ OPTIONAL, -- Need R
+ sl-AllowedSCS-List-r16 SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing OPTIONAL, -- Need R
+ sl-MaxPUSCH-Duration-r16 ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+ OPTIONAL, -- Need R
+ sl-LogicalChannelGroup-r16 INTEGER (0..maxLCG-ID) OPTIONAL, -- Need R
+ sl-SchedulingRequestId-r16 SchedulingRequestId OPTIONAL, -- Need R
+ sl-LogicalChannelSR-DelayTimerApplied-r16 BOOLEAN OPTIONAL, -- Need R
+ ...
+}
+-- TAG-SL-LOGICALCHANNELCONFIG-STOP
+-- TAG-SL-MEASCONFIGCOMMON-START
+
+SL-MeasConfigCommon-r16 ::= SEQUENCE {
+ sl-MeasObjectListCommon-r16 SL-MeasObjectList-r16 OPTIONAL, -- Need R
+ sl-ReportConfigListCommon-r16 SL-ReportConfigList-r16 OPTIONAL, -- Need R
+ sl-MeasIdListCommon-r16 SL-MeasIdList-r16 OPTIONAL, -- Need R
+ sl-QuantityConfigCommon-r16 SL-QuantityConfig-r16 OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-SL-MEASCONFIGCOMMON-STOP
+-- TAG-SL-MEASCONFIGINFO-START
+
+SL-MeasConfigInfo-r16 ::= SEQUENCE {
+ sl-DestinationIndex-r16 SL-DestinationIndex-r16,
+ sl-MeasConfig-r16 SL-MeasConfig-r16,
+ ...
+}
+
+SL-MeasConfig-r16 ::= SEQUENCE {
+ sl-MeasObjectToRemoveList-r16 SL-MeasObjectToRemoveList-r16 OPTIONAL, -- Need N
+ sl-MeasObjectToAddModList-r16 SL-MeasObjectList-r16 OPTIONAL, -- Need N
+ sl-ReportConfigToRemoveList-r16 SL-ReportConfigToRemoveList-r16 OPTIONAL, -- Need N
+ sl-ReportConfigToAddModList-r16 SL-ReportConfigList-r16 OPTIONAL, -- Need N
+ sl-MeasIdToRemoveList-r16 SL-MeasIdToRemoveList-r16 OPTIONAL, -- Need N
+ sl-MeasIdToAddModList-r16 SL-MeasIdList-r16 OPTIONAL, -- Need N
+ sl-QuantityConfig-r16 SL-QuantityConfig-r16 OPTIONAL, -- Need M
+ ...
+}
+
+SL-MeasObjectToRemoveList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectId-r16
+
+SL-ReportConfigToRemoveList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigId-r16
+
+SL-MeasIdToRemoveList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasId-r16
+
+-- TAG-SL-MEASCONFIGINFO-STOP
+-- TAG-SL-MEASIDLIST-START
+
+SL-MeasIdList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasIdInfo-r16
+
+SL-MeasIdInfo-r16 ::= SEQUENCE {
+ sl-MeasId-r16 SL-MeasId-r16,
+ sl-MeasObjectId-r16 SL-MeasObjectId-r16,
+ sl-ReportConfigId-r16 SL-ReportConfigId-r16,
+ ...
+}
+
+SL-MeasId-r16 ::= INTEGER (1..maxNrofSL-MeasId-r16)
+
+-- TAG-SL-MEASIDLIST-STOP
+-- TAG-SL-MEASOBJECTLIST-START
+
+SL-MeasObjectList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectInfo-r16
+
+SL-MeasObjectInfo-r16 ::= SEQUENCE {
+ sl-MeasObjectId-r16 SL-MeasObjectId-r16,
+ sl-MeasObject-r16 SL-MeasObject-r16,
+ ...
+}
+
+SL-MeasObjectId-r16 ::= INTEGER (1..maxNrofSL-ObjectId-r16)
+
+SL-MeasObject-r16 ::= SEQUENCE {
+ frequencyInfoSL-r16 ARFCN-ValueNR,
+ ...
+}
+
+-- TAG-SL-MEASOBJECTLIST-STOP
+-- TAG-SL-PDCP-CONFIG-START
+
+SL-PDCP-Config-r16 ::= SEQUENCE {
+ sl-DiscardTimer-r16 ENUMERATED {ms3, ms10, ms20, ms25, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+ ms250, ms300, ms500, ms750, ms1500, infinity} OPTIONAL, -- Cond Setup
+ sl-PDCP-SN-Size-r16 ENUMERATED {len12bits, len18bits} OPTIONAL, -- Cond Setup2
+ sl-OutOfOrderDelivery ENUMERATED { true } OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-SL-PDCP-CONFIG-STOP
+-- TAG-SL-PSBCH-CONFIG-START
+
+SL-PSBCH-Config-r16 ::= SEQUENCE {
+ dl-P0-PSBCH-r16 INTEGER (-16..15) OPTIONAL, -- Need M
+ dl-Alpha-PSBCH-r16 ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1} OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-SL-PSBCH-CONFIG-STOP
+-- TAG-SL-PSSCH-TXCONFIGLIST-START
+
+SL-PSSCH-TxConfigList-r16 ::= SEQUENCE (SIZE (1..maxPSSCH-TxConfig-r16)) OF SL-PSSCH-TxConfig-r16
+
+SL-PSSCH-TxConfig-r16 ::= SEQUENCE {
+ sl-TypeTxSync-r16 SL-TypeTxSync-r16 OPTIONAL, -- Need R
+ sl-ThresUE-Speed-r16 ENUMERATED {kmph60, kmph80, kmph100, kmph120,
+ kmph140, kmph160, kmph180, kmph200},
+ sl-ParametersAboveThres-r16 SL-PSSCH-TxParameters-r16,
+ sl-ParametersBelowThres-r16 SL-PSSCH-TxParameters-r16,
+ ...
+}
+
+
+SL-PSSCH-TxParameters-r16 ::= SEQUENCE {
+ sl-MinMCS-PSSCH-r16 INTEGER (0..27),
+ sl-MaxMCS-PSSCH-r16 INTEGER (0..31),
+ sl-MinSubChannelNumPSSCH-r16 INTEGER (1..27),
+ sl-MaxSubchannelNumPSSCH-r16 INTEGER (1..27),
+ sl-MaxTxTransNumPSSCH-r16 INTEGER (1..32),
+ sl-MaxTxPower-r16 SL-TxPower-r16 OPTIONAL -- Cond CBR
+}
+
+-- TAG-SL-PSSCH-TXCONFIGLIST-STOP
+-- TAG-SL-QOS-FLOWIDENTITY-START
+
+SL-QoS-FlowIdentity-r16 ::= INTEGER (1..maxNrofSL-QFIs-r16)
+
+-- TAG-SL-QOS-FLOWIDENTITY-STOP
+-- TAG-SL-QOS-PROFILE-START
+
+SL-QoS-Profile-r16 ::= SEQUENCE {
+ sl-PQI-r16 SL-PQI-r16 OPTIONAL, -- Need R
+ sl-GFBR-r16 INTEGER (0..4000000000) OPTIONAL, -- Need R
+ sl-MFBR-r16 INTEGER (0..4000000000) OPTIONAL, -- Need R
+ sl-Range-r16 INTEGER (1..1000) OPTIONAL, -- Need R
+ ...
+}
+
+SL-PQI-r16 ::= CHOICE {
+ sl-StandardizedPQI-r16 INTEGER (0..255),
+ sl-Non-StandardizedPQI-r16 SEQUENCE {
+ sl-ResourceType-r16 ENUMERATED {gbr, non-GBR, delayCriticalGBR, spare1} OPTIONAL, -- Need R
+ sl-PriorityLevel-r16 INTEGER (1..8) OPTIONAL, -- Need R
+ sl-PacketDelayBudget-r16 INTEGER (0..1023) OPTIONAL, -- Need R
+ sl-PacketErrorRate-r16 INTEGER (0..9) OPTIONAL, -- Need R
+ sl-AveragingWindow-r16 INTEGER (0..4095) OPTIONAL, -- Need R
+ sl-MaxDataBurstVolume-r16 INTEGER (0..4095) OPTIONAL, -- Need R
+ ...
+ }
+}
+
+-- TAG-SL-QOS-PROFILE-STOP
+-- TAG-SL-QUANTITYCONFIG-START
+
+SL-QuantityConfig-r16 ::= SEQUENCE {
+ sl-FilterCoefficientDMRS-r16 FilterCoefficient DEFAULT fc4,
+ ...
+}
+
+-- TAG-SL-QuantityConfig-STOP
+-- TAG-SL-RADIOBEARERCONFIG-START
+
+SL-RadioBearerConfig-r16 ::= SEQUENCE {
+ slrb-Uu-ConfigIndex-r16 SLRB-Uu-ConfigIndex-r16,
+ sl-SDAP-Config-r16 SL-SDAP-Config-r16 OPTIONAL, -- Cond SLRBSetup
+ sl-PDCP-Config-r16 SL-PDCP-Config-r16 OPTIONAL, -- Cond SLRBSetup
+ sl-TransRange-r16 ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350, m370,
+ m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare9, spare8, spare7, spare6,
+ spare5, spare4, spare3, spare2, spare1} OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-SL-RADIOBEARERCONFIG-STOP
+-- TAG-SL-REPORTCONFIGLIST-START
+
+SL-ReportConfigList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigInfo-r16
+
+SL-ReportConfigInfo-r16 ::= SEQUENCE {
+ sl-ReportConfigId-r16 SL-ReportConfigId-r16,
+ sl-ReportConfig-r16 SL-ReportConfig-r16,
+ ...
+}
+
+SL-ReportConfigId-r16 ::= INTEGER (1..maxNrofSL-ReportConfigId-r16)
+
+SL-ReportConfig-r16 ::= SEQUENCE {
+ sl-ReportType-r16 CHOICE {
+ sl-Periodical-r16 SL-PeriodicalReportConfig-r16,
+ sl-EventTriggered-r16 SL-EventTriggerConfig-r16,
+ ...
+ },
+ ...
+}
+
+SL-PeriodicalReportConfig-r16 ::= SEQUENCE {
+ sl-ReportInterval-r16 ReportInterval,
+ sl-ReportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ sl-ReportQuantity-r16 SL-MeasReportQuantity-r16,
+ sl-RS-Type-r16 SL-RS-Type-r16,
+ ...
+}
+
+SL-EventTriggerConfig-r16 ::= SEQUENCE {
+ sl-EventId-r16 CHOICE {
+ eventS1-r16 SEQUENCE {
+ s1-Threshold-r16 SL-MeasTriggerQuantity-r16,
+ sl-ReportOnLeave-r16 BOOLEAN,
+ sl-Hysteresis-r16 Hysteresis,
+ sl-TimeToTrigger-r16 TimeToTrigger,
+ ...
+ },
+ eventS2-r16 SEQUENCE {
+ s2-Threshold-r16 SL-MeasTriggerQuantity-r16,
+ sl-ReportOnLeave-r16 BOOLEAN,
+ sl-Hysteresis-r16 Hysteresis,
+ sl-TimeToTrigger-r16 TimeToTrigger,
+ ...
+ },
+ ...
+ },
+ sl-ReportInterval-r16 ReportInterval,
+ sl-ReportAmount-r16 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+ sl-ReportQuantity-r16 SL-MeasReportQuantity-r16,
+ sl-RS-Type-r16 SL-RS-Type-r16,
+ ...
+}
+
+SL-MeasReportQuantity-r16 ::= CHOICE {
+ sl-RSRP-r16 RSRP-Range,
+ ...
+}
+
+SL-MeasTriggerQuantity-r16 ::= CHOICE {
+ sl-RSRP-r16 RSRP-Range,
+ ...
+}
+
+SL-RS-Type-r16 ::= ENUMERATED {dmrs, spare3, spare2, spare1}
+
+-- TAG-SL-REPORTCONFIGLIST-STOP
+-- TAG-SL-RESOURCEPOOL-START
+
+SL-ResourcePool-r16 ::= SEQUENCE {
+ sl-PSCCH-Config-r16 SetupRelease { SL-PSCCH-Config-r16 } OPTIONAL, -- Need M
+ sl-PSSCH-Config-r16 SetupRelease { SL-PSSCH-Config-r16 } OPTIONAL, -- Need M
+ sl-PSFCH-Config-r16 SetupRelease { SL-PSFCH-Config-r16 } OPTIONAL, -- Need M
+ sl-SyncAllowed-r16 SL-SyncAllowed-r16 OPTIONAL, -- Need M
+ sl-SubchannelSize-r16 ENUMERATED {n10, n12, n15, n20, n25, n50, n75, n100} OPTIONAL, -- Need M
+ sl-TimeResource-r16 INTEGER (10..160) OPTIONAL, -- Need M
+ sl-StartRB-Subchannel-r16 INTEGER (0..265) OPTIONAL, -- Need M
+ sl-NumSubchannel-r16 INTEGER (1..27) OPTIONAL, -- Need M
+ sl-Additional-MCS-Table-r16 ENUMERATED {qam256, qam64LowSE, qam256-qam64LowSE } OPTIONAL, -- Need M
+ sl-ThreshS-RSSI-CBR-r16 INTEGER (0..45) OPTIONAL, -- Need M
+ sl-TimeWindowSizeCBR-r16 ENUMERATED {ms100, slot100} OPTIONAL, -- Need M
+ sl-TimeWindowSizeCR-r16 ENUMERATED {ms1000, slot1000} OPTIONAL, -- Need M
+ sl-PTRS-Config-r16 SL-PTRS-Config-r16 OPTIONAL, -- Need M
+ sl-UE-SelectedConfigRP-r16 SL-UE-SelectedConfigRP-r16 OPTIONAL, -- Need M
+ sl-RxParametersNcell-r16 SEQUENCE {
+ sl-TDD-Configuration-r16 TDD-UL-DL-ConfigCommon OPTIONAL, -- Need M
+ sl-SyncConfigIndex-r16 INTEGER (0..15)
+ } OPTIONAL, -- Need M
+ sl-ZoneConfigMCR-List-r16 SEQUENCE (SIZE (16)) OF SL-ZoneConfigMCR-r16 OPTIONAL, -- Need M
+ sl-FilterCoefficient-r16 FilterCoefficient OPTIONAL, -- Need M
+ sl-RB-Number-r16 INTEGER (10..275) OPTIONAL, -- Need M
+ sl-PreemptionEnable-r16 ENUMERATED {enabled, pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8} OPTIONAL, -- Need R
+ sl-PriorityThreshold-UL-URLLC-r16 INTEGER (1..9) OPTIONAL, -- Need M
+ sl-PriorityThreshold-r16 INTEGER (1..9) OPTIONAL, -- Need M
+ sl-X-Overhead-r16 ENUMERATED {n0,n3, n6, n9} OPTIONAL, -- Need M
+ sl-PowerControl-r16 SL-PowerControl-r16 OPTIONAL, -- Need M
+ sl-TxPercentageList-r16 SL-TxPercentageList-r16 OPTIONAL, -- Need M
+ sl-MinMaxMCS-List-r16 SL-MinMaxMCS-List-r16 OPTIONAL, -- Need M
+...
+}
+
+SL-ZoneConfigMCR-r16 ::= SEQUENCE {
+ sl-ZoneConfigMCR-Index-r16 INTEGER (0..15),
+ sl-TransRange-r16 ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350,
+ m370, m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare8, spare7,
+ spare6, spare5, spare4, spare3, spare2, spare1} OPTIONAL, -- Need M
+ sl-ZoneConfig-r16 SL-ZoneConfig-r16 OPTIONAL, -- Need M
+...
+}
+
+SL-SyncAllowed-r16 ::= SEQUENCE {
+ gnss-Sync-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ gnbEnb-Sync-r16 ENUMERATED {true} OPTIONAL, -- Need R
+ ue-Sync-r16 ENUMERATED {true} OPTIONAL -- Need R
+}
+
+SL-PSCCH-Config-r16 ::= SEQUENCE {
+ sl-TimeResourcePSCCH-r16 ENUMERATED {n2, n3} OPTIONAL, -- Need M
+ sl-FreqResourcePSCCH-r16 ENUMERATED {n10,n12, n15, n20, n25} OPTIONAL, -- Need M
+ sl-DMRS-ScrambleID-r16 INTEGER (0..65535) OPTIONAL, -- Need M
+ sl-NumReservedBits-r16 INTEGER (2..4) OPTIONAL, -- Need M
+ ...
+}
+
+SL-PSSCH-Config-r16 ::= SEQUENCE {
+ sl-PSSCH-DMRS-TimePatternList-r16 SEQUENCE (SIZE (1..3)) OF INTEGER (2..4) OPTIONAL, -- Need M
+ sl-BetaOffsets2ndSCI-r16 SEQUENCE (SIZE (4)) OF SL-BetaOffsets-r16 OPTIONAL, -- Need M
+ sl-Scaling-r16 ENUMERATED {f0p5, f0p65, f0p8, f1} OPTIONAL, -- Need M
+ ...
+}
+
+SL-PSFCH-Config-r16 ::= SEQUENCE {
+ sl-PSFCH-Period-r16 ENUMERATED {sl0, sl1, sl2, sl4} OPTIONAL, -- Need M
+ sl-PSFCH-RB-Set-r16 BIT STRING (SIZE (10..275)) OPTIONAL, -- Need M
+ sl-NumMuxCS-Pair-r16 ENUMERATED {n1, n2, n3, n6} OPTIONAL, -- Need M
+ sl-MinTimeGapPSFCH-r16 ENUMERATED {sl2, sl3} OPTIONAL, -- Need M
+ sl-PSFCH-HopID-r16 INTEGER (0..1023) OPTIONAL, -- Need M
+ sl-PSFCH-CandidateResourceType-r16 ENUMERATED {startSubCH, allocSubCH} OPTIONAL, -- Need M
+ ...
+}
+SL-PTRS-Config-r16 ::= SEQUENCE {
+ sl-PTRS-FreqDensity-r16 SEQUENCE (SIZE (2)) OF INTEGER (1..276) OPTIONAL, -- Need M
+ sl-PTRS-TimeDensity-r16 SEQUENCE (SIZE (3)) OF INTEGER (0..29) OPTIONAL, -- Need M
+ sl-PTRS-RE-Offset-r16 ENUMERATED {offset01, offset10, offset11} OPTIONAL, -- Need M
+ ...
+}
+
+SL-UE-SelectedConfigRP-r16 ::= SEQUENCE {
+ sl-CBR-PriorityTxConfigList-r16 SL-CBR-PriorityTxConfigList-r16 OPTIONAL, -- Need M
+ sl-ThresPSSCH-RSRP-List-r16 SL-ThresPSSCH-RSRP-List-r16 OPTIONAL, -- Need M
+ sl-MultiReserveResource-r16 ENUMERATED {enabled} OPTIONAL, -- Need M
+ sl-MaxNumPerReserve-r16 ENUMERATED {n2, n3} OPTIONAL, -- Need M
+ sl-SensingWindow-r16 ENUMERATED {ms100, ms1100} OPTIONAL, -- Need M
+ sl-SelectionWindowList-r16 SL-SelectionWindowList-r16 OPTIONAL, -- Need M
+ sl-ResourceReservePeriodList-r16 SEQUENCE (SIZE (1..16)) OF SL-ResourceReservePeriod-r16 OPTIONAL, -- Need M
+ sl-RS-ForSensing-r16 ENUMERATED {pscch, pssch},
+ ...
+}
+
+SL-ResourceReservePeriod-r16 ::= CHOICE {
+ sl-ResourceReservePeriod1-r16 ENUMERATED {ms0, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+ sl-ResourceReservePeriod2-r16 INTEGER (1..99)
+}
+
+SL-SelectionWindowList-r16 ::= SEQUENCE (SIZE (8)) OF SL-SelectionWindowConfig-r16
+
+SL-SelectionWindowConfig-r16 ::= SEQUENCE {
+ sl-Priority-r16 INTEGER (1..8),
+ sl-SelectionWindow-r16 ENUMERATED {n1, n5, n10, n20}
+}
+
+SL-TxPercentageList-r16 ::= SEQUENCE (SIZE (8)) OF SL-TxPercentageConfig-r16
+
+SL-TxPercentageConfig-r16 ::= SEQUENCE {
+ sl-Priority-r16 INTEGER (1..8),
+ sl-TxPercentage-r16 ENUMERATED {p20, p35, p50}
+}
+
+SL-MinMaxMCS-List-r16 ::= SEQUENCE (SIZE (1..3)) OF SL-MinMaxMCS-Config-r16
+
+SL-MinMaxMCS-Config-r16 ::= SEQUENCE {
+ sl-MCS-Table-r16 ENUMERATED {qam64, qam256, qam64LowSE},
+ sl-MinMCS-PSSCH-r16 INTEGER (0..27),
+ sl-MaxMCS-PSSCH-r16 INTEGER (0..31)
+}
+
+SL-BetaOffsets-r16 ::= INTEGER (0..31)
+
+SL-PowerControl-r16 ::= SEQUENCE {
+ sl-MaxTransPower-r16 INTEGER (-30..33),
+ sl-Alpha-PSSCH-PSCCH-r16 ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1} OPTIONAL, -- Need M
+ dl-Alpha-PSSCH-PSCCH-r16 ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1} OPTIONAL, -- Need M
+ sl-P0-PSSCH-PSCCH-r16 INTEGER (-16..15) OPTIONAL, -- Need M
+ dl-P0-PSSCH-PSCCH-r16 INTEGER (-16..15) OPTIONAL, -- Need M
+ dl-Alpha-PSFCH-r16 ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1} OPTIONAL, -- Need M
+ dl-P0-PSFCH-r16 INTEGER (-16..15) OPTIONAL, -- Need M
+ ...
+}
+
+-- TAG-SL-RESOURCEPOOL-STOP
+-- TAG-SL-RLC-BEARERCONFIG-START
+
+SL-RLC-BearerConfig-r16 ::= SEQUENCE {
+ sl-RLC-BearerConfigIndex-r16 SL-RLC-BearerConfigIndex-r16,
+ sl-ServedRadioBearer-r16 SLRB-Uu-ConfigIndex-r16 OPTIONAL, -- Cond LCH-SetupOnly
+ sl-RLC-Config-r16 SL-RLC-Config-r16 OPTIONAL, -- Cond LCH-Setup
+ sl-MAC-LogicalChannelConfig-r16 SL-LogicalChannelConfig-r16 OPTIONAL, -- Cond LCH-Setup
+ ...
+}
+
+-- TAG-SL-RLC-BEARERCONFIG-STOP
+-- TAG-SL-RLC-BEARERCONFIGINDEX-START
+
+SL-RLC-BearerConfigIndex-r16 ::= INTEGER (1..maxSL-LCID-r16)
+
+-- TAG-RLC-BEARERCONFIGINDEX-STOP
+-- TAG-SL-RLC-CONFIG-START
+
+SL-RLC-Config-r16 ::= CHOICE {
+ sl-AM-RLC-r16 SEQUENCE {
+ sl-SN-FieldLengthAM-r16 SN-FieldLengthAM OPTIONAL, -- Cond SLRBSetup
+ sl-T-PollRetransmit-r16 T-PollRetransmit,
+ sl-PollPDU-r16 PollPDU,
+ sl-PollByte-r16 PollByte,
+ sl-MaxRetxThreshold-r16 ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 },
+ ...
+ },
+ sl-UM-RLC-r16 SEQUENCE {
+ sl-SN-FieldLengthUM-r16 SN-FieldLengthUM OPTIONAL, -- Cond SLRBSetup
+ ...
+ },
+ ...
+}
+
+-- TAG-SL-RLC-CONFIG-STOP
+-- TAG-SL-SCHEDULEDCONFIG-START
+
+SL-ScheduledConfig-r16 ::= SEQUENCE {
+ sl-RNTI-r16 RNTI-Value,
+ mac-MainConfigSL-r16 MAC-MainConfigSL-r16 OPTIONAL, -- Need M
+ sl-Timing-Config-r16 SL-TimingConfig-r16 OPTIONAL, -- Need M
+ sl-CS-RNTI-r16 RNTI-Value OPTIONAL, -- Need M
+ sl-PSFCH-ToPUCCH-r16 SEQUENCE (SIZE (1..8)) OF INTEGER (0..15) OPTIONAL, -- Need M
+ sl-ConfiguredGrantConfigList-r16 SL-ConfiguredGrantConfigList-r16 OPTIONAL, -- Need M
+ ...
+}
+
+MAC-MainConfigSL-r16 ::= SEQUENCE {
+ sl-BSR-Config-r16 BSR-Config OPTIONAL, -- Need M
+ ul-PrioritizationThres-r16 INTEGER (1..16) OPTIONAL, -- Need M
+ sl-PrioritizationThres-r16 INTEGER (1..8) OPTIONAL, -- Need M
+ ...
+
+}
+
+SL-TimingConfig-r16 ::= SEQUENCE {
+ sl-DCI-ToSL-Trans-r16 ENUMERATED{ffs} OPTIONAL, -- Need M
+ ...
+}
+
+SL-ConfiguredGrantConfigList-r16 ::= SEQUENCE {
+ sl-ConfiguredGrantConfigToReleaseList-r16 SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfigIndexCG-r16 OPTIONAL, -- Need N
+ sl-ConfiguredGrantConfigToAddModList-r16 SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfiguredGrantConfig-r16 OPTIONAL -- Need N
+}
+
+-- TAG-SL-SCHEDULEDCONFIG-STOP
+-- TAG-SL-SDAP-CONFIG-START
+
+SL-SDAP-Config-r16 ::= SEQUENCE {
+ sl-SDAP-Header-r16 ENUMERATED {present, absent},
+ sl-DefaultRB-r16 BOOLEAN,
+ sl-MappedQoS-Flows-r16 CHOICE {
+ sl-MappedQoS-FlowsList-r16 SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-Profile-r16,
+ sl-MappedQoS-FlowsListDedicated-r16 SL-MappedQoS-FlowsListDedicated-r16
+ } OPTIONAL, -- Need M
+ sl-CastType-r16 ENUMERATED {broadcast, groupcast, unicast, spare1} OPTIONAL, -- Need M
+ ...
+}
+
+SL-MappedQoS-FlowsListDedicated-r16 ::= SEQUENCE {
+ sl-MappedQoS-FlowsToAddList-r16 SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16 OPTIONAL, -- Need N
+ sl-MappedQoS-FlowsToReleaseList-16 SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16 OPTIONAL -- Need N
+}
+
+-- TAG-SL-SDAP-CONFIG-STOP
+-- TAG-SL-SYNCCONFIG-START
+
+SL-SyncConfigList-r16 ::= SEQUENCE (SIZE (1..maxSL-SyncConfig-r16)) OF SL-SyncConfig-r16
+
+SL-SyncConfig-r16 ::= SEQUENCE {
+ sl-SyncRefMinHyst-r16 ENUMERATED {dB0, dB3, dB6, dB9, dB12} OPTIONAL, -- Need R
+ sl-SyncRefDiffHyst-r16 ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf} OPTIONAL, -- Need R
+ sl-filterCoefficient-r16 FilterCoefficient OPTIONAL, -- Need R
+ sl-SSB-TimeAllocation1-r16 SL-SSB-TimeAllocation-r16 OPTIONAL, -- Need R
+ sl-SSB-TimeAllocation2-r16 SL-SSB-TimeAllocation-r16 OPTIONAL, -- Need R
+ sl-SSB-TimeAllocation3-r16 SL-SSB-TimeAllocation-r16 OPTIONAL, -- Need R
+ sl-SSID-r16 INTEGER (0..671) OPTIONAL, -- Need R
+ txParameters-r16 SEQUENCE {
+ syncTxThreshIC-r16 SL-RSRP-Range-r16 OPTIONAL, -- Need R
+ syncTxThreshOoC-r16 SL-RSRP-Range-r16 OPTIONAL, -- Need R
+ syncInfoReserved-r16 BIT STRING (SIZE (2)) OPTIONAL -- Need R
+ },
+ gnss-Sync-r16 ENUMERATED {true} OPTIONAL, -- Need R
+...
+}
+
+SL-RSRP-Range-r16 ::= INTEGER (0..13)
+
+SL-SSB-TimeAllocation-r16 ::= SEQUENCE {
+ sl-NumSSB-WithinPeriod-r16 ENUMERATED {n1, n2, n4, n5, n16, n32, n64} OPTIONAL, -- Need R
+ sl-TimeOffsetSSB-r16 INTEGER (0..1279) OPTIONAL, -- Need R
+ sl-TimeInterval-r16 INTEGER (0..639) OPTIONAL -- Need R
+}
+
+-- TAG-SL-SYNCCONFIG-STOP
+-- TAG-SL-THRESPSSCH-RSRP-LIST-START
+
+SL-ThresPSSCH-RSRP-List-r16 ::= SEQUENCE (SIZE (64)) OF SL-ThresPSSCH-RSRP-r16
+
+SL-ThresPSSCH-RSRP-r16 ::= INTEGER (0..66)
+
+-- TAG-SL-THRESPSSCH-RSRP-LIST-STOP
+-- TAG-SL-TXPOWER-START
+
+SL-TxPower-r16 ::= CHOICE{
+ minusinfinity-r16 NULL,
+ txPower-r16 INTEGER (-30..33)
+}
+
+-- TAG-SL-TXPOWER-STOP
+-- TAG-SL-TYPETXSYNC-START
+
+SL-TypeTxSync-r16 ::= ENUMERATED {gnss, gnbEnb, ue}
+
+-- TAG-SL-TYPETXSYNC-STOP
+-- TAG-SL-UE-SELECTEDCONFIG-START
+
+SL-UE-SelectedConfig-r16 ::= SEQUENCE {
+ sl-PSSCH-TxConfigList-r16 SL-PSSCH-TxConfigList-r16 OPTIONAL, -- Need R
+ sl-ProbResourceKeep-r16 ENUMERATED {v0, v0dot2, v0dot4, v0dot6, v0dot8} OPTIONAL, -- Need R
+ sl-ReselectAfter-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n7, n8, n9} OPTIONAL, -- Need R
+ sl-CBR-CommonTxConfigList-r16 SL-CBR-CommonTxConfigList-r16 OPTIONAL, -- Need R
+ ul-PrioritizationThres-r16 INTEGER (1..16) OPTIONAL, -- Need R
+ sl-PrioritizationThres-r16 INTEGER (1..8) OPTIONAL, -- Need R
+ ...
+}
+
+-- TAG-SL-UE-SELECTEDCONFIG-STOP
+-- TAG-SL-ZONECONFIG-START
+
+SL-ZoneConfig-r16 ::= SEQUENCE {
+ sl-ZoneLength-r16 ENUMERATED { m5, m10, m20, m30, m40, m50, spare2, spare1},
+ ...
+}
+
+-- TAG-SL-ZONECONFIG-STOP
+-- TAG-SLRB-UU-CONFIGINDEX-START
+
+SLRB-Uu-ConfigIndex-r16 ::= INTEGER (1..maxNrofSLRB-r16)
+
+-- TAG-SLRB-UU-CONFIGINDEX-STOP
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-START
+
+maxAI-DCI-PayloadSize-r16 INTEGER ::= 128 --Maximum size of the DCI payload scrambled with ai-RNTI
+maxAI-DCI-PayloadSize-r16-1 INTEGER ::= 127 --Maximum size of the DCI payload scrambled with ai-RNTI minus 1
+maxBandComb INTEGER ::= 65536 -- Maximum number of DL band combinations
+maxBandsUTRA-FDD-r16 INTEGER ::= 64 -- Maximum number of bands listed in UTRA-FDD UE caps
+maxBH-RLC-ChannelID-r16 INTEGER ::= 65536 -- Maximum value of BH RLC Channel ID
+maxBT-IdReport-r16 INTEGER ::= 32 -- Maximum number of Bluetooth IDs to report
+maxBT-Name-r16 INTEGER ::= 4 -- Maximum number of Bluetooth name
+maxCAG-Cell-r16 INTEGER ::= 16 -- Maximum number of NR CAG cell ranges in SIB3, SIB4
+maxCBR-Config-r16 INTEGER ::= 8 -- Maximum number of CBR range configurations for sidelink communication
+ -- congestion control
+maxCBR-Config-1-r16 INTEGER ::= 7 -- Maximum number of CBR range configurations for sidelink communication
+ -- congestion control minus 1
+maxCBR-Level-r16 INTEGER ::= 16 -- Maximum nuber of CBR levels
+maxCBR-Level-1-r16 INTEGER ::= 15 -- Maximum number of CBR levels minus 1
+maxCellBlack INTEGER ::= 16 -- Maximum number of NR blacklisted cell ranges in SIB3, SIB4
+maxCellHistory-r16 INTEGER ::= 16 -- Maximum number of visited cells reported
+maxCellInter INTEGER ::= 16 -- Maximum number of inter-Freq cells listed in SIB4
+maxCellIntra INTEGER ::= 16 -- Maximum number of intra-Freq cells listed in SIB3
+maxCellMeasEUTRA INTEGER ::= 32 -- Maximum number of cells in E-UTRAN
+maxCellMeasIdle-r16 INTEGER ::= 8 -- Maximum number of cells per carrier for idle/inactive measurements
+maxCellMeasUTRA-FDD-r16 INTEGER ::= 32 -- Maximum number of cells in FDD UTRAN
+maxCellWhite INTEGER ::= 16 -- Maximum number of NR whitelisted cell ranges in SIB3, SIB4
+maxEARFCN INTEGER ::= 262143 -- Maximum value of E-UTRA carrier frequency
+maxEUTRA-CellBlack INTEGER ::= 16 -- Maximum number of E-UTRA blacklisted physical cell identity ranges
+ -- in SIB5
+maxEUTRA-NS-Pmax INTEGER ::= 8 -- Maximum number of NS and P-Max values per band
+maxLogMeasReport-r16 INTEGER ::= 520 -- Maximum number of entries for logged measurements
+maxMultiBands INTEGER ::= 8 -- Maximum number of additional frequency bands that a cell belongs to
+maxNARFCN INTEGER ::= 3279165 -- Maximum value of NR carrier frequency
+maxNR-NS-Pmax INTEGER ::= 8 -- Maximum number of NS and P-Max values per band
+maxFreqIdle-r16 INTEGER ::= 8 -- Maximum number of carrier frequencies for idle/inactive measurements
+maxNrofServingCells INTEGER ::= 32 -- Max number of serving cells (SpCells + SCells)
+maxNrofServingCells-1 INTEGER ::= 31 -- Max number of serving cells (SpCell + SCells) per cell group
+maxNrofAggregatedCellsPerCellGroup INTEGER ::= 16
+maxNrofDUCells-r16 INTEGER ::= 512 -- Max number of cells configured on the collocated IAB-DU
+maxNrofAssociatedDUCellsPerMT-r16 INTEGER ::= 65535
+maxNrofAvailabilityCombinationsPerSet-r16 INTEGER ::= 512 -- Max number of AvailabilityCombinationId used in the DCI format 2_5
+maxNrofAvailabilityCombinationsPerSet-r16-1 INTEGER ::= 511 -- Max number of AvailabilityCombinationId used in the DCI format 2_5 minus 1
+maxNrofSCells INTEGER ::= 31 -- Max number of secondary serving cells per cell group
+maxNrofCellMeas INTEGER ::= 32 -- Maximum number of entries in each of the cell lists in a measurement object
+maxNrofCG-SL-r16 INTEGER ::= 8 -- Max number of sidelink configured grant
+maxNrofCG-SL-r16-1 INTEGER ::= 7 -- Max number of sidelink configured grant minus 1
+maxNrofSS-BlocksToAverage INTEGER ::= 16 -- Max number for the (max) number of SS blocks to average to determine cell measurement
+maxNrofCondCells-r16 INTEGER ::= 8 -- Max number of conditional candidate SpCells
+maxNrofCSI-RS-ResourcesToAverage INTEGER ::= 16 -- Max number for the (max) number of CSI-RS to average to determine cell measurement
+maxNrofDL-Allocations INTEGER ::= 16 -- Maximum number of PDSCH time domain resource allocations
+maxNrofSR-ConfigPerCellGroup INTEGER ::= 8 -- Maximum number of SR configurations per cell group
+maxLCG-ID INTEGER ::= 7 -- Maximum value of LCG ID
+maxLC-ID INTEGER ::= 32 -- Maximum value of Logical Channel ID
+maxLC-ID-Iab-r16 INTEGER ::= 65536 -- Maximum value of BH Logical Channel ID extension
+maxLTE-CRS-Patterns-r16 INTEGER ::= 3 -- Maximum number of additional LTE CRS rate matching patterns
+maxNrofTAGs INTEGER ::= 4 -- Maximum number of Timing Advance Groups
+maxNrofTAGs-1 INTEGER ::= 3 -- Maximum number of Timing Advance Groups minus 1
+maxNrofBWPs INTEGER ::= 4 -- Maximum number of BWPs per serving cell
+maxNrofCombIDC INTEGER ::= 128 -- Maximum number of reported MR-DC combinations for IDC
+maxNrofSymbols-1 INTEGER ::= 13 -- Maximum index identifying a symbol within a slot (14 symbols, indexed from 0..13)
+maxNrofSlots INTEGER ::= 320 -- Maximum number of slots in a 10 ms period
+maxNrofSlots-1 INTEGER ::= 319 -- Maximum number of slots in a 10 ms period minus 1
+maxNrofPhysicalResourceBlocks INTEGER ::= 275 -- Maximum number of PRBs
+maxNrofPhysicalResourceBlocks-1 INTEGER ::= 274 -- Maximum number of PRBs minus 1
+maxNrofPhysicalResourceBlocksPlus1 INTEGER ::= 276 -- Maximum number of PRBs plus 1
+maxNrofControlResourceSets INTEGER ::= 12 -- Max number of CoReSets configurable on a serving cell
+maxNrofControlResourceSets-1 INTEGER ::= 11 -- Max number of CoReSets configurable on a serving cell minus 1
+maxNrofControlResourceSets-1-r16 INTEGER ::= 15 -- Max number of CoReSets configurable on a serving cell extended in minus 1
+maxNrofCoresetPools-r16 INTEGER ::= 2 -- Maximum number of CORESET pools
+maxCoReSetDuration INTEGER ::= 3 -- Max number of OFDM symbols in a control resource set
+maxNrofSearchSpaces-1 INTEGER ::= 39 -- Max number of Search Spaces minus 1
+maxSFI-DCI-PayloadSize INTEGER ::= 128 -- Max number payload of a DCI scrambled with SFI-RNTI
+maxSFI-DCI-PayloadSize-1 INTEGER ::= 127 -- Max number payload of a DCI scrambled with SFI-RNTI minus 1
+maxIAB-IP-Address-r16 INTEGER ::= 32 -- Max number of assigned IP addresses
+maxINT-DCI-PayloadSize INTEGER ::= 126 -- Max number payload of a DCI scrambled with INT-RNTI
+maxINT-DCI-PayloadSize-1 INTEGER ::= 125 -- Max number payload of a DCI scrambled with INT-RNTI minus 1
+maxNrofRateMatchPatterns INTEGER ::= 4 -- Max number of rate matching patterns that may be configured
+maxNrofRateMatchPatterns-1 INTEGER ::= 3 -- Max number of rate matching patterns that may be configured minus 1
+maxNrofRateMatchPatternsPerGroup INTEGER ::= 8 -- Max number of rate matching patterns that may be configured in one group
+maxNrofCSI-ReportConfigurations INTEGER ::= 48 -- Maximum number of report configurations
+maxNrofCSI-ReportConfigurations-1 INTEGER ::= 47 -- Maximum number of report configurations minus 1
+maxNrofCSI-ResourceConfigurations INTEGER ::= 112 -- Maximum number of resource configurations
+maxNrofCSI-ResourceConfigurations-1 INTEGER ::= 111 -- Maximum number of resource configurations minus 1
+maxNrofAP-CSI-RS-ResourcesPerSet INTEGER ::= 16
+maxNrOfCSI-AperiodicTriggers INTEGER ::= 128 -- Maximum number of triggers for aperiodic CSI reporting
+maxNrofReportConfigPerAperiodicTrigger INTEGER ::= 16 -- Maximum number of report configurations per trigger state for aperiodic reporting
+maxNrofNZP-CSI-RS-Resources INTEGER ::= 192 -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources
+maxNrofNZP-CSI-RS-Resources-1 INTEGER ::= 191 -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources minus 1
+maxNrofNZP-CSI-RS-ResourcesPerSet INTEGER ::= 64 -- Maximum number of NZP CSI-RS resources per resource set
+maxNrofNZP-CSI-RS-ResourceSets INTEGER ::= 64 -- Maximum number of NZP CSI-RS resources per cell
+maxNrofNZP-CSI-RS-ResourceSets-1 INTEGER ::= 63 -- Maximum number of NZP CSI-RS resources per cell minus 1
+maxNrofNZP-CSI-RS-ResourceSetsPerConfig INTEGER ::= 16 -- Maximum number of resource sets per resource configuration
+maxNrofNZP-CSI-RS-ResourcesPerConfig INTEGER ::= 128 -- Maximum number of resources per resource configuration
+maxNrofZP-CSI-RS-Resources INTEGER ::= 32 -- Maximum number of Zero-Power (ZP) CSI-RS resources
+maxNrofZP-CSI-RS-Resources-1 INTEGER ::= 31 -- Maximum number of Zero-Power (ZP) CSI-RS resources minus 1
+maxNrofZP-CSI-RS-ResourceSets-1 INTEGER ::= 15
+maxNrofZP-CSI-RS-ResourcesPerSet INTEGER ::= 16
+maxNrofZP-CSI-RS-ResourceSets INTEGER ::= 16
+maxNrofCSI-IM-Resources INTEGER ::= 32 -- Maximum number of CSI-IM resources. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-Resources-1 INTEGER ::= 31 -- Maximum number of CSI-IM resources minus 1. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-ResourcesPerSet INTEGER ::= 8 -- Maximum number of CSI-IM resources per set. See CSI-IM-ResourcePerSetMax in 38.214
+maxNrofCSI-IM-ResourceSets INTEGER ::= 64 -- Maximum number of NZP CSI-IM resources per cell
+maxNrofCSI-IM-ResourceSets-1 INTEGER ::= 63 -- Maximum number of NZP CSI-IM resources per cell minus 1
+maxNrofCSI-IM-ResourceSetsPerConfig INTEGER ::= 16 -- Maximum number of CSI IM resource sets per resource configuration
+maxNrofCSI-SSB-ResourcePerSet INTEGER ::= 64 -- Maximum number of SSB resources in a resource set
+maxNrofCSI-SSB-ResourceSets INTEGER ::= 64 -- Maximum number of CSI SSB resource sets per cell
+maxNrofCSI-SSB-ResourceSets-1 INTEGER ::= 63 -- Maximum number of CSI SSB resource sets per cell minus 1
+maxNrofCSI-SSB-ResourceSetsPerConfig INTEGER ::= 1 -- Maximum number of CSI SSB resource sets per resource configuration
+maxNrofFailureDetectionResources INTEGER ::= 10 -- Maximum number of failure detection resources
+maxNrofFailureDetectionResources-1 INTEGER ::= 9 -- Maximum number of failure detection resources minus 1
+maxNrofFreqSL-r16 INTEGER ::= 8 -- Maximum number of carrier frequncy for for NR sidelink communication
+maxNrofSL-BWPs-r16 INTEGER ::= 4 -- Maximum number of BWP for for NR sidelink communication
+maxFreqSL-EUTRA-r16 INTEGER ::= 8 -- Maximum number of EUTRA anchor carrier frequncy for NR sidelink communication
+maxNrofSL-MeasId-r16 INTEGER ::= 64 -- Maximum number of sidelink measurement identity (RSRP) per destination
+maxNrofSL-ObjectId-r16 INTEGER ::= 64 -- Maximum number of sidelink measurement objects (RSRP) per destination
+maxNrofSL-ReportConfigId-r16 INTEGER ::= 64 -- Maximum number of sidelink measurement reporting configuration(RSRP) per destination
+maxNrofSL-PoolToMeasureNR-r16 INTEGER ::= 8 -- Maximum number of resoure pool for NR sidelink measurement to measure for
+ -- each measurement object (for CBR)
+maxFreqSL-NR-r16 INTEGER ::= 8 -- Maximum number of NR anchor carrier frequncy for NR sidelink communication
+maxNrofSL-QFIs-r16 INTEGER ::= 2048 -- Maximum number of QoS flow for NR sidelink communication per UE
+maxNrofSL-QFIsPerDest-r16 INTEGER ::= 64 -- Maximum number of QoS flow per destination for NR sidelink communication
+maxNrofObjectId INTEGER ::= 64 -- Maximum number of measurement objects
+maxNrofPageRec INTEGER ::= 32 -- Maximum number of page records
+maxNrofPCI-Ranges INTEGER ::= 8 -- Maximum number of PCI ranges
+maxPLMN INTEGER ::= 12 -- Maximum number of PLMNs broadcast and reported by UE at establisghment
+maxNrofCSI-RS-ResourcesRRM INTEGER ::= 96 -- Maximum number of CSI-RS resources for an RRM measurement object
+maxNrofCSI-RS-ResourcesRRM-1 INTEGER ::= 95 -- Maximum number of CSI-RS resources for an RRM measurement object minus 1
+maxNrofMeasId INTEGER ::= 64 -- Maximum number of configured measurements
+maxNrofQuantityConfig INTEGER ::= 2 -- Maximum number of quantity configurations
+maxNrofCSI-RS-CellsRRM INTEGER ::= 96 -- Maximum number of cells with CSI-RS resources for an RRM measurement object
+maxNrofSL-Dest-r16 INTEGER ::= 32 -- Maximum number of destination for NR sidelink communication
+maxNrofSL-Dest-1-r16 INTEGER ::= 31 -- Highest index of destination for NR sidelink communication
+maxNrofSLRB-r16 INTEGER ::= 512 -- Maximum number of radio bearer for NR sidelink communication per UE
+maxSL-LCID-r16 INTEGER ::= 512 -- Maximum number of RLC bearer for NR sidelink communication per UE
+maxSL-SyncConfig-r16 INTEGER ::= 16 -- Maximum number of sidelink Sync configurations
+maxNrofRXPool-r16 INTEGER ::= 16 -- Maximum number of Rx resource poolfor NR sidelink communication
+maxNrofTXPool-r16 INTEGER ::= 8 -- Maximum number of Tx resourcepoolfor NR sidelink communication
+maxNrofPoolID-r16 INTEGER ::= 16 -- Maximum index of resource pool for NR sidelink communication
+maxNrofSRS-PathlossReferenceRS-r16 INTEGER ::= 64 -- Maximum number of RSs used as pathloss reference for SRS power control.
+maxNrofSRS-PathlossReferenceRS-1-r16 INTEGER ::= 63 -- Maximum number of RSs used as pathloss reference for SRS power control-1.
+maxNrofSRS-ResourceSets INTEGER ::= 16 -- Maximum number of SRS resource sets in a BWP.
+maxNrofSRS-ResourceSets-1 INTEGER ::= 15 -- Maximum number of SRS resource sets in a BWP minus 1.
+maxNrofSRS-PosResourceSets-r16 INTEGER ::= 16 -- Maximum number of SRS Positioning resource sets in a BWP.
+maxNrofSRS-PosResourceSets-1-r16 INTEGER ::= 15 -- Maximum number of SRS Positioning resource sets in a BWP minus 1.
+maxNrofSRS-Resources INTEGER ::= 64 -- Maximum number of SRS resources.
+maxNrofSRS-Resources-1 INTEGER ::= 63 -- Maximum number of SRS resources in an SRS resource set minus 1.
+maxNrofSRS-PosResources-r16 INTEGER ::= 64 -- Maximum number of SRS Positioning resources.
+maxNrofSRS-PosResources-1-r16 INTEGER ::= 63 -- Maximum number of SRS Positioning resources in an SRS Positioning
+ -- resource set minus 1.
+maxNrofSRS-ResourcesPerSet INTEGER ::= 16 -- Maximum number of SRS resources in an SRS resource set
+maxNrofSRS-TriggerStates-1 INTEGER ::= 3 -- Maximum number of SRS trigger states minus 1, i.e., the largest code point.
+maxNrofSRS-TriggerStates-2 INTEGER ::= 2 -- Maximum number of SRS trigger states minus 2.
+maxRAT-CapabilityContainers INTEGER ::= 8 -- Maximum number of interworking RAT containers (incl NR and MRDC)
+maxSimultaneousBands INTEGER ::= 32 -- Maximum number of simultaneously aggregated bands
+maxULTxSwitchingBandPairs INTEGER ::= 32 -- Maximum number of band pairs supporting dynamic UL Tx switching in a band combination
+maxNrofSlotFormatCombinationsPerSet INTEGER ::= 512 -- Maximum number of Slot Format Combinations in a SF-Set.
+maxNrofSlotFormatCombinationsPerSet-1 INTEGER ::= 511 -- Maximum number of Slot Format Combinations in a SF-Set minus 1.
+maxNrofTrafficPattern-r16 INTEGER ::= 8 -- Maximum number of Traffic Pattern for NR sidelink communication.
+maxNrofPUCCH-Resources INTEGER ::= 128
+maxNrofPUCCH-Resources-1 INTEGER ::= 127
+maxNrofPUCCH-ResourceSets INTEGER ::= 4 -- Maximum number of PUCCH Resource Sets
+maxNrofPUCCH-ResourceSets-1 INTEGER ::= 3 -- Maximum number of PUCCH Resource Sets minus 1.
+maxNrofPUCCH-ResourcesPerSet INTEGER ::= 32 -- Maximum number of PUCCH Resources per PUCCH-ResourceSet
+maxNrofPUCCH-P0-PerSet INTEGER ::= 8 -- Maximum number of P0-pucch present in a p0-pucch set
+maxNrofPUCCH-PathlossReferenceRSs INTEGER ::= 4 -- Maximum number of RSs used as pathloss reference for PUCCH power control.
+maxNrofPUCCH-PathlossReferenceRSs-1 INTEGER ::= 3 -- Maximum number of RSs used as pathloss reference for PUCCH power control minus 1.
+maxNrofPUCCH-PathlossReferenceRSs-r16 INTEGER ::= 64 -- Maximum number of RSs used as pathloss reference for PUCCH power control extended.
+maxNrofPUCCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63 -- Maximum number of RSs used as pathloss reference for PUCCH power control
+ -- minus 1 extended.
+maxNrofPUCCH-PathlossReferenceRSsDiff-r16 INTEGER ::= 60 -- Difference between the extended maximum and the non-extended maximum
+maxNrofPUCCH-ResourceGroups-r16 INTEGER ::= 4 -- Maximum number of PUCCH resources groups.
+maxNrofPUCCH-ResourcesPerGroup-r16 INTEGER ::= 128 -- Maximum number of PUCCH resources in a PUCCH group.
+maxNrofMultiplePUSCHs-r16 INTEGER ::= 8 -- Maximum number of multiple PUSCHs in PUSCH TDRA list
+maxNrofP0-PUSCH-AlphaSets INTEGER ::= 30 -- Maximum number of P0-pusch-alpha-sets (see 38,213, clause 7.1)
+maxNrofP0-PUSCH-AlphaSets-1 INTEGER ::= 29 -- Maximum number of P0-pusch-alpha-sets minus 1 (see 38,213, clause 7.1)
+maxNrofPUSCH-PathlossReferenceRSs INTEGER ::= 4 -- Maximum number of RSs used as pathloss reference for PUSCH power control.
+maxNrofPUSCH-PathlossReferenceRSs-1 INTEGER ::= 3 -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1.
+maxNrofPUSCH-PathlossReferenceRSs-r16 INTEGER ::= 64 -- Maximum number of RSs used as pathloss reference for PUSCH power control extended
+maxNrofPUSCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63 -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1
+maxNrofPUSCH-PathlossReferenceRSsDiff-r16 INTEGER ::= 60 -- Difference between maxNrofPUSCH-PathlossReferenceRSs-r16 and
+ -- maxNrofPUSCH-PathlossReferenceRSs
+maxNrofNAICS-Entries INTEGER ::= 8 -- Maximum number of supported NAICS capability set
+maxBands INTEGER ::= 1024 -- Maximum number of supported bands in UE capability.
+maxBandsMRDC INTEGER ::= 1280
+maxBandsEUTRA INTEGER ::= 256
+maxCellReport INTEGER ::= 8
+maxDRB INTEGER ::= 29 -- Maximum number of DRBs (that can be added in DRB-ToAddModLIst).
+maxFreq INTEGER ::= 8 -- Max number of frequencies.
+maxFreqLayers INTEGER ::= 4 -- Max number of frequency layers.
+maxFreqIDC-r16 INTEGER ::= 128 -- Max number of frequencies for IDC indication.
+maxCombIDC-r16 INTEGER ::= 128 -- Max number of reported UL CA for IDC indication.
+maxFreqIDC-MRDC INTEGER ::= 32 -- Maximum number of candidate NR frequencies for MR-DC IDC indication
+maxNrofCandidateBeams INTEGER ::= 16 -- Max number of PRACH-ResourceDedicatedBFR that in BFR config.
+maxNrofCandidateBeams-r16 INTEGER ::= 64 -- Max number of candidate beam resources in BFR config.
+maxNrofCandidateBeamsExt-r16 INTEGER ::= 48 -- Max number of PRACH-ResourceDedicatedBFR in the CandidateBeamRSListExt
+maxNrofPCIsPerSMTC INTEGER ::= 64 -- Maximun number of PCIs per SMTC.
+maxNrofQFIs INTEGER ::= 64
+maxNrofResourceAvailabilityPerCombination-r16 INTEGER ::= 256
+maxNrOfSemiPersistentPUSCH-Triggers INTEGER ::= 64 -- Maximum number of triggers for semi persistent reporting on PUSCH
+maxNrofSR-Resources INTEGER ::= 8 -- Maximum number of SR resources per BWP in a cell.
+maxNrofSlotFormatsPerCombination INTEGER ::= 256
+maxNrofSpatialRelationInfos INTEGER ::= 8
+maxNrofSpatialRelationInfos-plus-1 INTEGER ::= 9
+maxNrofSpatialRelationInfos-r16 INTEGER ::= 64
+maxNrofSpatialRelationInfosDiff-r16 INTEGER ::= 56 -- Difference between maxNrofSpatialRelationInfos-r16 and maxNrofSpatialRelationInfos
+maxNrofIndexesToReport INTEGER ::= 32
+maxNrofIndexesToReport2 INTEGER ::= 64
+maxNrofSSBs-r16 INTEGER ::= 64 -- Maximum number of SSB resources in a resource set.
+maxNrofSSBs-1 INTEGER ::= 63 -- Maximum number of SSB resources in a resource set minus 1.
+maxNrofS-NSSAI INTEGER ::= 8 -- Maximum number of S-NSSAI.
+maxNrofTCI-StatesPDCCH INTEGER ::= 64
+maxNrofTCI-States INTEGER ::= 128 -- Maximum number of TCI states.
+maxNrofTCI-States-1 INTEGER ::= 127 -- Maximum number of TCI states minus 1.
+maxNrofUL-Allocations INTEGER ::= 16 -- Maximum number of PUSCH time domain resource allocations.
+maxQFI INTEGER ::= 63
+maxRA-CSIRS-Resources INTEGER ::= 96
+maxRA-OccasionsPerCSIRS INTEGER ::= 64 -- Maximum number of RA occasions for one CSI-RS
+maxRA-Occasions-1 INTEGER ::= 511 -- Maximum number of RA occasions in the system
+maxRA-SSB-Resources INTEGER ::= 64
+maxSCSs INTEGER ::= 5
+maxSecondaryCellGroups INTEGER ::= 3
+maxNrofServingCellsEUTRA INTEGER ::= 32
+maxMBSFN-Allocations INTEGER ::= 8
+maxNrofMultiBands INTEGER ::= 8
+maxCellSFTD INTEGER ::= 3 -- Maximum number of cells for SFTD reporting
+maxReportConfigId INTEGER ::= 64
+maxNrofCodebooks INTEGER ::= 16 -- Maximum number of codebooks suppoted by the UE
+maxNrofCSI-RS-Resources INTEGER ::= 7 -- Maximum number of codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-r16 INTEGER ::= 512 -- Maximum number of alternative codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-1-r16 INTEGER ::= 511 -- Maximum number of alternative codebook resources supported by the UE minus 1
+maxNrofSRI-PUSCH-Mappings INTEGER ::= 16
+maxNrofSRI-PUSCH-Mappings-1 INTEGER ::= 15
+maxSIB INTEGER::= 32 -- Maximum number of SIBs
+maxSI-Message INTEGER::= 32 -- Maximum number of SI messages
+maxPO-perPF INTEGER ::= 4 -- Maximum number of paging occasion per paging frame
+maxAccessCat-1 INTEGER ::= 63 -- Maximum number of Access Categories minus 1
+maxBarringInfoSet INTEGER ::= 8 -- Maximum number of Access Categories
+maxCellEUTRA INTEGER ::= 8 -- Maximum number of E-UTRA cells in SIB list
+maxEUTRA-Carrier INTEGER ::= 8 -- Maximum number of E-UTRA carriers in SIB list
+maxPLMNIdentities INTEGER ::= 8 -- Maximum number of PLMN identites in RAN area configurations
+maxDownlinkFeatureSets INTEGER ::= 1024 -- (for NR DL) Total number of FeatureSets (size of the pool)
+maxUplinkFeatureSets INTEGER ::= 1024 -- (for NR UL) Total number of FeatureSets (size of the pool)
+maxEUTRA-DL-FeatureSets INTEGER ::= 256 -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxEUTRA-UL-FeatureSets INTEGER ::= 256 -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxFeatureSetsPerBand INTEGER ::= 128 -- (for NR) The number of feature sets associated with one band.
+maxPerCC-FeatureSets INTEGER ::= 1024 -- (for NR) Total number of CC-specific FeatureSets (size of the pool)
+maxFeatureSetCombinations INTEGER ::= 1024 -- (for MR-DC/NR)Total number of Feature set combinations (size of the pool)
+maxInterRAT-RSTD-Freq INTEGER ::= 3
+maxHRNN-Len-r16 INTEGER ::= 48 -- Maximum length of HRNNs
+maxNPN-r16 INTEGER ::= 12 -- Maximum number of NPNs broadcast and reported by UE at establishment
+maxNrOfMinSchedulingOffsetValues-r16 INTEGER ::= 2 -- Maximum number of min. scheduling offset (K0/K2) configurations
+maxK0-SchedulingOffset-r16 INTEGER ::= 16 -- Maximum number of slots configured as min. scheduling offset (K0)
+maxK2-SchedulingOffset-r16 INTEGER ::= 16 -- Maximum number of slots configured as min. scheduling offset (K2)
+maxDCI-2-6-Size-r16 INTEGER ::= 140 -- Maximum size of DCI format 2-6
+maxDCI-2-6-Size-1-r16 INTEGER ::= 139 -- Maximum DCI format 2-6 size minus 1
+maxNrofUL-Allocations-r16 INTEGER ::= 64 -- Maximum number of PUSCH time domain resource allocations
+maxNrofP0-PUSCH-Set-r16 INTEGER ::= 2 -- Maximum number of P0 PUSCH set(s)
+maxOnDemandSIB-r16 INTEGER ::= 8 -- Maximum number of SIB(s) that can be requested on-demand
+maxOnDemandPosSIB-r16 INTEGER ::= 32 -- Maximum number of posSIB(s) that can be requested on-demand
+maxCI-DCI-PayloadSize-r16 INTEGER ::= 126 -- Maximum number of the DCI size for CI
+maxCI-DCI-PayloadSize-r16-1 INTEGER ::= 125 -- Maximum number of the DCI size for CI minus 1
+maxWLAN-Id-Report-r16 INTEGER ::= 32 -- Maximum number of WLAN IDs to report
+maxWLAN-Name-r16 INTEGER ::= 4 -- Maximum number of WLAN name
+maxRAReport-r16 INTEGER ::= 8 -- Maximum number of RA procedures information to be included in the RA report
+maxTxConfig-r16 INTEGER ::= 64 -- Maximum number of sidelink transmission parameters configurations
+maxTxConfig-1-r16 INTEGER ::= 63 -- Maximum number of sidelink transmission parameters configurations minus 1
+maxPSSCH-TxConfig-r16 INTEGER ::= 16 -- Maximum number of PSSCH TX configurations
+maxNrofCLI-RSSI-Resources-r16 INTEGER ::= 64 -- Maximum number of CLI-RSSI resources for UE
+maxNrofCLI-RSSI-Resources-r16-1 INTEGER ::= 63 -- Maximum number of CLI-RSSI resources for UE minus 1
+maxNrofCLI-SRS-Resources-r16 INTEGER ::= 32 -- Maximum number of SRS resources for CLI measurement for UE
+maxCLI-Report-r16 INTEGER ::= 8
+maxNrofConfiguredGrantConfig-r16 INTEGER ::= 12 -- Maximum number of configured grant configurations per BWP
+maxNrofConfiguredGrantConfig-r16-1 INTEGER ::= 11 -- Maximum number of configured grant configurations per BWP minus 1
+maxNrofCG-Type2DeactivationState INTEGER ::= 16 -- Maximum number of deactivation state for type 2 configured grants per BWP
+maxNrofConfiguredGrantConfigMAC-r16 INTEGER ::= 32 -- Maximum number of configured grant configurations per MAC entity
+maxNrofConfiguredGrantConfigMAC-r16-1 INTEGER ::= 31 -- Maximum number of configured grant configurations per MAC entity minus 1
+maxNrofSPS-Config-r16 INTEGER ::= 8 -- Maximum number of SPS configurations per BWP
+maxNrofSPS-Config-r16-1 INTEGER ::= 7 -- Maximum number of SPS configurations per BWP minus 1
+maxNrofSPS-DeactivationState INTEGER ::= 16 -- Maximum number of deactivation state for SPS per BWP
+maxNrofDormancyGroups INTEGER ::= 5 --
+maxNrofPUCCH-ResourceGroups-1-r16 INTEGER ::= 3 --
+maxNrofServingCellsTCI-r16 INTEGER ::= 32 -- Maximum number of serving cells in simultaneousTCI-UpdateList
+
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-STOP
+
+END
+
+-- NR-UE-VARIABLES-START
+
+NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+IMPORTS
+ ARFCN-ValueNR,
+ CellIdentity,
+ EUTRA-PhysCellId,
+ MeasId,
+ MeasIdToAddModList,
+ MeasIdleCarrierEUTRA-r16,
+ MeasIdleCarrierNR-r16,
+ MeasResultIdleEUTRA-r16,
+ MeasResultIdleNR-r16,
+ MeasObjectToAddModList,
+ PhysCellId,
+ RNTI-Value,
+ ReportConfigToAddModList,
+ RSRP-Range,
+ SL-MeasId-r16,
+ SL-MeasIdList-r16,
+ SL-MeasObjectList-r16,
+ SL-ReportConfigList-r16,
+ SL-QuantityConfig-r16,
+ Tx-PoolMeasList-r16,
+ QuantityConfig,
+ maxNrofCellMeas,
+ maxNrofMeasId,
+ maxFreqIdle-r16,
+ PhysCellIdUTRA-FDD-r16,
+ ValidityAreaList-r16,
+ CondReconfigToAddModList-r16,
+ ConnEstFailReport-r16,
+ LoggingDuration-r16,
+ LoggingInterval-r16,
+ LogMeasInfoList-r16,
+ LogMeasInfo-r16,
+ RA-Report-r16,
+ RLF-Report-r16,
+ TraceReference-r16,
+ WLAN-Identifiers-r16,
+ WLAN-NameList-r16,
+ BT-NameList-r16,
+ PLMN-Identity,
+ maxPLMN,
+ RA-ReportList-r16,
+ VisitedCellInfoList-r16,
+ AbsoluteTimeInfo-r16,
+ LoggedEventTriggerConfig-r16,
+ LoggedPeriodicalReportConfig-r16,
+ Sensor-NameList-r16,
+ PLMN-IdentityList2-r16,
+ AreaConfiguration-r16,
+ maxNrofSL-MeasId-r16,
+ maxNrofFreqSL-r16,
+ maxNrofCLI-RSSI-Resources-r16,
+ maxNrofCLI-SRS-Resources-r16,
+ RSSI-ResourceId-r16,
+ SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- NR-UE-VARIABLES-STOP
+
+-- TAG-VARCONDITIONALRECONFIG-START
+
+VarConditionalReconfig ::= SEQUENCE {
+ condReconfigList CondReconfigToAddModList-r16 OPTIONAL
+}
+
+
+-- TAG-VARCONDITIONALRECONFIG-STOP
+-- TAG-VARCONNESTFAILREPORT-START
+
+VarConnEstFailReport-r16 ::= SEQUENCE {
+ connEstFailReport-r16 ConnEstFailReport-r16,
+ plmn-Identity-r16 PLMN-Identity
+}
+
+-- TAG-VARCONNESTFAILREPORT-STOP
+-- TAG-VARLOGMEASCONFIG-START
+
+VarLogMeasConfig-r16-IEs ::= SEQUENCE {
+ areaConfiguration-r16 AreaConfiguration-r16 OPTIONAL,
+ bt-NameList-r16 BT-NameList-r16 OPTIONAL,
+ wlan-NameList-r16 WLAN-NameList-r16 OPTIONAL,
+ sensor-NameList-r16 Sensor-NameList-r16 OPTIONAL,
+ loggingDuration-r16 LoggingDuration-r16,
+ reportType CHOICE {
+ periodical LoggedPeriodicalReportConfig-r16,
+ eventTriggered LoggedEventTriggerConfig-r16
+ }
+}
+-- TAG-VARLOGMEASCONFIG-STOP
+-- TAG-VARLOGMEAREPORT-START
+
+VarLogMeasReport-r16 ::= SEQUENCE {
+ absoluteTimeStamp-r16 AbsoluteTimeInfo-r16,
+ traceReference-r16 TraceReference-r16,
+ traceRecordingSessionRef-r16 OCTET STRING (SIZE (2)),
+ tce-Id-r16 OCTET STRING (SIZE (1)),
+ logMeasInfoList-r16 LogMeasInfoList-r16,
+ plmn-IdentityList-r16 PLMN-IdentityList2-r16
+}
+
+-- TAG-VARLOGMEAREPORT-STOP
+-- TAG-VARMEASCONFIG-START
+
+VarMeasConfig ::= SEQUENCE {
+ -- Measurement identities
+ measIdList MeasIdToAddModList OPTIONAL,
+ -- Measurement objects
+ measObjectList MeasObjectToAddModList OPTIONAL,
+ -- Reporting configurations
+ reportConfigList ReportConfigToAddModList OPTIONAL,
+ -- Other parameters
+ quantityConfig QuantityConfig OPTIONAL,
+
+ s-MeasureConfig CHOICE {
+ ssb-RSRP RSRP-Range,
+ csi-RSRP RSRP-Range
+ } OPTIONAL
+
+}
+
+-- TAG-VARMEASCONFIG-STOP
+-- TAG-VARMEASCONFIGSL-START
+
+VarMeasConfigSL-r16 ::= SEQUENCE {
+ -- NR sidelink measurement identities
+ sl-MeasIdList-r16 SL-MeasIdList-r16 OPTIONAL,
+ -- NR sidelink measurement objects
+ sl-MeasObjectList-r16 SL-MeasObjectList-r16 OPTIONAL,
+ -- NR sidelink reporting configurations
+ sl-reportConfigList-r16 SL-ReportConfigList-r16 OPTIONAL,
+ -- Other parameters
+ sl-QuantityConfig-r16 SL-QuantityConfig-r16 OPTIONAL
+}
+
+-- TAG-VARMEASCONFIGSL-STOP
+-- TAG-VARMEASIDLECONFIG-START
+
+VarMeasIdleConfig-r16 ::= SEQUENCE {
+ measIdleCarrierListNR-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16 OPTIONAL,
+ measIdleCarrierListEUTRA-r16 SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16 OPTIONAL,
+ measIdleDuration-r16 ENUMERATED {sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+ validityAreaList-r16 ValidityAreaList-r16 OPTIONAL
+}
+
+-- TAG-VARMEASIDLECONFIG-STOP
+-- TAG-VARMEASIDLEREPORT-START
+
+VarMeasIdleReport-r16 ::= SEQUENCE {
+ measReportIdleNR-r16 MeasResultIdleNR-r16 OPTIONAL,
+ measReportIdleEUTRA-r16 MeasResultIdleEUTRA-r16 OPTIONAL
+}
+
+-- TAG-VARMEASIDLEREPORT-STOP
+-- TAG-VARMEASREPORTLIST-START
+
+VarMeasReportList ::= SEQUENCE (SIZE (1..maxNrofMeasId)) OF VarMeasReport
+
+VarMeasReport ::= SEQUENCE {
+ -- List of measurement that have been triggered
+ measId MeasId,
+ cellsTriggeredList CellsTriggeredList OPTIONAL,
+ numberOfReportsSent INTEGER,
+ cli-TriggeredList-r16 CLI-TriggeredList-r16 OPTIONAL,
+ tx-PoolMeasToAddModListNR-r16 Tx-PoolMeasList-r16 OPTIONAL
+}
+
+CellsTriggeredList ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CHOICE {
+ physCellId PhysCellId,
+ physCellIdEUTRA EUTRA-PhysCellId,
+ physCellIdUTRA-FDD-r16 PhysCellIdUTRA-FDD-r16
+ }
+
+CLI-TriggeredList-r16 ::= CHOICE {
+ srs-RSRP-TriggeredList-r16 SRS-RSRP-TriggeredList-r16,
+ cli-RSSI-TriggeredList-r16 CLI-RSSI-TriggeredList-r16
+ }
+
+SRS-RSRP-TriggeredList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceId
+
+CLI-RSSI-TriggeredList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceId-r16
+
+-- TAG-VARMEASREPORTLIST-STOP
+-- TAG-VARMEASREPORTLISTSL-START
+
+VarMeasReportListSL-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF VarMeasReportSL-r16
+
+VarMeasReportSL-r16 ::= SEQUENCE {
+ -- List of NR sidelink measurement that have been triggered
+ sl-MeasId-r16 SL-MeasId-r16,
+ sl-FrequencyTriggeredList-r16 SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF ARFCN-ValueNR OPTIONAL,
+ sl-NumberOfReportsSent-r16 INTEGER
+}
+
+-- TAG-VARMEASREPORTLISTSL-STOP
+-- TAG-VARMOBILITYHISTORYREPORT-START
+
+VarMobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+-- TAG-VARMOBILITYHISTORYREPORT-STOP
+-- TAG-VARPENDINGRNA-UPDATE-START
+
+VarPendingRNA-Update ::= SEQUENCE {
+ pendingRNA-Update BOOLEAN OPTIONAL
+}
+
+-- TAG-VARPENDINGRNA-UPDATE-STOP
+-- TAG-VARRA-REPORT-START
+
+VarRA-Report-r16 ::= SEQUENCE {
+ ra-ReportList-r16 RA-ReportList-r16,
+ plmn-IdentityList-r16 PLMN-IdentityList-r16
+}
+
+PLMN-IdentityList-r16 ::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-VARRA-REPORT-STOP
+-- TAG-VARRESUMEMAC-INPUT-START
+
+VarResumeMAC-Input ::= SEQUENCE {
+ sourcePhysCellId PhysCellId,
+ targetCellIdentity CellIdentity,
+ source-c-RNTI RNTI-Value
+
+}
+
+-- TAG-VARRESUMEMAC-INPUT-STOP
+-- TAG-VARRLF-REPORT-START
+
+VarRLF-Report-r16 ::= SEQUENCE {
+ rlf-Report-r16 RLF-Report-r16,
+ plmn-IdentityList-r16 PLMN-IdentityList-r16
+}
+
+-- TAG-VARRLF-REPORT-STOP
+-- TAG-VARSHORTMAC-INPUT-START
+
+VarShortMAC-Input ::= SEQUENCE {
+ sourcePhysCellId PhysCellId,
+ targetCellIdentity CellIdentity,
+ source-c-RNTI RNTI-Value
+}
+
+-- TAG-VARSHORTMAC-INPUT-STOP
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-START
+
+NR-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+IMPORTS
+ ARFCN-ValueNR,
+ ARFCN-ValueEUTRA,
+ CellIdentity,
+ CGI-InfoEUTRA,
+ CGI-InfoNR,
+ CSI-RS-Index,
+ CSI-RS-CellMobility,
+ DRX-Config,
+ EUTRA-PhysCellId,
+ FreqBandIndicatorNR,
+ GapConfig,
+ maxBandComb,
+ maxBands,
+ maxCellSFTD,
+ maxFeatureSetsPerBand,
+ maxFreqIDC-MRDC,
+ maxNrofCombIDC,
+ maxNrofSCells,
+ maxNrofServingCells,
+ maxNrofServingCells-1,
+ maxNrofServingCellsEUTRA,
+ maxNrofIndexesToReport,
+ maxSimultaneousBands,
+ MeasQuantityResults,
+ MeasResultCellListSFTD-EUTRA,
+ MeasResultCellListSFTD-NR,
+ MeasResultList2NR,
+ MeasResultSCG-Failure,
+ MeasResultServFreqListEUTRA-SCG,
+ NeedForGapsInfoNR-r16,
+ OverheatingAssistance,
+ P-Max,
+ PhysCellId,
+ RadioBearerConfig,
+ RAN-NotificationAreaInfo,
+ RRCReconfiguration,
+ ServCellIndex,
+ SetupRelease,
+ SSB-Index,
+ SSB-MTC,
+ SSB-ToMeasure,
+ SS-RSSI-Measurement,
+ ShortMAC-I,
+ SubcarrierSpacing,
+ UEAssistanceInformation,
+ UE-CapabilityRAT-ContainerList,
+ maxNrofCLI-RSSI-Resources-r16,
+ maxNrofCLI-SRS-Resources-r16,
+ RSSI-ResourceId-r16,
+ SidelinkUEInformationNR-r16,
+ SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-STOP
+
+-- TAG-HANDOVER-COMMAND-START
+
+HandoverCommand ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ handoverCommand HandoverCommand-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+HandoverCommand-IEs ::= SEQUENCE {
+ handoverCommandMessage OCTET STRING (CONTAINING RRCReconfiguration),
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-HANDOVER-COMMAND-STOP
+-- TAG-HANDOVER-PREPARATION-INFORMATION-START
+
+HandoverPreparationInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ handoverPreparationInformation HandoverPreparationInformation-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+HandoverPreparationInformation-IEs ::= SEQUENCE {
+ ue-CapabilityRAT-List UE-CapabilityRAT-ContainerList,
+ sourceConfig AS-Config OPTIONAL, -- Cond HO
+ rrm-Config RRM-Config OPTIONAL,
+ as-Context AS-Context OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+AS-Config ::= SEQUENCE {
+ rrcReconfiguration OCTET STRING (CONTAINING RRCReconfiguration),
+ ...,
+ [[
+ sourceRB-SN-Config OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL,
+ sourceSCG-NR-Config OCTET STRING (CONTAINING RRCReconfiguration) OPTIONAL,
+ sourceSCG-EUTRA-Config OCTET STRING OPTIONAL
+ ]],
+ [[
+ sourceSCG-Configured ENUMERATED {true} OPTIONAL
+ ]]
+
+}
+
+AS-Context ::= SEQUENCE {
+ reestablishmentInfo ReestablishmentInfo OPTIONAL,
+ configRestrictInfo ConfigRestrictInfoSCG OPTIONAL,
+ ...,
+ [[ ran-NotificationAreaInfo RAN-NotificationAreaInfo OPTIONAL
+ ]],
+ [[ ueAssistanceInformation OCTET STRING (CONTAINING UEAssistanceInformation) OPTIONAL -- Cond HO2
+ ]],
+ [[
+ selectedBandCombinationSN BandCombinationInfoSN OPTIONAL
+ ]],
+ [[
+ configRestrictInfoDAPS-r16 ConfigRestrictInfoDAPS-r16 OPTIONAL,
+ sidelinkUEInformationNR-r16 OCTET STRING OPTIONAL,
+ sidelinkUEInformationEUTRA-r16 OCTET STRING OPTIONAL,
+ ueAssistanceInformationEUTRA-r16 OCTET STRING OPTIONAL,
+ ueAssistanceInformationSCG-r16 OCTET STRING (CONTAINING UEAssistanceInformation) OPTIONAL, -- Cond HO2
+ needForGapsInfoNR-r16 NeedForGapsInfoNR-r16 OPTIONAL
+ ]]
+}
+
+ConfigRestrictInfoDAPS-r16 ::= SEQUENCE {
+ powerCoordination-r16 SEQUENCE {
+ p-DAPS-Source-r16 P-Max,
+ p-DAPS-Target-r16 P-Max,
+ uplinkPowerSharingDAPS-Mode-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+ } OPTIONAL
+}
+
+ReestablishmentInfo ::= SEQUENCE {
+ sourcePhysCellId PhysCellId,
+ targetCellShortMAC-I ShortMAC-I,
+ additionalReestabInfoList ReestabNCellInfoList OPTIONAL
+}
+
+ReestabNCellInfoList ::= SEQUENCE ( SIZE (1..maxCellPrep) ) OF ReestabNCellInfo
+
+ReestabNCellInfo::= SEQUENCE{
+ cellIdentity CellIdentity,
+ key-gNodeB-Star BIT STRING (SIZE (256)),
+ shortMAC-I ShortMAC-I
+}
+
+RRM-Config ::= SEQUENCE {
+ ue-InactiveTime ENUMERATED {
+ s1, s2, s3, s5, s7, s10, s15, s20,
+ s25, s30, s40, s50, min1, min1s20, min1s40,
+ min2, min2s30, min3, min3s30, min4, min5, min6,
+ min7, min8, min9, min10, min12, min14, min17, min20,
+ min24, min28, min33, min38, min44, min50, hr1,
+ hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6,
+ hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2,
+ day2hr12, day3, day4, day5, day7, day10, day14, day19,
+ day24, day30, dayMoreThan30} OPTIONAL,
+ candidateCellInfoList MeasResultList2NR OPTIONAL,
+ ...,
+ [[
+ candidateCellInfoListSN-EUTRA MeasResultServFreqListEUTRA-SCG OPTIONAL
+ ]]
+}
+
+-- TAG-HANDOVER-PREPARATION-INFORMATION-STOP
+-- TAG-CG-CONFIG-START
+
+CG-Config ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ cg-Config CG-Config-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+CG-Config-IEs ::= SEQUENCE {
+ scg-CellGroupConfig OCTET STRING (CONTAINING RRCReconfiguration) OPTIONAL,
+ scg-RB-Config OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL,
+ configRestrictModReq ConfigRestrictModReqSCG OPTIONAL,
+ drx-InfoSCG DRX-Info OPTIONAL,
+ candidateCellInfoListSN OCTET STRING (CONTAINING MeasResultList2NR) OPTIONAL,
+ measConfigSN MeasConfigSN OPTIONAL,
+ selectedBandCombination BandCombinationInfoSN OPTIONAL,
+ fr-InfoListSCG FR-InfoList OPTIONAL,
+ candidateServingFreqListNR CandidateServingFreqListNR OPTIONAL,
+ nonCriticalExtension CG-Config-v1540-IEs OPTIONAL
+}
+
+CG-Config-v1540-IEs ::= SEQUENCE {
+ pSCellFrequency ARFCN-ValueNR OPTIONAL,
+ reportCGI-RequestNR SEQUENCE {
+ requestedCellInfo SEQUENCE {
+ ssbFrequency ARFCN-ValueNR,
+ cellForWhichToReportCGI PhysCellId
+ } OPTIONAL
+ } OPTIONAL,
+ ph-InfoSCG PH-TypeListSCG OPTIONAL,
+ nonCriticalExtension CG-Config-v1560-IEs OPTIONAL
+}
+
+CG-Config-v1560-IEs ::= SEQUENCE {
+ pSCellFrequencyEUTRA ARFCN-ValueEUTRA OPTIONAL,
+ scg-CellGroupConfigEUTRA OCTET STRING OPTIONAL,
+ candidateCellInfoListSN-EUTRA OCTET STRING OPTIONAL,
+ candidateServingFreqListEUTRA CandidateServingFreqListEUTRA OPTIONAL,
+ needForGaps ENUMERATED {true} OPTIONAL,
+ drx-ConfigSCG DRX-Config OPTIONAL,
+ reportCGI-RequestEUTRA SEQUENCE {
+ requestedCellInfoEUTRA SEQUENCE {
+ eutraFrequency ARFCN-ValueEUTRA,
+ cellForWhichToReportCGI-EUTRA EUTRA-PhysCellId
+ } OPTIONAL
+ } OPTIONAL,
+ nonCriticalExtension CG-Config-v1590-IEs OPTIONAL
+}
+
+CG-Config-v1590-IEs ::= SEQUENCE {
+ scellFrequenciesSN-NR SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF ARFCN-ValueNR OPTIONAL,
+ scellFrequenciesSN-EUTRA SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF ARFCN-ValueEUTRA OPTIONAL,
+ nonCriticalExtension CG-Config-v1610-IEs OPTIONAL
+}
+
+CG-Config-v1610-IEs ::= SEQUENCE {
+ drx-InfoSCG2 DRX-Info2 OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+PH-TypeListSCG ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoSCG
+
+PH-InfoSCG ::= SEQUENCE {
+ servCellIndex ServCellIndex,
+ ph-Uplink PH-UplinkCarrierSCG,
+ ph-SupplementaryUplink PH-UplinkCarrierSCG OPTIONAL,
+ ...
+}
+
+PH-UplinkCarrierSCG ::= SEQUENCE{
+ ph-Type1or3 ENUMERATED {type1, type3},
+ ...
+}
+
+MeasConfigSN ::= SEQUENCE {
+ measuredFrequenciesSN SEQUENCE (SIZE (1..maxMeasFreqsSN)) OF NR-FreqInfo OPTIONAL,
+ ...
+}
+
+NR-FreqInfo ::= SEQUENCE {
+ measuredFrequency ARFCN-ValueNR OPTIONAL,
+ ...
+}
+
+ConfigRestrictModReqSCG ::= SEQUENCE {
+ requestedBC-MRDC BandCombinationInfoSN OPTIONAL,
+ requestedP-MaxFR1 P-Max OPTIONAL,
+ ...,
+ [[
+ requestedPDCCH-BlindDetectionSCG INTEGER (1..15) OPTIONAL,
+ requestedP-MaxEUTRA P-Max OPTIONAL
+ ]],
+ [[
+ requestedP-MaxFR2-r16 P-Max OPTIONAL,
+ requestedMaxInterFreqMeasIdSCG-r16 INTEGER(1..maxMeasIdentitiesMN) OPTIONAL,
+ requestedMaxIntraFreqMeasIdSCG-r16 INTEGER(1..maxMeasIdentitiesMN) OPTIONAL
+ ]]
+}
+
+BandCombinationIndex ::= INTEGER (1..maxBandComb)
+
+BandCombinationInfoSN ::= SEQUENCE {
+ bandCombinationIndex BandCombinationIndex,
+ requestedFeatureSets FeatureSetEntryIndex
+}
+
+FR-InfoList ::= SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF FR-Info
+
+FR-Info ::= SEQUENCE {
+ servCellIndex ServCellIndex,
+ fr-Type ENUMERATED {fr1, fr2}
+}
+
+CandidateServingFreqListNR ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueNR
+
+CandidateServingFreqListEUTRA ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueEUTRA
+
+-- TAG-CG-CONFIG-STOP
+-- TAG-CG-CONFIG-INFO-START
+
+CG-ConfigInfo ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ cg-ConfigInfo CG-ConfigInfo-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+CG-ConfigInfo-IEs ::= SEQUENCE {
+ ue-CapabilityInfo OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList) OPTIONAL,-- Cond SN-AddMod
+ candidateCellInfoListMN MeasResultList2NR OPTIONAL,
+ candidateCellInfoListSN OCTET STRING (CONTAINING MeasResultList2NR) OPTIONAL,
+ measResultCellListSFTD-NR MeasResultCellListSFTD-NR OPTIONAL,
+ scgFailureInfo SEQUENCE {
+ failureType ENUMERATED { t310-Expiry, randomAccessProblem,
+ rlc-MaxNumRetx, synchReconfigFailure-SCG,
+ scg-reconfigFailure,
+ srb3-IntegrityFailure},
+ measResultSCG OCTET STRING (CONTAINING MeasResultSCG-Failure)
+ } OPTIONAL,
+ configRestrictInfo ConfigRestrictInfoSCG OPTIONAL,
+ drx-InfoMCG DRX-Info OPTIONAL,
+ measConfigMN MeasConfigMN OPTIONAL,
+ sourceConfigSCG OCTET STRING (CONTAINING RRCReconfiguration) OPTIONAL,
+ scg-RB-Config OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL,
+ mcg-RB-Config OCTET STRING (CONTAINING RadioBearerConfig) OPTIONAL,
+ mrdc-AssistanceInfo MRDC-AssistanceInfo OPTIONAL,
+ nonCriticalExtension CG-ConfigInfo-v1540-IEs OPTIONAL
+}
+
+CG-ConfigInfo-v1540-IEs ::= SEQUENCE {
+ ph-InfoMCG PH-TypeListMCG OPTIONAL,
+ measResultReportCGI SEQUENCE {
+ ssbFrequency ARFCN-ValueNR,
+ cellForWhichToReportCGI PhysCellId,
+ cgi-Info CGI-InfoNR
+ } OPTIONAL,
+ nonCriticalExtension CG-ConfigInfo-v1560-IEs OPTIONAL
+}
+
+CG-ConfigInfo-v1560-IEs ::= SEQUENCE {
+ candidateCellInfoListMN-EUTRA OCTET STRING OPTIONAL,
+ candidateCellInfoListSN-EUTRA OCTET STRING OPTIONAL,
+ sourceConfigSCG-EUTRA OCTET STRING OPTIONAL,
+ scgFailureInfoEUTRA SEQUENCE {
+ failureTypeEUTRA ENUMERATED { t313-Expiry, randomAccessProblem,
+ rlc-MaxNumRetx, scg-ChangeFailure},
+ measResultSCG-EUTRA OCTET STRING
+ } OPTIONAL,
+ drx-ConfigMCG DRX-Config OPTIONAL,
+ measResultReportCGI-EUTRA SEQUENCE {
+ eutraFrequency ARFCN-ValueEUTRA,
+ cellForWhichToReportCGI-EUTRA EUTRA-PhysCellId,
+ cgi-InfoEUTRA CGI-InfoEUTRA
+ } OPTIONAL,
+ measResultCellListSFTD-EUTRA MeasResultCellListSFTD-EUTRA OPTIONAL,
+ fr-InfoListMCG FR-InfoList OPTIONAL,
+ nonCriticalExtension CG-ConfigInfo-v1570-IEs OPTIONAL
+}
+
+CG-ConfigInfo-v1570-IEs ::= SEQUENCE {
+ sftdFrequencyList-NR SFTD-FrequencyList-NR OPTIONAL,
+ sftdFrequencyList-EUTRA SFTD-FrequencyList-EUTRA OPTIONAL,
+ nonCriticalExtension CG-ConfigInfo-v1590-IEs OPTIONAL
+}
+
+CG-ConfigInfo-v1590-IEs ::= SEQUENCE {
+ servFrequenciesMN-NR SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF ARFCN-ValueNR OPTIONAL,
+ nonCriticalExtension CG-ConfigInfo-v1610-IEs OPTIONAL
+}
+
+CG-ConfigInfo-v1610-IEs ::= SEQUENCE {
+ drx-InfoMCG2 DRX-Info2 OPTIONAL,
+ alignedDRX-Indication ENUMERATED {true} OPTIONAL,
+ scgFailureInfo-r16 SEQUENCE {
+ failureType-r16 ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+ t312-Expiry-r16, bh-RLF-r16,
+ spare4, spare3, spare2, spare1},
+ measResultSCG-r16 OCTET STRING (CONTAINING MeasResultSCG-Failure)
+ } OPTIONAL,
+ scgFailureInfoEUTRA-r16 SEQUENCE {
+ failureTypeEUTRA-r16 ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+ t312-Expiry-r16, bh-RLF-r16,
+ spare4, spare3, spare2, spare1},
+ measResultSCG-EUTRA-r16 OCTET STRING
+ } OPTIONAL,
+ sidelinkUEInformationNR-r16 OCTET STRING (CONTAINING SidelinkUEInformationNR-r16) OPTIONAL,
+ sidelinkUEInformationEUTRA-r16 OCTET STRING OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+SFTD-FrequencyList-NR ::= SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueNR
+
+SFTD-FrequencyList-EUTRA ::= SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueEUTRA
+
+ConfigRestrictInfoSCG ::= SEQUENCE {
+ allowedBC-ListMRDC BandCombinationInfoList OPTIONAL,
+ powerCoordination-FR1 SEQUENCE {
+ p-maxNR-FR1 P-Max OPTIONAL,
+ p-maxEUTRA P-Max OPTIONAL,
+ p-maxUE-FR1 P-Max OPTIONAL
+ } OPTIONAL,
+ servCellIndexRangeSCG SEQUENCE {
+ lowBound ServCellIndex,
+ upBound ServCellIndex
+ } OPTIONAL, -- Cond SN-AddMod
+ maxMeasFreqsSCG INTEGER(1..maxMeasFreqsMN) OPTIONAL,
+ dummy INTEGER(1..maxMeasIdentitiesMN) OPTIONAL,
+ ...,
+ [[
+ selectedBandEntriesMNList SEQUENCE (SIZE (1..maxBandComb)) OF SelectedBandEntriesMN OPTIONAL,
+ pdcch-BlindDetectionSCG INTEGER (1..15) OPTIONAL,
+ maxNumberROHC-ContextSessionsSN INTEGER(0.. 16384) OPTIONAL
+ ]],
+ [[
+ maxIntraFreqMeasIdentitiesSCG INTEGER(1..maxMeasIdentitiesMN) OPTIONAL,
+ maxInterFreqMeasIdentitiesSCG INTEGER(1..maxMeasIdentitiesMN) OPTIONAL
+ ]],
+ [[
+ p-maxNR-FR1-MCG-r16 P-Max OPTIONAL,
+ powerCoordination-FR2-r16 SEQUENCE {
+ p-maxNR-FR2-MCG-r16 P-Max OPTIONAL,
+ p-maxNR-FR2-SCG-r16 P-Max OPTIONAL,
+ p-maxUE-FR2-r16 P-Max OPTIONAL
+ } OPTIONAL,
+ nrdc-PC-mode-FR1-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic} OPTIONAL,
+ nrdc-PC-mode-FR2-r16 ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic} OPTIONAL,
+ maxMeasSRS-ResourceSCG-r16 INTEGER(0..maxNrofCLI-SRS-Resources-r16) OPTIONAL,
+ maxMeasCLI-ResourceSCG-r16 INTEGER(0..maxNrofCLI-RSSI-Resources-r16) OPTIONAL,
+ maxNumberEHC-ContextsSN-r16 INTEGER(0..65536) OPTIONAL,
+ allowedReducedConfigForOverheating-r16 OverheatingAssistance OPTIONAL
+ ]]
+}
+
+SelectedBandEntriesMN ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandEntryIndex
+
+BandEntryIndex ::= INTEGER (0.. maxNrofServingCells)
+
+PH-TypeListMCG ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoMCG
+
+PH-InfoMCG ::= SEQUENCE {
+ servCellIndex ServCellIndex,
+ ph-Uplink PH-UplinkCarrierMCG,
+ ph-SupplementaryUplink PH-UplinkCarrierMCG OPTIONAL,
+ ...
+}
+
+PH-UplinkCarrierMCG ::= SEQUENCE{
+ ph-Type1or3 ENUMERATED {type1, type3},
+ ...
+}
+
+BandCombinationInfoList ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationInfo
+
+BandCombinationInfo ::= SEQUENCE {
+ bandCombinationIndex BandCombinationIndex,
+ allowedFeatureSetsList SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSetEntryIndex
+}
+
+FeatureSetEntryIndex ::= INTEGER (1.. maxFeatureSetsPerBand)
+
+DRX-Info ::= SEQUENCE {
+ drx-LongCycleStartOffset CHOICE {
+ ms10 INTEGER(0..9),
+ ms20 INTEGER(0..19),
+ ms32 INTEGER(0..31),
+ ms40 INTEGER(0..39),
+ ms60 INTEGER(0..59),
+ ms64 INTEGER(0..63),
+ ms70 INTEGER(0..69),
+ ms80 INTEGER(0..79),
+ ms128 INTEGER(0..127),
+ ms160 INTEGER(0..159),
+ ms256 INTEGER(0..255),
+ ms320 INTEGER(0..319),
+ ms512 INTEGER(0..511),
+ ms640 INTEGER(0..639),
+ ms1024 INTEGER(0..1023),
+ ms1280 INTEGER(0..1279),
+ ms2048 INTEGER(0..2047),
+ ms2560 INTEGER(0..2559),
+ ms5120 INTEGER(0..5119),
+ ms10240 INTEGER(0..10239)
+ },
+ shortDRX SEQUENCE {
+ drx-ShortCycle ENUMERATED {
+ ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+ ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+ spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+ drx-ShortCycleTimer INTEGER (1..16)
+ } OPTIONAL
+}
+
+DRX-Info2 ::= SEQUENCE {
+ drx-onDurationTimer CHOICE {
+ subMilliSeconds INTEGER (1..31),
+ milliSeconds ENUMERATED {
+ ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+ ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+ ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+ }
+}
+
+MeasConfigMN ::= SEQUENCE {
+ measuredFrequenciesMN SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF NR-FreqInfo OPTIONAL,
+ measGapConfig SetupRelease { GapConfig } OPTIONAL,
+ gapPurpose ENUMERATED {perUE, perFR1} OPTIONAL,
+ ...,
+ [[ measGapConfigFR2 SetupRelease { GapConfig } OPTIONAL
+ ]]
+
+}
+
+MRDC-AssistanceInfo ::= SEQUENCE {
+ affectedCarrierFreqCombInfoListMRDC SEQUENCE (SIZE (1..maxNrofCombIDC)) OF AffectedCarrierFreqCombInfoMRDC,
+ ...,
+ [[
+ overheatingAssistanceSCG-r16 OCTET STRING (CONTAINING OverheatingAssistance) OPTIONAL
+ ]]
+}
+
+AffectedCarrierFreqCombInfoMRDC ::= SEQUENCE {
+ victimSystemType VictimSystemType,
+ interferenceDirectionMRDC ENUMERATED {eutra-nr, nr, other, utra-nr-other, nr-other, spare3, spare2, spare1},
+ affectedCarrierFreqCombMRDC SEQUENCE {
+ affectedCarrierFreqCombEUTRA AffectedCarrierFreqCombEUTRA OPTIONAL,
+ affectedCarrierFreqCombNR AffectedCarrierFreqCombNR
+ } OPTIONAL
+}
+
+VictimSystemType ::= SEQUENCE {
+ gps ENUMERATED {true} OPTIONAL,
+ glonass ENUMERATED {true} OPTIONAL,
+ bds ENUMERATED {true} OPTIONAL,
+ galileo ENUMERATED {true} OPTIONAL,
+ wlan ENUMERATED {true} OPTIONAL,
+ bluetooth ENUMERATED {true} OPTIONAL
+}
+
+AffectedCarrierFreqCombEUTRA ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF ARFCN-ValueEUTRA
+
+AffectedCarrierFreqCombNR ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF ARFCN-ValueNR
+
+-- TAG-CG-CONFIG-INFO-STOP
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-START
+
+MeasurementTimingConfiguration ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ measTimingConf MeasurementTimingConfiguration-IEs,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+MeasurementTimingConfiguration-IEs ::= SEQUENCE {
+ measTiming MeasTimingList OPTIONAL,
+ nonCriticalExtension MeasurementTimingConfiguration-v1550-IEs OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1550-IEs ::= SEQUENCE {
+ campOnFirstSSB BOOLEAN,
+ psCellOnlyOnFirstSSB BOOLEAN,
+ nonCriticalExtension MeasurementTimingConfiguration-v1610-IEs OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1610-IEs ::= SEQUENCE {
+ csi-RS-Config-r16 SEQUENCE {
+ csi-RS-SubcarrierSpacing-r16 SubcarrierSpacing,
+ csi-RS-CellMobility-r16 CSI-RS-CellMobility,
+ refSSBFreq-r16 ARFCN-ValueNR
+ },
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+MeasTimingList ::= SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF MeasTiming
+
+MeasTiming ::= SEQUENCE {
+ frequencyAndTiming SEQUENCE {
+ carrierFreq ARFCN-ValueNR,
+ ssbSubcarrierSpacing SubcarrierSpacing,
+ ssb-MeasurementTimingConfiguration SSB-MTC,
+ ss-RSSI-Measurement SS-RSSI-Measurement OPTIONAL
+ } OPTIONAL,
+...,
+ [[
+ ssb-ToMeasure SSB-ToMeasure OPTIONAL,
+ physCellId PhysCellId OPTIONAL
+ ]]
+}
+
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-STOP
+-- TAG-UE-RADIO-PAGING-INFORMATION-START
+
+UERadioPagingInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ ueRadioPagingInformation UERadioPagingInformation-IEs,
+ spare7 NULL,
+ spare6 NULL, spare5 NULL, spare4 NULL,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UERadioPagingInformation-IEs ::= SEQUENCE {
+ supportedBandListNRForPaging SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR OPTIONAL,
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+
+-- TAG-UE-RADIO-PAGING-INFORMATION-STOP
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-START
+
+UERadioAccessCapabilityInformation ::= SEQUENCE {
+ criticalExtensions CHOICE {
+ c1 CHOICE{
+ ueRadioAccessCapabilityInformation UERadioAccessCapabilityInformation-IEs,
+ spare7 NULL,
+ spare6 NULL, spare5 NULL, spare4 NULL,
+ spare3 NULL, spare2 NULL, spare1 NULL
+ },
+ criticalExtensionsFuture SEQUENCE {}
+ }
+}
+
+UERadioAccessCapabilityInformation-IEs ::= SEQUENCE {
+ ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList),
+ nonCriticalExtension SEQUENCE {} OPTIONAL
+}
+
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-STOP
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-START
+
+maxMeasFreqsMN INTEGER ::= 32 -- Maximum number of MN-configured measurement frequencies
+maxMeasFreqsSN INTEGER ::= 32 -- Maximum number of SN-configured measurement frequencies
+maxMeasIdentitiesMN INTEGER ::= 62 -- Maximum number of measurement identities that a UE can be configured with
+maxCellPrep INTEGER ::= 32 -- Maximum number of cells prepared for handover
+
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-STOP
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-START
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-STOP
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 9a53a5bbe0..596180e793 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -54,6 +54,7 @@
#include "NR_BCCH-BCH-Message.h"
#include "NR_PLMN-IdentityInfo.h"
#include "NR_MCC-MNC-Digit.h"
+#include "NR_NG-5G-S-TMSI.h"
//#include "MCCH-Message.h"
//#include "MBSFNAreaConfiguration-r9.h"
//#include "SCellToAddMod-r10.h"
@@ -89,10 +90,10 @@ typedef struct nr_uid_linear_allocator_s {
#define PROTOCOL_NR_RRC_CTXT_UE_FMT PROTOCOL_CTXT_FMT
-#define PROTOCOL_NR_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
+#define PROTOCOL_NR_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_NR_CTXT_ARGS(CTXT_Pp)
#define PROTOCOL_NR_RRC_CTXT_FMT PROTOCOL_CTXT_FMT
-#define PROTOCOL_NR_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
+#define PROTOCOL_NR_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_NR_CTXT_ARGS(CTXT_Pp)
#define NR_UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
@@ -149,7 +150,7 @@ typedef struct UE_RRC_INFO_NR_s {
uint32_t SIStatus;
uint32_t SIcnt;
uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA
- uint8_t SIwindowsize; //!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40
+ 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
@@ -168,8 +169,9 @@ typedef struct UE_RRC_INFO_NR_s {
typedef struct UE_S_TMSI_NR_s {
boolean_t presence;
- mme_code_t mme_code;
- m_tmsi_t m_tmsi;
+ uint16_t amf_set_id;
+ uint8_t amf_pointer;
+ uint32_t fiveg_tmsi;
} __attribute__ ((__packed__)) NR_UE_S_TMSI;
@@ -246,6 +248,14 @@ typedef struct SRB_INFO_TABLE_ENTRY_NR_s {
uint32_t Next_check_frame;
} NR_SRB_INFO_TABLE_ENTRY;
+typedef struct nr_rrc_guami_s {
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_len;
+ uint8_t amf_region_id;
+ uint16_t amf_set_id;
+ uint8_t amf_pointer;
+} nr_rrc_guami_t;
typedef struct gNB_RRC_UE_s {
uint8_t primaryCC_id;
@@ -267,7 +277,9 @@ typedef struct gNB_RRC_UE_s {
NR_UE_NR_Capability_t* UE_Capability_nr;
+ int UE_Capability_size;
NR_UE_MRDC_Capability_t* UE_Capability_MRDC;
+ int UE_MRDC_Capability_size;
NR_CellGroupConfig_t *secondaryCellGroup;
NR_RRCReconfiguration_t *reconfig;
@@ -275,13 +287,12 @@ typedef struct gNB_RRC_UE_s {
ImsiMobileIdentity_t imsi;
-#if defined(ENABLE_SECURITY)
- /* KeNB as derived from KASME received from EPC */
- uint8_t kenb[32];
- int8_t kenb_ncc;
+ /* KgNB as derived from KASME received from EPC */
+ uint8_t kgnb[32];
+ int8_t kgnb_ncc;
uint8_t nh[32];
int8_t nh_ncc;
-#endif
+
/* Used integrity/ciphering algorithms */
NR_CipheringAlgorithm_t ciphering_algorithm;
e_NR_IntegrityProtAlgorithm integrity_algorithm;
@@ -290,8 +301,10 @@ typedef struct gNB_RRC_UE_s {
rnti_t rnti;
uint64_t random_ue_identity;
- /* Information from UE RRC ConnectionRequest */
- UE_S_TMSI Initialue_identity_s_TMSI;
+ /* Information from UE RRC Setup Request */
+ NR_UE_S_TMSI Initialue_identity_5g_s_TMSI;
+ uint64_t ng_5G_S_TMSI_Part1;
+ uint16_t ng_5G_S_TMSI_Part2;
NR_EstablishmentCause_t establishment_cause;
/* Information from UE RRC ConnectionReestablishmentRequest */
@@ -302,8 +315,11 @@ typedef struct gNB_RRC_UE_s {
/* Information from S1AP initial_context_setup_req */
uint32_t gNB_ue_s1ap_id :24;
+ uint32_t gNB_ue_ngap_id;
+ uint64_t amf_ue_ngap_id:40;
+ nr_rrc_guami_t ue_guami;
- security_capabilities_t security_capabilities;
+ ngap_security_capabilities_t security_capabilities;
/* Total number of e_rab already setup in the list */
uint8_t setup_e_rabs;
@@ -343,6 +359,10 @@ typedef struct gNB_RRC_UE_s {
struct NR_MAC_CellGroupConfig *mac_CellGroupConfig;
struct NR_PhysicalCellGroupConfig *physicalCellGroupConfig;
+ /* Nas Pdu */
+ uint8_t nas_pdu_flag;
+ ngap_nas_pdu_t nas_pdu;
+
} gNB_RRC_UE_t;
typedef uid_t ue_uid_t;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index dd5fdddbaa..130c6a0e34 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -93,6 +93,23 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m);
+void
+rrc_gNB_generate_SecurityModeCommand(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+);
+
+uint8_t
+rrc_gNB_get_next_transaction_identifier(
+ module_id_t gnb_mod_idP
+);
+
+void
+rrc_gNB_generate_UECapabilityEnquiry(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+);
+
void nr_rrc_rx_tx(void);
/**\brief RRC eNB task.
@@ -101,3 +118,26 @@ void *rrc_gnb_task(void *args_p);
/* Trigger RRC periodic processing. To be called once per ms. */
void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe);
+
+/**\ Function to set or overwrite PTRS DL RRC parameters.
+ \ *bwp Pointer to dedicated RC config structure
+ \ *ptrsNrb Pointer to K_ptrs N_RB related parameters
+ \ *ptrsMcs Pointer to L_ptrs MCS related parameters
+ \ *epre_Ratio Pointer to ep_ratio
+ \ *reOffset Pointer to RE Offset Value */
+void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset);
+
+uint8_t
+nr_rrc_data_req(
+ const protocol_ctxt_t *const ctxt_pP,
+ const rb_id_t rb_idP,
+ const mui_t muiP,
+ const confirm_t confirmP,
+ const sdu_size_t sdu_size,
+ uint8_t *const buffer_pP,
+ const pdcp_transmission_mode_t modeP
+);
+
+int
+nr_rrc_mac_remove_ue(module_id_t mod_idP,
+ rnti_t rntiP);
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index a2c4b70e49..71e0bd13ad 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -51,6 +51,9 @@
#include "NR_MeasResults.h"
#include "LTE_UECapabilityInformation.h"
#include "LTE_UL-DCCH-Message.h"
+#include "NR_UL-CCCH-Message.h"
+#include "NR_RRCSetupRequest-IEs.h"
+#include "NR_RRCSetupComplete-IEs.h"
#include "rlc.h"
#include "rrc_eNB_UE_context.h"
@@ -65,11 +68,11 @@
#include "OCG.h"
#include "OCG_extern.h"
-#if defined(ENABLE_SECURITY)
- #include "UTIL/OSA/osa_defs.h"
-#endif
+#include "UTIL/OSA/osa_defs.h"
#include "rrc_eNB_S1AP.h"
+#include "rrc_gNB_NGAP.h"
+
#include "rrc_eNB_GTPV1U.h"
@@ -84,11 +87,37 @@
#include
#include
+#include "BIT_STRING.h"
+#include "assertions.h"
+
//#define XER_PRINT
-
extern RAN_CONTEXT_t RC;
+extern boolean_t nr_rrc_pdcp_config_asn1_req(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_SRB_ToAddModList_t *const srb2add_list,
+ NR_DRB_ToAddModList_t *const drb2add_list,
+ NR_DRB_ToReleaseList_t *const drb2release_list,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc,
+ uint8_t *const kRRCint,
+ uint8_t *const kUPenc
+ #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
+ ,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
+ #endif
+ ,rb_id_t *const defaultDRB,
+ struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
+
+extern rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP,
+ const NR_SRB_ToAddModList_t * const srb2add_listP,
+ const NR_DRB_ToAddModList_t * const drb2add_listP,
+ const NR_DRB_ToReleaseList_t * const drb2release_listP,
+ const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
+ struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
+
+static inline uint64_t bitStr_to_uint64(BIT_STRING_t *asn);
+
mui_t rrc_gNB_mui = 0;
///---------------------------------------------------------------------------------------------------------------///
@@ -303,6 +332,911 @@ void rrc_gNB_process_AdditionRequestInformation(const module_id_t gnb_mod_idP, x
parse_CG_ConfigInfo(rrc,cg_configinfo,m);
}
+
+//-----------------------------------------------------------------------------
+uint8_t
+rrc_gNB_get_next_transaction_identifier(
+ module_id_t gnb_mod_idP
+)
+//-----------------------------------------------------------------------------
+{
+ static uint8_t nr_rrc_transaction_identifier[NUMBER_OF_gNB_MAX];
+ nr_rrc_transaction_identifier[gnb_mod_idP] = (nr_rrc_transaction_identifier[gnb_mod_idP] + 1) % NR_RRC_TRANSACTION_IDENTIFIER_NUMBER;
+ LOG_T(NR_RRC, "generated xid is %d\n", nr_rrc_transaction_identifier[gnb_mod_idP]);
+ return nr_rrc_transaction_identifier[gnb_mod_idP];
+}
+
+//-----------------------------------------------------------------------------
+void
+rrc_gNB_generate_RRCSetup(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ const int CC_id
+)
+//-----------------------------------------------------------------------------
+{
+ LOG_I(NR_RRC, "rrc_gNB_generate_RRCSetup \n");
+ NR_SRB_ToAddModList_t *SRB_configList = NULL;
+
+ // T(T_GNB_RRC_SETUP,
+ // T_INT(ctxt_pP->module_id),
+ // T_INT(ctxt_pP->frame),
+ // T_INT(ctxt_pP->subframe),
+ // T_INT(ctxt_pP->rnti));
+ gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
+ SRB_configList = ue_p->SRB_configList;
+ ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ctxt_pP,
+ ue_context_pP,
+ CC_id,
+ (uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+ SRB_configList);
+
+ LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
+ (char *)(ue_p->Srb0.Tx_buffer.Payload),
+ ue_p->Srb0.Tx_buffer.payload_size,
+ "[MSG] RRC Setup\n");
+
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RRC_gNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_gNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+
+ // rrc_mac_config_req_eNB
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ ue_p->Srb0.Tx_buffer.Header, // LG WARNING
+ ue_p->Srb0.Tx_buffer.payload_size,
+ MSC_AS_TIME_FMT" RRCSetup UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ ue_p->Srb0.Tx_buffer.payload_size);
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCSetup (bytes %d)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ ue_p->Srb0.Tx_buffer.payload_size);
+ // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE
+ ue_context_pP->ue_context.ue_release_timer = 1;
+ // remove UE after 10 frames after RRCConnectionRelease is triggered
+ ue_context_pP->ue_context.ue_release_timer_thres = 1000;
+ /* init timers */
+ // ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM,
+ ue_p->Srb0.Tx_buffer.payload_size);
+ memcpy (message_buffer, (uint8_t*)ue_p->Srb0.Tx_buffer.Payload, ue_p->Srb0.Tx_buffer.payload_size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, GNB_RRC_CCCH_DATA_IND);
+ GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#endif
+}
+
+void
+rrc_gNB_generate_RRCReject(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ const int CC_id
+)
+//-----------------------------------------------------------------------------
+{
+ LOG_I(NR_RRC, "rrc_gNB_generate_RRCReject \n");
+ gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
+ ue_p->Srb0.Tx_buffer.payload_size = do_RRCReject(ctxt_pP->module_id,
+ (uint8_t *)ue_p->Srb0.Tx_buffer.Payload);
+ LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
+ (char *)(ue_p->Srb0.Tx_buffer.Payload),
+ ue_p->Srb0.Tx_buffer.payload_size,
+ "[MSG] RRCReject \n");
+ MSC_LOG_TX_MESSAGE(MSC_RRC_GNB,
+ MSC_RRC_UE,
+ ue_p->Srb0.Tx_buffer.Header,
+ ue_p->Srb0.Tx_buffer.payload_size,
+ MSC_AS_TIME_FMT" NR_RRCReject UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP == NULL ? -1 : ue_context_pP->ue_context.rnti,
+ ue_p->Srb0.Tx_buffer.payload_size);
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating NR_RRCReject (bytes %d)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ ue_p->Srb0.Tx_buffer.payload_size);
+
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM,
+ ue_p->Srb0.Tx_buffer.payload_size);
+ memcpy (message_buffer, (uint8_t*)ue_p->Srb0.Tx_buffer.Payload, ue_p->Srb0.Tx_buffer.payload_size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, GNB_RRC_CCCH_DATA_IND);
+ GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#endif
+}
+
+//-----------------------------------------------------------------------------
+/*
+* Process the rrc setup complete message from UE (SRB1 Active)
+*/
+void
+rrc_gNB_process_RRCSetupComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP,
+ NR_RRCSetupComplete_IEs_t *rrcSetupComplete
+)
+//-----------------------------------------------------------------------------
+{
+ LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing NR_RRCSetupComplete from UE (SRB1 Active)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ ue_context_pP->ue_context.Srb1.Active = 1;
+ ue_context_pP->ue_context.Status = NR_RRC_CONNECTED;
+
+ if (AMF_MODE_ENABLED) {
+ rrc_gNB_send_NGAP_NAS_FIRST_REQ(ctxt_pP, ue_context_pP, rrcSetupComplete);
+ } else {
+ rrc_gNB_generate_SecurityModeCommand(ctxt_pP, ue_context_pP);
+ }
+}
+
+//-----------------------------------------------------------------------------
+void
+rrc_gNB_generate_defaultRRCReconfiguration(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ // gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
+ uint8_t buffer[RRC_BUF_SIZE];
+ uint16_t size;
+ gNB_RRC_INST *gnb_rrc_inst = RC.nrrrc[ctxt_pP->module_id];
+
+ size = do_RRCReconfiguration(ctxt_pP, ue_context_pP, buffer,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+ gnb_rrc_inst);
+ LOG_DUMPMSG(NR_RRC, DEBUG_RRC,(char *)buffer, size, "[MSG] RRC Reconfiguration\n");
+
+ free(ue_context_pP->ue_context.nas_pdu.buffer);
+
+ LOG_I(NR_RRC, "[gNB %d] Frame %d, Logical Channel DL-DCCH, Generate NR_RRCReconfiguration (bytes %d, UE id %x)\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ size,
+ ue_context_pP->ue_context.rnti);
+ LOG_D(NR_RRC, "[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
+ ctxt_pP->frame,
+ ctxt_pP->module_id,
+ size,
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ ctxt_pP->module_id,
+ DCCH);
+ MSC_LOG_TX_MESSAGE(MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ size,
+ MSC_AS_TIME_FMT" NR_RRCReconfiguration UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ size);
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM, size);
+ memcpy (message_buffer, buffer, size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, GNB_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#else
+ nr_rrc_data_req(ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+ // rrc_pdcp_config_asn1_req
+ // rrc_rlc_config_asn1_req
+}
+
+//-----------------------------------------------------------------------------
+/*
+* Process the RRC Reconfiguration Complete from the UE
+*/
+void
+rrc_gNB_process_RRCReconfigurationComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP,
+ const uint8_t xid
+)
+{
+ int drb_id;
+ uint8_t *kRRCenc = NULL;
+ uint8_t *kRRCint = NULL;
+ uint8_t *kUPenc = NULL;
+ NR_DRB_ToAddModList_t *DRB_configList = ue_context_pP->ue_context.DRB_configList2[xid];
+ NR_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid];
+ NR_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid];
+ NR_DRB_Identity_t *drb_id_p = NULL;
+ uint8_t nr_DRB2LCHAN[8];
+
+ ue_context_pP->ue_context.ue_reestablishment_timer = 0;
+
+#ifndef PHYSIM
+ /* Derive the keys from kgnb */
+ if (DRB_configList != NULL) {
+ derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kUPenc);
+ }
+
+ derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kRRCenc);
+ derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kRRCint);
+#endif
+ /* Refresh SRBs/DRBs */
+ MSC_LOG_TX_MESSAGE(MSC_RRC_GNB, MSC_PDCP_ENB, NULL, 0, MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security unchanged)",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti);
+
+#ifndef ITTI_SIM
+ nr_rrc_pdcp_config_asn1_req(ctxt_pP,
+ SRB_configList, // NULL,
+ DRB_configList,
+ DRB_Release_configList2,
+ 0xff, // already configured during the securitymodecommand
+ kRRCenc,
+ kRRCint,
+ kUPenc,
+ NULL,
+ NULL,
+ NULL);
+ /* Refresh SRBs/DRBs */
+ nr_rrc_rlc_config_asn1_req(ctxt_pP,
+ SRB_configList, // NULL,
+ DRB_configList,
+ DRB_Release_configList2,
+ NULL,
+ NULL);
+#endif
+
+ /* Set the SRB active in UE context */
+ if (SRB_configList != NULL) {
+ for (int i = 0; (i < SRB_configList->list.count) && (i < 3); i++) {
+ if (SRB_configList->list.array[i]->srb_Identity == 1) {
+ ue_context_pP->ue_context.Srb1.Active = 1;
+ } else if (SRB_configList->list.array[i]->srb_Identity == 2) {
+ ue_context_pP->ue_context.Srb2.Active = 1;
+ ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2;
+ LOG_I(NR_RRC,"[gNB %d] Frame %d CC %d : SRB2 is now active\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ ue_context_pP->ue_context.primaryCC_id);
+ } else {
+ LOG_W(NR_RRC,"[gNB %d] Frame %d CC %d : invalide SRB identity %ld\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ ue_context_pP->ue_context.primaryCC_id,
+ SRB_configList->list.array[i]->srb_Identity);
+ }
+ }
+
+ free(SRB_configList);
+ ue_context_pP->ue_context.SRB_configList2[xid] = NULL;
+ }
+
+ /* Loop through DRBs and establish if necessary */
+ if (DRB_configList != NULL) {
+ for (int i = 0; i < DRB_configList->list.count; i++) {
+ if (DRB_configList->list.array[i]) {
+ drb_id = (int)DRB_configList->list.array[i]->drb_Identity;
+ LOG_I(NR_RRC, "[gNB %d] Frame %d : Logical Channel UL-DCCH, Received NR_RRCReconfigurationComplete from UE rnti %x, reconfiguring DRB %d/LCID %d\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ ctxt_pP->rnti,
+ (int)DRB_configList->list.array[i]->drb_Identity,
+ (int)*DRB_configList->list.array[i]->pdcp_Config->moreThanOneRLC->primaryPath.logicalChannel);
+
+ if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) {
+ ue_context_pP->ue_context.DRB_active[drb_id] = 1;
+ LOG_D(NR_RRC, "[gNB %d] Frame %d: Establish RLC UM Bidirectional, DRB %d Active\n",
+ ctxt_pP->module_id, ctxt_pP->frame, (int)DRB_configList->list.array[i]->drb_Identity);
+
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RRC_gNB --- MAC_CONFIG_REQ (DRB) ---> MAC_gNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+
+ if (DRB_configList->list.array[i]->pdcp_Config->moreThanOneRLC->primaryPath.logicalChannel) {
+ nr_DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->pdcp_Config->moreThanOneRLC->primaryPath.logicalChannel;
+ }
+
+ // rrc_mac_config_req_eNB
+ } else { // remove LCHAN from MAC/PHY
+ if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) {
+ // DRB has just been removed so remove RLC + PDCP for DRB
+ /* rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_REMOVE,
+ (ue_mod_idP * NB_RB_MAX) + DRB2LCHAN[i],UNDEF_SECURITY_MODE);
+ */
+ rrc_rlc_config_req(ctxt_pP,
+ SRB_FLAG_NO,
+ MBMS_FLAG_NO,
+ CONFIG_ACTION_REMOVE,
+ nr_DRB2LCHAN[i],
+ Rlc_info_um);
+ }
+
+ ue_context_pP->ue_context.DRB_active[drb_id] = 0;
+ LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+
+ // rrc_mac_config_req_eNB
+
+ } // end else of if (ue_context_pP->ue_context.DRB_active[drb_id] == 0)
+ } // end if (DRB_configList->list.array[i])
+ } // end for (int i = 0; i < DRB_configList->list.count; i++)
+
+ free(DRB_configList);
+ ue_context_pP->ue_context.DRB_configList2[xid] = NULL;
+ } // end if DRB_configList != NULL
+
+ if(DRB_Release_configList2 != NULL) {
+ for (int i = 0; i < DRB_Release_configList2->list.count; i++) {
+ if (DRB_Release_configList2->list.array[i]) {
+ drb_id_p = DRB_Release_configList2->list.array[i];
+ drb_id = *drb_id_p;
+
+ if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) {
+ ue_context_pP->ue_context.DRB_active[drb_id] = 0;
+ }
+ }
+ }
+
+ free(DRB_Release_configList2);
+ ue_context_pP->ue_context.DRB_Release_configList2[xid] = NULL;
+ }
+}
+//-----------------------------------------------------------------------------
+
+/*------------------------------------------------------------------------------*/
+int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
+ const uint8_t *buffer,
+ int buffer_length,
+ const int CC_id)
+{
+ asn_dec_rval_t dec_rval;
+ NR_UL_CCCH_Message_t *ul_ccch_msg = NULL;
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ gNB_RRC_INST *gnb_rrc_inst = RC.nrrrc[ctxt_pP->module_id];
+ NR_RRCSetupRequest_IEs_t *rrcSetupRequest = NULL;
+ uint64_t random_value = 0;
+
+ dec_rval = uper_decode( NULL,
+ &asn_DEF_NR_UL_CCCH_Message,
+ (void **)&ul_ccch_msg,
+ (uint8_t *) buffer,
+ 100,
+ 0,
+ 0);
+
+ if (dec_rval.consumed == 0) {
+ /* TODO */
+ LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" FATAL Error in receiving CCCH\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ return -1;
+ }
+
+ if (ul_ccch_msg->message.present == NR_UL_CCCH_MessageType_PR_c1) {
+ switch (ul_ccch_msg->message.choice.c1->present) {
+ case NR_UL_CCCH_MessageType__c1_PR_NOTHING:
+ /* TODO */
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_FMT" Received PR_NOTHING on UL-CCCH-Message\n",
+ PROTOCOL_NR_RRC_CTXT_ARGS(ctxt_pP));
+ break;
+
+ case NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest:
+ ue_context_p = rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti);
+ if (ue_context_p != NULL) {
+ rrc_gNB_free_mem_UE_context(ctxt_pP, ue_context_p);
+ MSC_LOG_RX_DISCARDED_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ dec_rval.consumed,
+ MSC_AS_TIME_FMT" NR_RRCSetupRequest UE %x size %u (UE already in context)",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->ue_context.rnti,
+ dec_rval.consumed);
+ } else {
+ rrcSetupRequest = &ul_ccch_msg->message.choice.c1->choice.rrcSetupRequest->rrcSetupRequest;
+ if (NR_InitialUE_Identity_PR_randomValue == rrcSetupRequest->ue_Identity.present) {
+ /* randomValue BIT STRING (SIZE (39)) */
+ if (rrcSetupRequest->ue_Identity.choice.randomValue.size != 5) { // 39-bit random value
+ LOG_E(NR_RRC, "wrong InitialUE-Identity randomValue size, expected 5, provided %lu",
+ (long unsigned int)rrcSetupRequest->ue_Identity.choice.randomValue.size);
+ return -1;
+ }
+
+ memcpy(((uint8_t *) & random_value) + 3,
+ rrcSetupRequest->ue_Identity.choice.randomValue.buf,
+ rrcSetupRequest->ue_Identity.choice.randomValue.size);
+
+ /* if there is already a registered UE (with another RNTI) with this random_value,
+ * the current one must be removed from MAC/PHY (zombie UE)
+ */
+ if ((ue_context_p = rrc_gNB_ue_context_random_exist(RC.nrrrc[ctxt_pP->module_id], random_value))) {
+ LOG_W(NR_RRC, "new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY\n",
+ ctxt_pP->rnti, ue_context_p->ue_context.rnti, ue_context_p->ue_context.rnti);
+ ue_context_p->ue_context.ul_failure_timer = 20000;
+ }
+
+ ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], random_value);
+ ue_context_p->ue_context.Srb0.Srb_id = 0;
+ ue_context_p->ue_context.Srb0.Active = 1;
+ memcpy(ue_context_p->ue_context.Srb0.Rx_buffer.Payload,
+ buffer,
+ buffer_length);
+ ue_context_p->ue_context.Srb0.Rx_buffer.payload_size = buffer_length;
+ } else if (NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1 == rrcSetupRequest->ue_Identity.present) {
+ /* TODO */
+ /* <5G-S-TMSI> = <5G-TMSI> 48-bit */
+ /* ng-5G-S-TMSI-Part1 BIT STRING (SIZE (39)) */
+ if (rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size != 5) {
+ LOG_E(NR_RRC, "wrong ng_5G_S_TMSI_Part1 size, expected 5, provided %lu \n",
+ (long unsigned int)rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size);
+ return -1;
+ }
+
+ uint64_t s_tmsi_part1 = bitStr_to_uint64(&rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1);
+
+ // memcpy(((uint8_t *) & random_value) + 3,
+ // rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.buf,
+ // rrcSetupRequest->ue_Identity.choice.ng_5G_S_TMSI_Part1.size);
+
+ if ((ue_context_p = rrc_gNB_ue_context_5g_s_tmsi_exist(RC.nrrrc[ctxt_pP->module_id], s_tmsi_part1))) {
+ LOG_I(NR_RRC, " 5G-S-TMSI-Part1 exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p, ue_context_p->ue_context.rnti, ctxt_pP->rnti);
+
+ nr_rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti);
+
+ /* replace rnti in the context */
+ /* for that, remove the context from the RB tree */
+ RB_REMOVE(rrc_nr_ue_tree_s, &RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head, ue_context_p);
+ /* and insert again, after changing rnti everywhere it has to be changed */
+ ue_context_p->ue_id_rnti = ctxt_pP->rnti;
+ ue_context_p->ue_context.rnti = ctxt_pP->rnti;
+ RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head, ue_context_p);
+ /* reset timers */
+ ue_context_p->ue_context.ul_failure_timer = 0;
+ ue_context_p->ue_context.ue_release_timer = 0;
+ ue_context_p->ue_context.ue_reestablishment_timer = 0;
+ ue_context_p->ue_context.ue_release_timer_s1 = 0;
+ ue_context_p->ue_context.ue_release_timer_rrc = 0;
+ } else {
+ LOG_I(NR_RRC, " 5G-S-TMSI-Part1 doesn't exist, setting ng_5G_S_TMSI_Part1 to %p => %ld\n",
+ ue_context_p, s_tmsi_part1);
+
+ ue_context_p = rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], s_tmsi_part1);
+
+ if (ue_context_p == NULL) {
+ LOG_E(RRC, "%s:%d:%s: rrc_gNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__);
+ }
+
+ if (ue_context_p != NULL) {
+ ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence = TRUE;
+ ue_context_p->ue_context.ng_5G_S_TMSI_Part1 = s_tmsi_part1;
+ }
+ }
+ } else {
+ /* TODO */
+ memcpy(((uint8_t *) & random_value) + 3,
+ rrcSetupRequest->ue_Identity.choice.randomValue.buf,
+ rrcSetupRequest->ue_Identity.choice.randomValue.size);
+
+ rrc_gNB_get_next_free_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], random_value);
+ LOG_E(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RRCSetupRequest without random UE identity or S-TMSI not supported, let's reject the UE\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ rrc_gNB_generate_RRCReject(ctxt_pP,
+ rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti),
+ CC_id);
+ break;
+ }
+ }
+
+ if (ue_context_p != NULL) {
+ ue_context_p->ue_context.establishment_cause = rrcSetupRequest->establishmentCause;
+ }
+
+ rrc_gNB_generate_RRCSetup(ctxt_pP,
+ rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti),
+ CC_id);
+ break;
+
+ case NR_UL_CCCH_MessageType__c1_PR_rrcResumeRequest:
+ LOG_I(NR_RRC, "receive rrcResumeRequest message \n");
+ /* TODO */
+ break;
+
+ case NR_UL_CCCH_MessageType__c1_PR_rrcReestablishmentRequest:
+ LOG_I(NR_RRC, "receive rrcReestablishmentRequest message \n");
+ /* TODO */
+ break;
+
+ case NR_UL_CCCH_MessageType__c1_PR_rrcSystemInfoRequest:
+ LOG_I(NR_RRC, "receive rrcSystemInfoRequest message \n");
+ /* TODO */
+ break;
+
+ default:
+ LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Unknown message\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ break;
+ }
+ }
+ return 0;
+}
+
+/*! \fn uint64_t bitStr_to_uint64(BIT_STRING_t *)
+ *\brief This function extract at most a 64 bits value from a BIT_STRING_t object, the exact bits number depend on the BIT_STRING_t contents.
+ *\param[in] pointer to the BIT_STRING_t object.
+ *\return the extracted value.
+ */
+static inline uint64_t bitStr_to_uint64(BIT_STRING_t *asn) {
+ uint64_t result = 0;
+ int index;
+ int shift;
+
+ DevCheck ((asn->size > 0) && (asn->size <= 8), asn->size, 0, 0);
+
+ shift = ((asn->size - 1) * 8) - asn->bits_unused;
+ for (index = 0; index < (asn->size - 1); index++) {
+ result |= (uint64_t)asn->buf[index] << shift;
+ shift -= 8;
+ }
+
+ result |= asn->buf[index] >> asn->bits_unused;
+
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+int
+rrc_gNB_decode_dcch(
+ const protocol_ctxt_t *const ctxt_pP,
+ const rb_id_t Srb_id,
+ const uint8_t *const Rx_sdu,
+ const sdu_size_t sdu_sizeP
+)
+//-----------------------------------------------------------------------------
+{
+ asn_dec_rval_t dec_rval;
+ NR_UL_DCCH_Message_t *ul_dcch_msg = NULL;
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ // NR_RRCSetupComplete_t *rrcSetupComplete = NULL;
+
+ int i;
+
+ if ((Srb_id != 1) && (Srb_id != 2)) {
+ LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Received message on SRB%ld, should not have ...\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ Srb_id);
+ } else {
+ LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Received message on SRB%ld\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ Srb_id);
+ }
+
+ LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Decoding UL-DCCH Message\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ dec_rval = uper_decode(
+ NULL,
+ &asn_DEF_NR_UL_DCCH_Message,
+ (void **)&ul_dcch_msg,
+ Rx_sdu,
+ sdu_sizeP,
+ 0,
+ 0);
+ // xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
+
+ {
+ for (i = 0; i < sdu_sizeP; i++) {
+ LOG_T(NR_RRC, "%x.", Rx_sdu[i]);
+ }
+
+ LOG_T(NR_RRC, "\n");
+ }
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode UL-DCCH (%zu bytes)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ dec_rval.consumed);
+ return -1;
+ }
+
+ ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id],
+ ctxt_pP->rnti);
+
+ if (ul_dcch_msg->message.present == NR_UL_DCCH_MessageType_PR_c1) {
+ switch (ul_dcch_msg->message.choice.c1->present) {
+ case NR_UL_DCCH_MessageType__c1_PR_NOTHING:
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_FMT" Received PR_NOTHING on UL-DCCH-Message\n",
+ PROTOCOL_NR_RRC_CTXT_ARGS(ctxt_pP));
+ break;
+
+ case NR_UL_DCCH_MessageType__c1_PR_rrcReconfigurationComplete:
+ if(!ue_context_p) {
+ LOG_I(NR_RRC, "Processing NR_RRCReconfigurationComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti);
+ break;
+ }
+
+ LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)(Rx_sdu), sdu_sizeP,
+ "[MSG] RRC Connection Reconfiguration Complete\n");
+ MSC_LOG_RX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ Rx_sdu,
+ sdu_sizeP,
+ MSC_AS_TIME_FMT" NR_RRCReconfigurationComplete UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->ue_context.rnti,
+ sdu_sizeP);
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
+ "(RRCReconfigurationComplete) ---> RRC_gNB]\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH,
+ sdu_sizeP);
+
+ if (ul_dcch_msg->message.choice.c1->present == NR_UL_DCCH_MessageType__c1_PR_rrcReconfigurationComplete) {
+ if (ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->criticalExtensions.present ==
+ NR_RRCReconfigurationComplete__criticalExtensions_PR_rrcReconfigurationComplete)
+ rrc_gNB_process_RRCReconfigurationComplete(
+ ctxt_pP,
+ ue_context_p,
+ ul_dcch_msg->message.choice.c1->choice.rrcReconfigurationComplete->rrc_TransactionIdentifier);
+ }
+
+ rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(ctxt_pP, ue_context_p);
+
+ break;
+
+ case NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete:
+ if(!ue_context_p) {
+ LOG_I(NR_RRC, "Processing NR_RRCSetupComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti);
+ break;
+ }
+
+ LOG_DUMPMSG(NR_RRC, DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP,
+ "[MSG] RRC SetupComplete\n");
+ MSC_LOG_RX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ Rx_sdu,
+ sdu_sizeP,
+ MSC_AS_TIME_FMT" NR_RRCSetupComplete UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->ue_context.rnti,
+ sdu_sizeP);
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
+ "(RRCSetupComplete) ---> RRC_gNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH,
+ sdu_sizeP);
+
+ if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.present ==
+ NR_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete) {
+ if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.
+ rrcSetupComplete->ng_5G_S_TMSI_Value != NULL) {
+ if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.
+ rrcSetupComplete->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI_Part2) {
+ // ng-5G-S-TMSI-Part2 BIT STRING (SIZE (9))
+ if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.
+ rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2.size != 2) {
+ LOG_E(NR_RRC, "wrong ng_5G_S_TMSI_Part2 size, expected 2, provided %lu",
+ (long unsigned int)ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->
+ criticalExtensions.choice.rrcSetupComplete->
+ ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2.size);
+ return -1;
+ }
+
+ if (ue_context_p->ue_context.ng_5G_S_TMSI_Part1 != 0) {
+ ue_context_p->ue_context.ng_5G_S_TMSI_Part2 =
+ BIT_STRING_to_uint16(&ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->
+ criticalExtensions.choice.rrcSetupComplete->
+ ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI_Part2);
+ }
+
+ /* TODO */
+ } else if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.
+ rrcSetupComplete->ng_5G_S_TMSI_Value->present == NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI) {
+ // NG-5G-S-TMSI ::= BIT STRING (SIZE (48))
+ if (ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.
+ rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size != 6) {
+ LOG_E(NR_RRC, "wrong ng_5G_S_TMSI size, expected 6, provided %lu",
+ (long unsigned int)ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->
+ criticalExtensions.choice.rrcSetupComplete->
+ ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI.size);
+ return -1;
+ }
+
+ uint64_t fiveg_s_TMSI = bitStr_to_uint64(&ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->
+ criticalExtensions.choice.rrcSetupComplete->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI);
+ LOG_I(NR_RRC, "Received rrcSetupComplete, 5g_s_TMSI: 0x%lX, amf_set_id: 0x%lX(%ld), amf_pointer: 0x%lX(%ld), 5g TMSI: 0x%X \n",
+ fiveg_s_TMSI, fiveg_s_TMSI >> 38, fiveg_s_TMSI >> 38,
+ (fiveg_s_TMSI >> 32) & 0x3F, (fiveg_s_TMSI >> 32) & 0x3F,
+ (uint32_t)fiveg_s_TMSI);
+ if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) {
+ ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_set_id = fiveg_s_TMSI >> 38;
+ ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_pointer = (fiveg_s_TMSI >> 32) & 0x3F;
+ ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi = (uint32_t)fiveg_s_TMSI;
+ }
+ }
+ }
+
+ rrc_gNB_process_RRCSetupComplete(
+ ctxt_pP,
+ ue_context_p,
+ ul_dcch_msg->message.choice.c1->choice.rrcSetupComplete->criticalExtensions.choice.rrcSetupComplete);
+ LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" UE State = RRC_CONNECTED \n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ }
+
+ ue_context_p->ue_context.ue_release_timer = 0;
+ break;
+ case NR_UL_DCCH_MessageType__c1_PR_securityModeComplete:
+ // to avoid segmentation fault
+ if(!ue_context_p) {
+ LOG_I(NR_RRC, "Processing securityModeComplete UE %x, ue_context_p is NULL\n", ctxt_pP->rnti);
+ break;
+ }
+
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" received securityModeComplete on UL-DCCH %d from UE\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH);
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
+ "(securityModeComplete) ---> RRC_eNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH,
+ sdu_sizeP);
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
+ }
+
+ rrc_gNB_generate_UECapabilityEnquiry(ctxt_pP, ue_context_p);
+ //rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+ break;
+
+ case NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation:
+ if(!ue_context_p) {
+ LOG_I(NR_RRC, "Processing ueCapabilityInformation UE %x, ue_context_p is NULL\n", ctxt_pP->rnti);
+ break;
+ }
+
+ LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP,
+ "[MSG] NR_RRC UECapablility Information\n");
+ MSC_LOG_RX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ Rx_sdu,
+ sdu_sizeP,
+ MSC_AS_TIME_FMT" ueCapabilityInformation UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->ue_context.rnti,
+ sdu_sizeP);
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" received ueCapabilityInformation on UL-DCCH %d from UE\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH);
+ LOG_D(RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
+ "(UECapabilityInformation) ---> RRC_eNB\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH,
+ sdu_sizeP);
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)ul_dcch_msg);
+ }
+ LOG_I(NR_RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti);
+ int eutra_index = -1;
+
+ if( ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.present ==
+ NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation ) {
+ for(i = 0;i < ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.count; i++){
+ if(ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_nr){
+ if(ue_context_p->ue_context.UE_Capability_nr){
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_NR_Capability,
+ (void**)&ue_context_p->ue_context.UE_Capability_nr,
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+ 0,0);
+ if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+ xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ }
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+ LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ ue_context_p->ue_context.UE_Capability_size =
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+ if(eutra_index != -1){
+ LOG_E(NR_RRC,"fatal: more than 1 eutra capability\n");
+ exit(1);
+ }
+ eutra_index = i;
+ }
+
+ if(ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_eutra_nr){
+ if(ue_context_p->ue_context.UE_Capability_MRDC){
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_MRDC_Capability,
+ (void**)&ue_context_p->ue_context.UE_Capability_MRDC,
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf,
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size,
+ 0,0);
+
+ if(LOG_DEBUGFLAG(DEBUG_ASN1)){
+ xer_fprint(stdout,&asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ }
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){
+ LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+ ue_context_p->ue_context.UE_MRDC_Capability_size =
+ ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size;
+ }
+
+ if(ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type ==
+ NR_RAT_Type_eutra){
+ //TODO
+ }
+ }
+
+ if(eutra_index == -1)
+ break;
+ }
+
+ rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p);
+ break;
+
+ default:
+ break;
+ }
+ }
+ return 0;
+}
+
void rrc_gNB_process_release_request(const module_id_t gnb_mod_idP, x2ap_ENDC_sgnb_release_request_t *m)
{
gNB_RRC_INST *rrc = RC.nrrrc[gnb_mod_idP];
@@ -334,7 +1268,7 @@ void *rrc_gnb_task(void *args_p) {
int result;
//SRB_INFO *srb_info_p;
//int CC_id;
- //protocol_ctxt_t ctxt;
+ protocol_ctxt_t ctxt;
itti_mark_task_ready(TASK_RRC_GNB);
LOG_I(NR_RRC,"Entering main loop of NR_RRC message task\n");
@@ -350,21 +1284,61 @@ void *rrc_gnb_task(void *args_p) {
switch (ITTI_MSG_ID(msg_p)) {
case TERMINATE_MESSAGE:
- LOG_W(RRC, " *** Exiting NR_RRC thread\n");
+ LOG_W(NR_RRC, " *** Exiting NR_RRC thread\n");
itti_exit_task();
break;
case MESSAGE_TEST:
- LOG_I(RRC, "[gNB %d] Received %s\n", instance, msg_name_p);
+ LOG_I(NR_RRC, "[gNB %d] Received %s\n", instance, msg_name_p);
break;
- /* Messages from MAC */
-
case RRC_SUBFRAME_PROCESS:
nr_rrc_subframe_process(&RRC_SUBFRAME_PROCESS(msg_p).ctxt, RRC_SUBFRAME_PROCESS(msg_p).CC_id);
break;
+ /* Messages from MAC */
+ case NR_RRC_MAC_CCCH_DATA_IND:
+ // PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
+ // NR_RRC_MAC_CCCH_DATA_IND(msg_p).gnb_index,
+ // GNB_FLAG_YES,
+ // NR_RRC_MAC_CCCH_DATA_IND(msg_p).rnti,
+ // msg_p->ittiMsgHeader.lte_time.frame,
+ // msg_p->ittiMsgHeader.lte_time.slot);
+ LOG_I(NR_RRC,"Decoding CCCH : inst %d, CC_id %d, ctxt %p, sib_info_p->Rx_buffer.payload_size %d\n",
+ instance,
+ NR_RRC_MAC_CCCH_DATA_IND(msg_p).CC_id,
+ &ctxt,
+ NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size);
+
+ if (NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size >= CCCH_SDU_SIZE) {
+ LOG_I(NR_RRC, "CCCH message has size %d > %d\n",
+ NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size,CCCH_SDU_SIZE);
+ break;
+ }
+
+ nr_rrc_gNB_decode_ccch(&ctxt,
+ (uint8_t *)NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu,
+ NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size,
+ NR_RRC_MAC_CCCH_DATA_IND(msg_p).CC_id);
+ break;
+
/* Messages from PDCP */
+ case NR_RRC_DCCH_DATA_IND:
+ // PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
+ // instance,
+ // ENB_FLAG_YES,
+ // RRC_DCCH_DATA_IND(msg_p).rnti,
+ // msg_p->ittiMsgHeader.lte_time.frame,
+ // msg_p->ittiMsgHeader.lte_time.slot);
+ LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Received on DCCH %d %s\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),
+ NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
+ msg_name_p);
+ rrc_gNB_decode_dcch(&ctxt,
+ NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
+ NR_RRC_DCCH_DATA_IND(msg_p).sdu_p,
+ NR_RRC_DCCH_DATA_IND(msg_p).sdu_size);
+ break;
/*
#if defined(ENABLE_USE_MME)
@@ -437,6 +1411,9 @@ void *rrc_gnb_task(void *args_p) {
LOG_I(NR_RRC, "Handling of reconfiguration complete message at RRC gNB is pending \n");
break;
+ case NGAP_INITIAL_CONTEXT_SETUP_REQ:
+ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p, msg_name_p, instance);
+
case X2AP_ENDC_SGNB_RELEASE_REQUEST:
LOG_I(NR_RRC, "Received ENDC sgNB release request from X2AP \n");
rrc_gNB_process_release_request(GNB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_RELEASE_REQUEST(msg_p));
@@ -462,6 +1439,186 @@ void *rrc_gnb_task(void *args_p) {
}
}
+//-----------------------------------------------------------------------------
+void
+rrc_gNB_generate_SecurityModeCommand(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ uint8_t buffer[100];
+ uint8_t size;
+ T(T_ENB_RRC_SECURITY_MODE_COMMAND, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
+ T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
+ NR_IntegrityProtAlgorithm_t integrity_algorithm = (NR_IntegrityProtAlgorithm_t)ue_context_pP->ue_context.integrity_algorithm;
+ size = do_NR_SecurityModeCommand(
+ ctxt_pP,
+ buffer,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
+ ue_context_pP->ue_context.ciphering_algorithm,
+ &integrity_algorithm);
+ LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Security Mode Command\n");
+ LOG_I(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate SecurityModeCommand (bytes %d)\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size);
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" --- PDCP_DATA_REQ/%d Bytes (securityModeCommand to UE MUI %d) --->[PDCP][RB %02d]\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size,
+ rrc_gNB_mui,
+ DCCH);
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ size,
+ MSC_AS_TIME_FMT" securityModeCommand UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ size);
+
+ LOG_I(NR_RRC,"calling rrc_data_req :securityModeCommand\n");
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM,size);
+ memcpy (message_buffer, buffer, size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, GNB_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#else
+ nr_rrc_data_req(ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+
+}
+
+void
+rrc_gNB_generate_UECapabilityEnquiry(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ uint8_t buffer[100];
+ uint8_t size;
+ T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
+ T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
+ size = do_NR_SA_UECapabilityEnquiry(
+ ctxt_pP,
+ buffer,
+ rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id));
+ LOG_I(RRC,
+ PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate NR UECapabilityEnquiry (bytes %d)\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size);
+ LOG_D(RRC,
+ PROTOCOL_RRC_CTXT_UE_FMT" --- PDCP_DATA_REQ/%d Bytes (NR UECapabilityEnquiry MUI %d) --->[PDCP][RB %02d]\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size,
+ rrc_gNB_mui,
+ DCCH);
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ size,
+ MSC_AS_TIME_FMT" rrcNRUECapabilityEnquiry UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ size);
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM, size);
+ memcpy (message_buffer, buffer, size);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, GNB_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
+#else
+ nr_rrc_data_req(
+ ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+}
+
+//-----------------------------------------------------------------------------
+/*
+* Generate the RRC Connection Release to UE.
+* If received, UE should switch to RRC_IDLE mode.
+*/
+void
+rrc_gNB_generate_RRCConnectionRelease(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ uint8_t buffer[RRC_BUF_SIZE];
+ uint16_t size = 0;
+
+ memset(buffer, 0, RRC_BUF_SIZE);
+
+ size = do_NR_RRCConnectionRelease(buffer,rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id));
+ ue_context_pP->ue_context.ue_reestablishment_timer = 0;
+ ue_context_pP->ue_context.ue_release_timer = 0;
+ LOG_I(NR_RRC,
+ PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate RRCConnectionRelease (bytes %d)\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size);
+ LOG_D(NR_RRC,
+ PROTOCOL_RRC_CTXT_UE_FMT" --- PDCP_DATA_REQ/%d Bytes (rrcConnectionRelease MUI %d) --->[PDCP][RB %u]\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
+ size,
+ rrc_gNB_mui,
+ DCCH);
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_RRC_UE,
+ buffer,
+ size,
+ MSC_AS_TIME_FMT" LTE_RRCConnectionRelease UE %x MUI %d size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_context.rnti,
+ rrc_gNB_mui,
+ size);
+
+ if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
+ MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD);
+ F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti;
+ F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK;
+ F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
+ F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = buffer;
+ F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = size;
+ itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m);
+ } else {
+ nr_rrc_data_req(ctxt_pP,
+ DCCH,
+ rrc_gNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+ }
+}
void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe)
{
MessageDef *message_p;
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
new file mode 100644
index 0000000000..1d0cfef89c
--- /dev/null
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -0,0 +1,484 @@
+/*
+ * 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_gNB_NGAP.h
+ * \brief rrc NGAP procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#include "rrc_gNB_NGAP.h"
+#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
+#include "rrc_eNB_S1AP.h"
+#include "gnb_config.h"
+#include "common/ran_context.h"
+#include "gtpv1u.h"
+
+#include "asn1_conversions.h"
+#include "intertask_interface.h"
+#include "pdcp.h"
+#include "pdcp_primitives.h"
+
+#include "msc.h"
+
+#include "gtpv1u_eNB_task.h"
+#include "RRC/LTE/rrc_eNB_GTPV1U.h"
+
+#include "S1AP_NAS-PDU.h"
+#include "executables/softmodem-common.h"
+#include "UTIL/OSA/osa_defs.h"
+
+extern RAN_CONTEXT_t RC;
+
+/* Value to indicate an invalid UE initial id */
+static const uint16_t UE_INITIAL_ID_INVALID = 0;
+
+/*! \fn uint16_t get_next_ue_initial_id(uint8_t mod_id)
+ *\brief provide an UE initial ID for NGAP initial communication.
+ *\param mod_id Instance ID of gNB.
+ *\return the UE initial ID.
+ */
+//------------------------------------------------------------------------------
+static uint16_t
+get_next_ue_initial_id(
+ const module_id_t mod_id
+)
+//------------------------------------------------------------------------------
+{
+ static uint16_t ue_initial_id[NUMBER_OF_gNB_MAX];
+ ue_initial_id[mod_id]++;
+
+ /* Never use UE_INITIAL_ID_INVALID this is the invalid id! */
+ if (ue_initial_id[mod_id] == UE_INITIAL_ID_INVALID) {
+ ue_initial_id[mod_id]++;
+ }
+
+ return ue_initial_id[mod_id];
+}
+
+//------------------------------------------------------------------------------
+/*
+* Get the UE NG struct containing hashtables NG_id/UE_id.
+* Is also used to set the NG_id of the UE, depending on inputs.
+*/
+struct rrc_ue_ngap_ids_s *
+rrc_gNB_NGAP_get_ue_ids(
+ gNB_RRC_INST *const rrc_instance_pP,
+ const uint16_t ue_initial_id,
+ const uint32_t gNB_ue_ngap_idP
+)
+//------------------------------------------------------------------------------
+{
+ rrc_ue_ngap_ids_t *result = NULL;
+
+ /* TODO */
+
+ return result;
+}
+
+//------------------------------------------------------------------------------
+static struct rrc_gNB_ue_context_s *
+rrc_gNB_get_ue_context_from_ngap_ids(
+ const instance_t instanceP,
+ const uint16_t ue_initial_idP,
+ const uint32_t gNB_ue_ngap_idP
+)
+//------------------------------------------------------------------------------
+{
+ rrc_ue_ngap_ids_t *temp = NULL;
+ temp = rrc_gNB_NGAP_get_ue_ids(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], ue_initial_idP, gNB_ue_ngap_idP);
+
+ if (temp != NULL) {
+ return rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti);
+ }
+
+ return NULL;
+}
+
+//------------------------------------------------------------------------------
+void
+nr_rrc_pdcp_config_security(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ const uint8_t send_security_mode_command
+)
+//------------------------------------------------------------------------------
+{
+ NR_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList;
+ (void)SRB_configList;
+ uint8_t *kRRCenc = NULL;
+ uint8_t *kRRCint = NULL;
+ uint8_t *kUPenc = NULL;
+ pdcp_t *pdcp_p = NULL;
+ static int print_keys= 1;
+ hashtable_rc_t h_rc;
+ hash_key_t key;
+
+#ifndef PHYSIM
+ /* Derive the keys from kgnb */
+ if (SRB_configList != NULL) {
+ derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kUPenc);
+ }
+
+ derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kRRCenc);
+ derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
+ ue_context_pP->ue_context.kgnb,
+ &kRRCint);
+#endif
+ if (!IS_SOFTMODEM_IQPLAYER) {
+ SET_LOG_DUMP(DEBUG_SECURITY) ;
+ }
+
+
+ if ( LOG_DUMPFLAG( DEBUG_SECURITY ) ) {
+ if (print_keys == 1 ) {
+ print_keys =0;
+ LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, ue_context_pP->ue_context.kgnb, 32,"\nKgNB:" );
+ LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCenc, 32,"\nKRRCenc:" );
+ LOG_DUMPMSG(NR_RRC, DEBUG_SECURITY, kRRCint, 32,"\nKRRCint:" );
+ }
+ }
+
+ key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES);
+ h_rc = hashtable_get(pdcp_coll_p, key, (void **)&pdcp_p);
+
+ if (h_rc == HASH_TABLE_OK) {
+ pdcp_config_set_security(
+ ctxt_pP,
+ pdcp_p,
+ DCCH,
+ DCCH+2,
+ (send_security_mode_command == TRUE) ?
+ 0 | (ue_context_pP->ue_context.integrity_algorithm << 4) :
+ (ue_context_pP->ue_context.ciphering_algorithm ) |
+ (ue_context_pP->ue_context.integrity_algorithm << 4),
+ kRRCenc,
+ kRRCint,
+ kUPenc);
+ } else {
+ LOG_E(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT"Could not get PDCP instance for SRB DCCH %u\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH);
+ }
+}
+
+//------------------------------------------------------------------------------
+/*
+* Initial UE NAS message on S1AP.
+*/
+void
+rrc_gNB_send_NGAP_NAS_FIRST_REQ(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP,
+ NR_RRCSetupComplete_IEs_t *rrcSetupComplete
+)
+//------------------------------------------------------------------------------
+{
+ // gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
+ MessageDef *message_p = NULL;
+ rrc_ue_ngap_ids_t *rrc_ue_ngap_ids_p = NULL;
+ // hashtable_rc_t h_rc;
+
+ message_p = itti_alloc_new_message(TASK_RRC_GNB, NGAP_NAS_FIRST_REQ);
+ memset(&message_p->ittiMsg.ngap_nas_first_req, 0, sizeof(ngap_nas_first_req_t));
+ ue_context_pP->ue_context.ue_initial_id = get_next_ue_initial_id(ctxt_pP->module_id);
+ NGAP_NAS_FIRST_REQ(message_p).ue_initial_id = ue_context_pP->ue_context.ue_initial_id;
+ rrc_ue_ngap_ids_p = malloc(sizeof(rrc_ue_ngap_ids_t));
+ rrc_ue_ngap_ids_p->ue_initial_id = ue_context_pP->ue_context.ue_initial_id;
+ rrc_ue_ngap_ids_p->gNB_ue_ngap_id = UE_INITIAL_ID_INVALID;
+ rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rnti;
+
+ // h_rc = hashtable_insert(RC.nrrrc[ctxt_pP->module_id]->initial_id2_s1ap_ids,
+ // (hash_key_t)ue_context_pP->ue_context.ue_initial_id,
+ // rrc_ue_s1ap_ids_p);
+
+ // if (h_rc != HASH_TABLE_OK) {
+ // LOG_E(S1AP, "[eNB %d] Error while hashtable_insert in initial_id2_s1ap_ids ue_initial_id %u\n",
+ // ctxt_pP->module_id,
+ // ue_context_pP->ue_context.ue_initial_id);
+ // }
+
+ /* Assume that cause is coded in the same way in RRC and NGap, just check that the value is in NGap range */
+ AssertFatal(ue_context_pP->ue_context.establishment_cause < NGAP_RRC_CAUSE_LAST,
+ "Establishment cause invalid (%jd/%d) for gNB %d!",
+ ue_context_pP->ue_context.establishment_cause,
+ NGAP_RRC_CAUSE_LAST,
+ ctxt_pP->module_id);
+ NGAP_NAS_FIRST_REQ(message_p).establishment_cause = ue_context_pP->ue_context.establishment_cause;
+
+ /* Forward NAS message */
+ NGAP_NAS_FIRST_REQ(message_p).nas_pdu.buffer = rrcSetupComplete->dedicatedNAS_Message.buf;
+ NGAP_NAS_FIRST_REQ(message_p).nas_pdu.length = rrcSetupComplete->dedicatedNAS_Message.size;
+ // extract_imsi(NGAP_NAS_FIRST_REQ (message_p).nas_pdu.buffer,
+ // NGAP_NAS_FIRST_REQ (message_p).nas_pdu.length,
+ // ue_context_pP);
+
+ /* Fill UE identities with available information */
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.presenceMask = NGAP_UE_IDENTITIES_NONE;
+ /* Fill s-TMSI */
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.s_tmsi.amf_set_id = ue_context_pP->ue_context.Initialue_identity_5g_s_TMSI.amf_set_id;
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.s_tmsi.amf_pointer = ue_context_pP->ue_context.Initialue_identity_5g_s_TMSI.amf_pointer;
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.s_tmsi.m_tmsi = ue_context_pP->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi;
+
+ /* selected_plmn_identity: IE is 1-based, convert to 0-based (C array) */
+ int selected_plmn_identity = rrcSetupComplete->selectedPLMN_Identity - 1;
+ NGAP_NAS_FIRST_REQ(message_p).selected_plmn_identity = selected_plmn_identity;
+
+ if (rrcSetupComplete->registeredAMF != NULL) {
+ NR_RegisteredAMF_t *r_amf = rrcSetupComplete->registeredAMF;
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.presenceMask |= NGAP_UE_IDENTITIES_guami;
+
+ if (r_amf->plmn_Identity != NULL) {
+ if ((r_amf->plmn_Identity->mcc != NULL) && (r_amf->plmn_Identity->mcc->list.count > 0)) {
+ /* Use first indicated PLMN MCC if it is defined */
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mcc = *r_amf->plmn_Identity->mcc->list.array[selected_plmn_identity];
+ LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x\n",
+ ctxt_pP->module_id,
+ NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mcc,
+ ue_context_pP->ue_context.rnti);
+ }
+
+ if (r_amf->plmn_Identity->mnc.list.count > 0) {
+ /* Use first indicated PLMN MNC if it is defined */
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc = *r_amf->plmn_Identity->mnc.list.array[selected_plmn_identity];
+ LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x\n",
+ ctxt_pP->module_id,
+ NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mnc,
+ ue_context_pP->ue_context.rnti);
+ }
+ } else {
+ /* TODO */
+ }
+
+ /* amf_Identifier */
+ uint32_t amf_Id = BIT_STRING_to_uint32(&r_amf->amf_Identifier);
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_region_id = amf_Id >> 16;
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_set_id = ue_context_pP->ue_context.Initialue_identity_5g_s_TMSI.amf_set_id;
+ NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_pointer = ue_context_pP->ue_context.Initialue_identity_5g_s_TMSI.amf_pointer;
+
+ ue_context_pP->ue_context.ue_guami.mcc = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mcc;
+ ue_context_pP->ue_context.ue_guami.mnc = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc;
+ ue_context_pP->ue_context.ue_guami.mnc_len = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc_len;
+ ue_context_pP->ue_context.ue_guami.amf_region_id = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_region_id;
+ ue_context_pP->ue_context.ue_guami.amf_set_id = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_set_id;
+ ue_context_pP->ue_context.ue_guami.amf_pointer = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_pointer;
+
+ MSC_LOG_TX_MESSAGE(MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)&message_p->ittiMsg.ngap_nas_first_req,
+ sizeof(ngap_nas_first_req_t),
+ MSC_AS_TIME_FMT" NGAP_NAS_FIRST_REQ gNB %u UE %x",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ctxt_pP->module_id,
+ ctxt_pP->rnti);
+ LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x\n",
+ ctxt_pP->module_id,
+ NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_set_id,
+ NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_region_id,
+ ue_context_pP->ue_context.rnti);
+ }
+
+ itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, message_p);
+}
+
+//------------------------------------------------------------------------------
+int
+rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
+ MessageDef *msg_p,
+ const char *msg_name,
+ instance_t instance
+)
+//------------------------------------------------------------------------------
+{
+ uint16_t ue_initial_id;
+ uint32_t gNB_ue_ngap_id;
+ rrc_gNB_ue_context_t *ue_context_p = NULL;
+ protocol_ctxt_t ctxt;
+
+ ue_initial_id = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_initial_id;
+ gNB_ue_ngap_id = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).gNB_ue_ngap_id;
+
+ ue_context_p = rrc_gNB_get_ue_context_from_ngap_ids(instance, ue_initial_id, gNB_ue_ngap_id);
+ LOG_I(NR_RRC, "[gNB %d] Received %s: ue_initial_id %d, gNB_ue_ngap_id %d \n",
+ instance, msg_name, ue_initial_id, gNB_ue_ngap_id);
+
+ if (ue_context_p == NULL) {
+ /* Can not associate this message to an UE index, send a failure to NGAP and discard it! */
+ MessageDef *msg_fail_p = NULL;
+ LOG_W(NR_RRC, "[gNB %d] In NGAP_INITIAL_CONTEXT_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, gNB_ue_ngap_id);
+ msg_fail_p = itti_alloc_new_message (TASK_RRC_GNB, NGAP_INITIAL_CONTEXT_SETUP_FAIL);
+ NGAP_INITIAL_CONTEXT_SETUP_FAIL (msg_fail_p).gNB_ue_ngap_id = gNB_ue_ngap_id;
+ // TODO add failure cause when defined!
+ itti_send_msg_to_task (TASK_NGAP, instance, msg_fail_p);
+ return (-1);
+ } else {
+ PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0);
+ ue_context_p->ue_context.gNB_ue_ngap_id = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).gNB_ue_ngap_id;
+ ue_context_p->ue_context.amf_ue_ngap_id = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).amf_ue_ngap_id;
+
+ /* NAS PDU */
+ if (ue_context_p->ue_context.nas_pdu_flag == 1) {
+ ue_context_p->ue_context.nas_pdu.length = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.length;
+ ue_context_p->ue_context.nas_pdu.buffer = NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).nas_pdu.buffer;
+ }
+
+ /* TODO security */
+ rrc_gNB_process_security(&ctxt, ue_context_p, &(NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_capabilities));
+
+ uint8_t send_security_mode_command = TRUE;
+
+ nr_rrc_pdcp_config_security(
+ &ctxt,
+ ue_context_p,
+ send_security_mode_command);
+
+ if (send_security_mode_command) {
+ rrc_gNB_generate_SecurityModeCommand (&ctxt, ue_context_p);
+ send_security_mode_command = FALSE;
+
+ nr_rrc_pdcp_config_security(
+ &ctxt,
+ ue_context_p,
+ send_security_mode_command);
+ } else {
+ /* rrc_gNB_generate_UECapabilityEnquiry */
+ rrc_gNB_generate_UECapabilityEnquiry(&ctxt, ue_context_p);
+ }
+
+ // in case, send the S1SP initial context response if it is not sent with the attach complete message
+ if (ue_context_p->ue_context.Status == NR_RRC_RECONFIGURED) {
+ LOG_I(NR_RRC, "Sending rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP, cause %ld\n", ue_context_p->ue_context.reestablishment_cause);
+ rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(&ctxt,ue_context_p);
+ }
+
+ return 0;
+ }
+}
+
+//------------------------------------------------------------------------------
+void
+rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+)
+//------------------------------------------------------------------------------
+{
+ MessageDef *msg_p = NULL;
+ int e_rab;
+ int e_rabs_done = 0;
+ int e_rabs_failed = 0;
+ msg_p = itti_alloc_new_message (TASK_RRC_ENB, NGAP_INITIAL_CONTEXT_SETUP_RESP);
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).gNB_ue_ngap_id = ue_context_pP->ue_context.gNB_ue_ngap_id;
+
+ for (e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_e_rabs; e_rab++) {
+ if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) {
+ e_rabs_done++;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[e_rab].pdusession_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id;
+ // TODO add other information from S1-U when it will be integrated
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[e_rab].gtp_teid = ue_context_pP->ue_context.gnb_gtp_teid[e_rab];
+ memcpy(NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[e_rab].gNB_addr.buffer , ue_context_pP->ue_context.gnb_gtp_addrs[e_rab].buffer, 20);
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions[e_rab].gNB_addr.length = 4;
+ ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED;
+ } else {
+ e_rabs_failed++;
+ ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).pdusessions_failed[e_rab].pdusession_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id;
+ // TODO add cause when it will be integrated
+ }
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_GNB,
+ MSC_S1AP_ENB,
+ (const char *)&NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p),
+ sizeof(ngap_initial_context_setup_resp_t),
+ MSC_AS_TIME_FMT" INITIAL_CONTEXT_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_pP->ue_id_rnti,
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).gNB_ue_ngap_id,
+ e_rabs_done, e_rabs_failed);
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions = e_rabs_done;
+ NGAP_INITIAL_CONTEXT_SETUP_RESP (msg_p).nb_of_pdusessions_failed = e_rabs_failed;
+ itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, msg_p);
+}
+
+static NR_CipheringAlgorithm_t rrc_gNB_select_ciphering(uint16_t algorithms) {
+ //#warning "Forced return NR_CipheringAlgorithm_nea0, to be deleted in future"
+ return NR_CipheringAlgorithm_nea0;
+}
+
+static e_NR_IntegrityProtAlgorithm rrc_gNB_select_integrity(uint16_t algorithms) {
+
+ // to be continue
+ return NR_IntegrityProtAlgorithm_nia0;
+}
+
+int
+rrc_gNB_process_security(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ ngap_security_capabilities_t *security_capabilities_pP
+) {
+ boolean_t changed = FALSE;
+ NR_CipheringAlgorithm_t cipheringAlgorithm;
+ e_NR_IntegrityProtAlgorithm integrityProtAlgorithm;
+ /* Save security parameters */
+ ue_context_pP->ue_context.security_capabilities = *security_capabilities_pP;
+ // translation
+ LOG_D(NR_RRC,
+ "[eNB %d] NAS security_capabilities.encryption_algorithms %u AS ciphering_algorithm %lu NAS security_capabilities.integrity_algorithms %u AS integrity_algorithm %u\n",
+ ctxt_pP->module_id,
+ ue_context_pP->ue_context.security_capabilities.nRencryption_algorithms,
+ (unsigned long)ue_context_pP->ue_context.ciphering_algorithm,
+ ue_context_pP->ue_context.security_capabilities.nRintegrity_algorithms,
+ ue_context_pP->ue_context.integrity_algorithm);
+ /* Select relevant algorithms */
+ cipheringAlgorithm = rrc_gNB_select_ciphering (ue_context_pP->ue_context.security_capabilities.nRencryption_algorithms);
+
+ if (ue_context_pP->ue_context.ciphering_algorithm != cipheringAlgorithm) {
+ ue_context_pP->ue_context.ciphering_algorithm = cipheringAlgorithm;
+ changed = TRUE;
+ }
+
+ integrityProtAlgorithm = rrc_gNB_select_integrity (ue_context_pP->ue_context.security_capabilities.nRintegrity_algorithms);
+
+ if (ue_context_pP->ue_context.integrity_algorithm != integrityProtAlgorithm) {
+ ue_context_pP->ue_context.integrity_algorithm = integrityProtAlgorithm;
+ changed = TRUE;
+ }
+
+ LOG_I (NR_RRC, "[eNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n",
+ ctxt_pP->module_id,
+ ue_context_pP->ue_context.rnti,
+ security_capabilities_pP,
+ (unsigned long)cipheringAlgorithm,
+ integrityProtAlgorithm,
+ changed ? "changed" : "same");
+ return changed;
+}
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h
new file mode 100644
index 0000000000..5fb1a9f0d9
--- /dev/null
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.h
@@ -0,0 +1,80 @@
+/*
+ * 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_gNB_NGAP.h
+ * \brief rrc NGAP procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#ifndef RRC_GNB_NGAP_H_
+#define RRC_GNB_NGAP_H_
+
+#include "rrc_gNB_UE_context.h"
+#include "nr_rrc_defs.h"
+#include "nr_rrc_extern.h"
+
+#include "NR_RRCSetupComplete-IEs.h"
+#include "NR_RegisteredAMF.h"
+
+typedef struct rrc_ue_ngap_ids_s {
+ /* Tree related data */
+ RB_ENTRY(rrc_ue_ngap_ids_s) entries;
+
+ // keys
+ uint16_t ue_initial_id;
+ uint32_t gNB_ue_ngap_id;
+
+ // value
+ rnti_t ue_rnti;
+} rrc_ue_ngap_ids_t;
+
+void
+rrc_gNB_send_NGAP_NAS_FIRST_REQ(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *ue_context_pP,
+ NR_RRCSetupComplete_IEs_t *rrcSetupComplete
+);
+
+int
+rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
+ MessageDef *msg_p,
+ const char *msg_name,
+ instance_t instance
+);
+
+void
+rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP
+);
+
+int
+rrc_gNB_process_security(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ ngap_security_capabilities_t *security_capabilities_pP
+);
+
+#endif
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.c b/openair2/RRC/NR/rrc_gNB_UE_context.c
index b5fb50f509..4db5eb2029 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.c
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.c
@@ -189,7 +189,7 @@ void rrc_gNB_free_mem_UE_context(
//------------------------------------------------------------------------------
void rrc_gNB_remove_ue_context(
- const protocol_ctxt_t *const ctxt_pP,
+ const protocol_ctxt_t *const ctxt_pP,
gNB_RRC_INST *rrc_instance_pP,
struct rrc_gNB_ue_context_s *ue_context_pP)
//------------------------------------------------------------------------------
@@ -220,4 +220,82 @@ void rrc_gNB_remove_ue_context(
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
}
+//-----------------------------------------------------------------------------
+// return the ue context if there is already an UE with ue_identityP, NULL otherwise
+struct rrc_gNB_ue_context_s *
+rrc_gNB_ue_context_random_exist(
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t ue_identityP
+)
+//-----------------------------------------------------------------------------
+{
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head) {
+ if (ue_context_p->ue_context.random_ue_identity == ue_identityP)
+ return ue_context_p;
+ }
+ return NULL;
+}
+//-----------------------------------------------------------------------------
+// return the ue context if there is already an UE with the same S-TMSI, NULL otherwise
+struct rrc_gNB_ue_context_s *
+rrc_gNB_ue_context_5g_s_tmsi_exist(
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t s_TMSI
+)
+//-----------------------------------------------------------------------------
+{
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head) {
+ LOG_I(NR_RRC,"checking for UE 5G S-TMSI %ld: rnti %d \n",
+ s_TMSI, ue_context_p->ue_context.rnti);
+
+ if (ue_context_p->ue_context.ng_5G_S_TMSI_Part1 == s_TMSI) {
+ return ue_context_p;
+ }
+ }
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// return a new ue context structure if ue_identityP, ctxt_pP->rnti not found in collection
+struct rrc_gNB_ue_context_s *
+rrc_gNB_get_next_free_ue_context(
+ const protocol_ctxt_t *const ctxt_pP,
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t ue_identityP
+)
+//-----------------------------------------------------------------------------
+{
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+ ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, ctxt_pP->rnti);
+
+ if (ue_context_p == NULL) {
+ ue_context_p = rrc_gNB_allocate_new_UE_context(rrc_instance_pP);
+
+ if (ue_context_p == NULL) {
+ LOG_E(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" Cannot create new UE context, no memory\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ return NULL;
+ }
+
+ ue_context_p->ue_id_rnti = ctxt_pP->rnti; // here ue_id_rnti is just a key, may be something else
+ ue_context_p->ue_context.rnti = ctxt_pP->rnti; // yes duplicate, 1 may be removed
+ ue_context_p->ue_context.random_ue_identity = ue_identityP;
+ RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
+ LOG_D(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" Created new UE context uid %u\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
+ ue_context_p->local_uid);
+ return ue_context_p;
+ } else {
+ LOG_E(NR_RRC,
+ PROTOCOL_NR_RRC_CTXT_UE_FMT" Cannot create new UE context, already exist\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
+ return NULL;
+ }
+
+ return(ue_context_p);
+}
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.h b/openair2/RRC/NR/rrc_gNB_UE_context.h
index d703c4c34c..73bd93e737 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.h
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.h
@@ -73,10 +73,34 @@ rrc_gNB_get_ue_context(
rnti_t rntiP
);
+void rrc_gNB_free_mem_UE_context(
+ const protocol_ctxt_t *const ctxt_pP,
+ struct rrc_gNB_ue_context_s *const ue_context_pP
+);
+
void rrc_gNB_remove_ue_context(
const protocol_ctxt_t* const ctxt_pP,
gNB_RRC_INST* rrc_instance_pP,
struct rrc_gNB_ue_context_s* ue_context_pP
);
+struct rrc_gNB_ue_context_s *
+rrc_gNB_ue_context_random_exist(
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t ue_identityP
+);
+
+struct rrc_gNB_ue_context_s *
+rrc_gNB_ue_context_5g_s_tmsi_exist(
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t s_TMSI
+);
+
+struct rrc_gNB_ue_context_s *
+rrc_gNB_get_next_free_ue_context(
+ const protocol_ctxt_t *const ctxt_pP,
+ gNB_RRC_INST *rrc_instance_pP,
+ const uint64_t ue_identityP
+);
+
#endif
diff --git a/openair2/RRC/NR/rrc_gNB_internode.c b/openair2/RRC/NR/rrc_gNB_internode.c
index cacff5cf5c..3c8d75edfa 100644
--- a/openair2/RRC/NR/rrc_gNB_internode.c
+++ b/openair2/RRC/NR/rrc_gNB_internode.c
@@ -37,6 +37,7 @@
#include "NR_UE-CapabilityRAT-ContainerList.h"
#include "LTE_UE-CapabilityRAT-ContainerList.h"
#include "NR_CG-Config.h"
+#include "executables/softmodem-common.h"
int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m) {
if (CG_ConfigInfo->criticalExtensions.present == NR_CG_ConfigInfo__criticalExtensions_PR_c1) {
@@ -95,33 +96,48 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
(const char *)buffer,
(enc_rval.encoded+7)>>3);
total_size = (enc_rval.encoded+7)>>3;
- LOG_I(RRC,"Dumping NR_RRCReconfiguration message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
- for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
- printf("%02x",((uint8_t *)buffer)[i]);
+ FILE *fd; // file to be generated for nr-ue
+ if (get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra > 0) {
+ // This is for phytest only, emulate first X2 message if uecap.raw file is present
+ LOG_I(RRC,"Dumping NR_RRCReconfiguration message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
+ for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
+ printf("%02x",((uint8_t *)buffer)[i]);
+ }
+ printf("\n");
+ fd = fopen("reconfig.raw","w");
+ if (fd != NULL) {
+ fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ }
+ fclose(fd);
}
-
- printf("\n");
- FILE *fd = fopen("reconfig.raw","w");
- fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
- fclose(fd);
+
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_RadioBearerConfig, NULL, (void *)rbconfig, buffer, 1024);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
- enc_rval.failed_type->name, enc_rval.encoded);
+ enc_rval.failed_type->name, enc_rval.encoded);
cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config = calloc(1,sizeof(OCTET_STRING_t));
+
OCTET_STRING_fromBuf(cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config,
- (const char *)buffer,
- (enc_rval.encoded+7)>>3);
- LOG_I(RRC,"Dumping scg_RB_Config message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
+ (const char *)buffer,
+ (enc_rval.encoded+7)>>3);
- for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
- printf("%02x",((uint8_t *)buffer)[i]);
+
+
+ if (get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra > 0) {
+
+ LOG_I(RRC,"Dumping scg_RB_Config message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
+ for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
+ printf("%02x",((uint8_t *)buffer)[i]);
+ }
+
+ printf("\n");
+ fd = fopen("rbconfig.raw","w");
+ if (fd != NULL) {
+ fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ }
+ fclose(fd);
}
-
- printf("\n");
- fd = fopen("rbconfig.raw","w");
- fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
- fclose(fd);
+
total_size = total_size + ((enc_rval.encoded+7)>>3);
return(total_size);
}
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 9c54a6b31c..1c11e9f886 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -235,7 +235,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n310 = NR_RLF_TimersAndConstants__n310_n10;
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n311 = NR_RLF_TimersAndConstants__n311_n1;
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
- secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311_v1530 = NR_RLF_TimersAndConstants__ext1__t311_v1530_ms30000;
+ secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000;
secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
@@ -921,7 +921,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0);
*pucchresset0id1=2;
ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id1);
- pucchresset0->maxPayloadMinus1=NULL;
+ pucchresset0->maxPayloadSize=NULL;
ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0);
@@ -932,7 +932,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0);
*pucchresset1id1=4;
ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id1);
- pucchresset1->maxPayloadMinus1=NULL;
+ pucchresset1->maxPayloadSize=NULL;
ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1);
pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList));
@@ -1272,5 +1272,37 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig) {
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig);
}
+/* Function to set or overwrite PTRS DL RRC parameters */
+void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset)
+{
+ int i=0;
+ /* check for memory allocation */
+ if(bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS == NULL) {
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup= calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = calloc(1,sizeof(long));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = calloc(1,sizeof(long));
+ /* Fill the given values */
+ for(i = 0; i < 2; i++) {
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list,&ptrsNrb[i]);
+ }
+ for(i = 0; i < 3; i++) {
+ ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list,&ptrsMcs[i]);
+ }
+ }// if memory exist then over write the old values
+ else {
+ for(i = 0; i < 2; i++) {
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] = ptrsNrb[i];
+ }
+ for(i = 0; i < 3; i++) {
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] = ptrsMcs[i];
+ }
+ }
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = *epre_Ratio;
+ *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = *reOffset;
+}
#endif
diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c
index 08976522b0..44d50dd0ef 100644
--- a/openair2/RRC/NR_UE/L2_interface_ue.c
+++ b/openair2/RRC/NR_UE/L2_interface_ue.c
@@ -67,4 +67,43 @@ int8_t mac_rrc_nr_data_req_ue(const module_id_t Mod_idP,
// todo
return 0;
-}
\ No newline at end of file
+}
+
+uint8_t
+rrc_data_req_ue(
+ const protocol_ctxt_t *const ctxt_pP,
+ const rb_id_t rb_idP,
+ const mui_t muiP,
+ const confirm_t confirmP,
+ const sdu_size_t sdu_sizeP,
+ uint8_t *const buffer_pP,
+ const pdcp_transmission_mode_t modeP
+)
+{
+ MessageDef *message_p;
+ // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (
+ ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE,
+ ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
+ sdu_sizeP);
+ memcpy (message_buffer, buffer_pP, sdu_sizeP);
+ message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
+ RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
+ RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
+ RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
+ RRC_DCCH_DATA_REQ (message_p).muip = muiP;
+ RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
+ RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
+ RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
+ RRC_DCCH_DATA_REQ (message_p).mode = modeP;
+ RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
+ RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti;
+ RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
+ itti_send_msg_to_task (
+ TASK_PDCP_UE,
+ ctxt_pP->instance,
+ message_p);
+ return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
+
+}
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 1e182eff8b..4fcd0db1b5 100755
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -33,10 +33,17 @@
#define RRC_UE
#define RRC_UE_C
-#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
-#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
-#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
-#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
+#include "asn1_conversions.h"
+
+#include "NR_DL-DCCH-Message.h" //asn_DEF_NR_DL_DCCH_Message
+#include "NR_DL-CCCH-Message.h" //asn_DEF_NR_DL_CCCH_Message
+#include "NR_BCCH-BCH-Message.h" //asn_DEF_NR_BCCH_BCH_Message
+#include "NR_BCCH-DL-SCH-Message.h" //asn_DEF_NR_BCCH_DL_SCH_Message
+#include "NR_CellGroupConfig.h" //asn_DEF_NR_CellGroupConfig
+#include "NR_BWP-Downlink.h" //asn_DEF_NR_BWP_Downlink
+#include "NR_RRCReconfiguration.h"
+#include "NR_MeasConfig.h"
+#include "NR_UL-DCCH-Message.h"
#include "rrc_list.h"
#include "rrc_defs.h"
@@ -44,11 +51,148 @@
#include "rrc_vars.h"
#include "LAYER2/NR_MAC_UE/mac_proto.h"
-#include "executables/softmodem-common.h"
+#include "intertask_interface.h"
+#include "executables/softmodem-common.h"
+#include "plmn_data.h"
+#include "pdcp.h"
+#include "UTIL/OSA/osa_defs.h"
+#include "common/utils/LOG/log.h"
+#include "common/utils/LOG/vcd_signal_dumper.h"
+
+#ifndef CELLULAR
+ #include "RRC/NR/MESSAGES/asn1_msg.h"
+#endif
+
+#include "RRC/NAS/nas_config.h"
+#include "RRC/NAS/rb_config.h"
+#include "SIMULATION/TOOLS/sim.h" // for taus
+
+#if ITTI_SIM
+#include "nr_nas_msg_sim.h"
+#endif
+
+/* NAS Attach request with IMSI */
+static const char nr_nas_attach_req_imsi[] = {
+ 0x07, 0x41,
+ /* EPS Mobile identity = IMSI */
+ 0x71, 0x08, 0x29, 0x80, 0x43, 0x21, 0x43, 0x65, 0x87,
+ 0xF9,
+ /* End of EPS Mobile Identity */
+ 0x02, 0xE0, 0xE0, 0x00, 0x20, 0x02, 0x03,
+ 0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00,
+ 0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2,
+ 0x01, 0x27, 0x11,
+};
+
+extern void pdcp_config_set_security(
+ const protocol_ctxt_t *const ctxt_pP,
+ pdcp_t *const pdcp_pP,
+ const rb_id_t rb_idP,
+ const uint16_t lc_idP,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc,
+ uint8_t *const kRRCint,
+ uint8_t *const kUPenc
+);
+
+void
+nr_rrc_ue_process_ueCapabilityEnquiry(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_UECapabilityEnquiry_t *UECapabilityEnquiry,
+ uint8_t gNB_index
+);
+
+void
+nr_sa_rrc_ue_process_radioBearerConfig(
+ const protocol_ctxt_t *const ctxt_pP,
+ const uint8_t gNB_index,
+ NR_RadioBearerConfig_t *const radioBearerConfig
+);
+
+uint8_t do_NR_RRCReconfigurationComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t *buffer,
+ const uint8_t Transaction_id
+ );
+
+mui_t nr_rrc_mui=0;
+
+static Rrc_State_NR_t nr_rrc_get_state (module_id_t ue_mod_idP) {
+ return NR_UE_rrc_inst[ue_mod_idP].nrRrcState;
+}
+
+
+static Rrc_Sub_State_NR_t nr_rrc_get_sub_state (module_id_t ue_mod_idP) {
+ return NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState;
+}
+
+static int nr_rrc_set_state (module_id_t ue_mod_idP, Rrc_State_NR_t state) {
+ AssertFatal ((RRC_STATE_FIRST_NR <= state) && (state <= RRC_STATE_LAST_NR),
+ "Invalid state %d!\n", state);
+
+ if (NR_UE_rrc_inst[ue_mod_idP].nrRrcState != state) {
+ NR_UE_rrc_inst[ue_mod_idP].nrRrcState = state;
+ return (1);
+ }
+
+ return (0);
+}
+
+static int nr_rrc_set_sub_state( module_id_t ue_mod_idP, Rrc_Sub_State_NR_t subState ) {
+ if (AMF_MODE_ENABLED) {
+ switch (NR_UE_rrc_inst[ue_mod_idP].nrRrcState) {
+ case RRC_STATE_INACTIVE_NR:
+ AssertFatal ((RRC_SUB_STATE_INACTIVE_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_INACTIVE_LAST_NR),
+ "Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
+ break;
+
+ case RRC_STATE_IDLE_NR:
+ AssertFatal ((RRC_SUB_STATE_IDLE_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_IDLE_LAST_NR),
+ "Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
+ break;
+
+ case RRC_STATE_CONNECTED_NR:
+ AssertFatal ((RRC_SUB_STATE_CONNECTED_FIRST_NR <= subState) && (subState <= RRC_SUB_STATE_CONNECTED_LAST_NR),
+ "Invalid nr sub state %d for state %d!\n", subState, NR_UE_rrc_inst[ue_mod_idP].nrRrcState);
+ break;
+ }
+ }
+
+ if (NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState != subState) {
+ NR_UE_rrc_inst[ue_mod_idP].nrRrcSubState = subState;
+ return (1);
+ }
+
+ return (0);
+}
+
+extern boolean_t nr_rrc_pdcp_config_asn1_req(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_SRB_ToAddModList_t *const srb2add_list,
+ NR_DRB_ToAddModList_t *const drb2add_list,
+ NR_DRB_ToReleaseList_t *const drb2release_list,
+ const uint8_t security_modeP,
+ uint8_t *const kRRCenc,
+ uint8_t *const kRRCint,
+ uint8_t *const kUPenc
+ #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
+ ,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
+ #endif
+ ,rb_id_t *const defaultDRB,
+ struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
+
+extern rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP,
+ const NR_SRB_ToAddModList_t * const srb2add_listP,
+ const NR_DRB_ToAddModList_t * const drb2add_listP,
+ const NR_DRB_ToReleaseList_t * const drb2release_listP,
+ const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
+ struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
// from LTE-RRC DL-DCCH RRCConnectionReconfiguration nr-secondary-cell-group-config (encoded)
int8_t nr_rrc_ue_decode_secondary_cellgroup_config(
+ const module_id_t module_id,
const uint8_t *buffer,
const uint32_t size ){
@@ -72,11 +216,11 @@ int8_t nr_rrc_ue_decode_secondary_cellgroup_config(
return -1;
}
- if(NR_UE_rrc_inst->cell_group_config == NULL){
- NR_UE_rrc_inst->cell_group_config = cell_group_config;
- nr_rrc_ue_process_scg_config(cell_group_config);
+ if(NR_UE_rrc_inst[module_id].cell_group_config == NULL){
+ NR_UE_rrc_inst[module_id].cell_group_config = cell_group_config;
+ nr_rrc_ue_process_scg_config(module_id,cell_group_config);
}else{
- nr_rrc_ue_process_scg_config(cell_group_config);
+ nr_rrc_ue_process_scg_config(module_id,cell_group_config);
SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)cell_group_config, 0);
}
@@ -96,67 +240,62 @@ int8_t nr_rrc_ue_process_RadioBearerConfig(NR_RadioBearerConfig_t *RadioBearerCo
// from LTE-RRC DL-DCCH RRCConnectionReconfiguration nr-secondary-cell-group-config (decoded)
// RRCReconfiguration
-int8_t nr_rrc_ue_process_rrcReconfiguration(NR_RRCReconfiguration_t *rrcReconfiguration){
+int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCReconfiguration_t *rrcReconfiguration){
- switch(rrcReconfiguration->criticalExtensions.present){
- case NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration:
- if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig != NULL){
- if(NR_UE_rrc_inst->radio_bearer_config == NULL){
- NR_UE_rrc_inst->radio_bearer_config = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig;
- }else{
- nr_rrc_ue_process_RadioBearerConfig(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
- }
- }
+ switch(rrcReconfiguration->criticalExtensions.present){
+ case NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration:
+ if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig != NULL){
+ if(NR_UE_rrc_inst[module_id].radio_bearer_config == NULL){
+ NR_UE_rrc_inst[module_id].radio_bearer_config = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig;
+ }else{
+ nr_rrc_ue_process_RadioBearerConfig(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->radioBearerConfig);
+ }
+ }
+ if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup != NULL){
+ NR_CellGroupConfig_t *cellGroupConfig = NULL;
+ uper_decode(NULL,
+ &asn_DEF_NR_CellGroupConfig, //might be added prefix later
+ (void **)&cellGroupConfig,
+ (uint8_t *)rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->buf,
+ rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->size, 0, 0);
- if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup != NULL){
- NR_CellGroupConfig_t *cellGroupConfig = NULL;
- uper_decode(NULL,
- &asn_DEF_NR_CellGroupConfig, //might be added prefix later
- (void **)&cellGroupConfig,
- (uint8_t *)rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->buf,
- rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->size, 0, 0);
+ xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
- xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+ 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{
+ // 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(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig != NULL){
+ if(NR_UE_rrc_inst[module_id].meas_config == NULL){
+ NR_UE_rrc_inst[module_id].meas_config = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig;
+ }else{
+ // if some element need to be updated
+ nr_rrc_ue_process_meas_config(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig);
+ }
+ }
+ if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->lateNonCriticalExtension != NULL){
+ // unuse now
+ }
+ if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension != NULL){
+ // unuse now
+ }
+ break;
+
+ case NR_RRCReconfiguration__criticalExtensions_PR_NOTHING:
+ case NR_RRCReconfiguration__criticalExtensions_PR_criticalExtensionsFuture:
+ default:
+ break;
+ }
+ //nr_rrc_mac_config_req_ue();
- if(NR_UE_rrc_inst->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->cell_group_config = cellGroupConfig;
- nr_rrc_ue_process_scg_config(cellGroupConfig);
- }else{
- // after first time, update it and free the memory after.
- SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)NR_UE_rrc_inst->cell_group_config, 0);
- NR_UE_rrc_inst->cell_group_config = cellGroupConfig;
- nr_rrc_ue_process_scg_config(cellGroupConfig);
- }
-
- }
-
- if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig != NULL){
- if(NR_UE_rrc_inst->meas_config == NULL){
- NR_UE_rrc_inst->meas_config = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig;
- }else{
- // if some element need to be updated
- nr_rrc_ue_process_meas_config(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig);
- }
-
- }
-
- if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->lateNonCriticalExtension != NULL){
- // unuse now
- }
-
- if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->nonCriticalExtension != NULL){
- // unuse now
- }
- break;
- case NR_RRCReconfiguration__criticalExtensions_PR_NOTHING:
- case NR_RRCReconfiguration__criticalExtensions_PR_criticalExtensionsFuture:
- default:
- break;
- }
- //nr_rrc_mac_config_req_ue();
-
- return 0;
+ return 0;
}
@@ -166,90 +305,89 @@ int8_t nr_rrc_ue_process_meas_config(NR_MeasConfig_t *meas_config){
return 0;
}
-int8_t nr_rrc_ue_process_scg_config(NR_CellGroupConfig_t *cell_group_config){
- int i;
- if(NR_UE_rrc_inst->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; ispCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count; ++i){
- RRC_LIST_MOD_ADD(NR_UE_rrc_inst->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; ispCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count; ++i){
- RRC_LIST_MOD_ADD(NR_UE_rrc_inst->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; ispCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList->list.count; ++i){
- NR_BWP_Downlink_t *freeP = NULL;
- RRC_LIST_MOD_REL(NR_UE_rrc_inst->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);
- }
- }
- }
- }
+int8_t nr_rrc_ue_process_scg_config(const module_id_t module_id, NR_CellGroupConfig_t *cell_group_config){
+ int i;
+ if(NR_UE_rrc_inst[module_id].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; ispCellConfig->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; ispCellConfig->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);
+ }
}
- }
- return 0;
+ // process element of list to be release by RRC message
+ if(cell_group_config->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList != NULL){
+ for(i=0; ispCellConfig->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
switch (nsa_message_type) {
case nr_SecondaryCellGroupConfig_r15:
{
- NR_RRCReconfiguration_t *RRCReconfiguration=NULL;
- asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
- &asn_DEF_NR_RRCReconfiguration,
- (void **)&RRCReconfiguration,
- (uint8_t *)message,
- msg_len);
-
- if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(RRC,"NR_RRCReconfiguration decode error\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_NR_RRCReconfiguration, RRCReconfiguration, 1 );
- return;
- }
- nr_rrc_ue_process_rrcReconfiguration(RRCReconfiguration);
- }
+ NR_RRCReconfiguration_t *RRCReconfiguration=NULL;
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_RRCReconfiguration,
+ (void **)&RRCReconfiguration,
+ (uint8_t *)message,
+ msg_len);
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(RRC,"NR_RRCReconfiguration decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_RRCReconfiguration, RRCReconfiguration, 1 );
+ return;
+ }
+ nr_rrc_ue_process_rrcReconfiguration(module_id,RRCReconfiguration);
+ }
break;
+
case nr_RadioBearerConfigX_r15:
{
- NR_RadioBearerConfig_t *RadioBearerConfig=NULL;
- asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
- &asn_DEF_NR_RadioBearerConfig,
- (void **)&RadioBearerConfig,
- (uint8_t *)message,
- msg_len);
-
- if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(RRC,"NR_RadioBearerConfig decode error\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_NR_RadioBearerConfig, RadioBearerConfig, 1 );
- return;
- }
- nr_rrc_ue_process_RadioBearerConfig(RadioBearerConfig);
+ NR_RadioBearerConfig_t *RadioBearerConfig=NULL;
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_RadioBearerConfig,
+ (void **)&RadioBearerConfig,
+ (uint8_t *)message,
+ msg_len);
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(RRC,"NR_RadioBearerConfig decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_RadioBearerConfig, RadioBearerConfig, 1 );
+ return;
+ }
+ nr_rrc_ue_process_RadioBearerConfig(RadioBearerConfig);
}
break;
+
default:
AssertFatal(1==0,"Unknown message %d\n",nsa_message_type);
break;
@@ -258,104 +396,105 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
}
NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* rrc_config_path){
-
- if(NB_NR_UE_INST > 0){
- NR_UE_rrc_inst = (NR_UE_RRC_INST_t *)malloc(NB_NR_UE_INST * sizeof(NR_UE_RRC_INST_t));
- memset(NR_UE_rrc_inst, 0, NB_NR_UE_INST * sizeof(NR_UE_RRC_INST_t));
-
- // fill UE-NR-Capability @ UE-CapabilityRAT-Container here.
-
- // init RRC lists
- RRC_LIST_INIT(NR_UE_rrc_inst->RLC_Bearer_Config_list, NR_maxLC_ID);
- RRC_LIST_INIT(NR_UE_rrc_inst->SchedulingRequest_list, NR_maxNrofSR_ConfigPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->TAG_list, NR_maxNrofTAGs);
- RRC_LIST_INIT(NR_UE_rrc_inst->TDD_UL_DL_SlotConfig_list, NR_maxNrofSlots);
- RRC_LIST_INIT(NR_UE_rrc_inst->BWP_Downlink_list, NR_maxNrofBWPs);
- RRC_LIST_INIT(NR_UE_rrc_inst->ControlResourceSet_list[0], 3); // for init-dl-bwp
- RRC_LIST_INIT(NR_UE_rrc_inst->ControlResourceSet_list[1], 3); // for dl-bwp id=0
- RRC_LIST_INIT(NR_UE_rrc_inst->ControlResourceSet_list[2], 3); // for dl-bwp id=1
- RRC_LIST_INIT(NR_UE_rrc_inst->ControlResourceSet_list[3], 3); // for dl-bwp id=2
- RRC_LIST_INIT(NR_UE_rrc_inst->ControlResourceSet_list[4], 3); // for dl-bwp id=3
- RRC_LIST_INIT(NR_UE_rrc_inst->SearchSpace_list[0], 10);
- RRC_LIST_INIT(NR_UE_rrc_inst->SearchSpace_list[1], 10);
- RRC_LIST_INIT(NR_UE_rrc_inst->SearchSpace_list[2], 10);
- RRC_LIST_INIT(NR_UE_rrc_inst->SearchSpace_list[3], 10);
- RRC_LIST_INIT(NR_UE_rrc_inst->SearchSpace_list[4], 10);
- RRC_LIST_INIT(NR_UE_rrc_inst->SlotFormatCombinationsPerCell_list[0], NR_maxNrofAggregatedCellsPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->SlotFormatCombinationsPerCell_list[1], NR_maxNrofAggregatedCellsPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->SlotFormatCombinationsPerCell_list[2], NR_maxNrofAggregatedCellsPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->SlotFormatCombinationsPerCell_list[3], NR_maxNrofAggregatedCellsPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->SlotFormatCombinationsPerCell_list[4], NR_maxNrofAggregatedCellsPerCellGroup);
- RRC_LIST_INIT(NR_UE_rrc_inst->TCI_State_list[0], NR_maxNrofTCI_States);
- RRC_LIST_INIT(NR_UE_rrc_inst->TCI_State_list[1], NR_maxNrofTCI_States);
- RRC_LIST_INIT(NR_UE_rrc_inst->TCI_State_list[2], NR_maxNrofTCI_States);
- RRC_LIST_INIT(NR_UE_rrc_inst->TCI_State_list[3], NR_maxNrofTCI_States);
- RRC_LIST_INIT(NR_UE_rrc_inst->TCI_State_list[4], NR_maxNrofTCI_States);
- RRC_LIST_INIT(NR_UE_rrc_inst->RateMatchPattern_list[0], NR_maxNrofRateMatchPatterns);
- RRC_LIST_INIT(NR_UE_rrc_inst->RateMatchPattern_list[1], NR_maxNrofRateMatchPatterns);
- RRC_LIST_INIT(NR_UE_rrc_inst->RateMatchPattern_list[2], NR_maxNrofRateMatchPatterns);
- RRC_LIST_INIT(NR_UE_rrc_inst->RateMatchPattern_list[3], NR_maxNrofRateMatchPatterns);
- RRC_LIST_INIT(NR_UE_rrc_inst->RateMatchPattern_list[4], NR_maxNrofRateMatchPatterns);
- RRC_LIST_INIT(NR_UE_rrc_inst->ZP_CSI_RS_Resource_list[0], NR_maxNrofZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->ZP_CSI_RS_Resource_list[1], NR_maxNrofZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->ZP_CSI_RS_Resource_list[2], NR_maxNrofZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->ZP_CSI_RS_Resource_list[3], NR_maxNrofZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->ZP_CSI_RS_Resource_list[4], NR_maxNrofZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->Aperidic_ZP_CSI_RS_ResourceSet_list[0], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->Aperidic_ZP_CSI_RS_ResourceSet_list[1], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->Aperidic_ZP_CSI_RS_ResourceSet_list[2], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->Aperidic_ZP_CSI_RS_ResourceSet_list[3], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->Aperidic_ZP_CSI_RS_ResourceSet_list[4], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->SP_ZP_CSI_RS_ResourceSet_list[0], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->SP_ZP_CSI_RS_ResourceSet_list[1], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->SP_ZP_CSI_RS_ResourceSet_list[2], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->SP_ZP_CSI_RS_ResourceSet_list[3], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->SP_ZP_CSI_RS_ResourceSet_list[4], NR_maxNrofZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->NZP_CSI_RS_Resource_list, NR_maxNrofNZP_CSI_RS_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->NZP_CSI_RS_ResourceSet_list, NR_maxNrofNZP_CSI_RS_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->CSI_IM_Resource_list, NR_maxNrofCSI_IM_Resources);
- RRC_LIST_INIT(NR_UE_rrc_inst->CSI_IM_ResourceSet_list, NR_maxNrofCSI_IM_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->CSI_SSB_ResourceSet_list, NR_maxNrofCSI_SSB_ResourceSets);
- RRC_LIST_INIT(NR_UE_rrc_inst->CSI_ResourceConfig_list, NR_maxNrofCSI_ResourceConfigurations);
- RRC_LIST_INIT(NR_UE_rrc_inst->CSI_ReportConfig_list, NR_maxNrofCSI_ReportConfigurations);
-
- if (get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra==1) {
- // read in files for RRCReconfiguration and RBconfig
- FILE *fd;
- char filename[1024];
- if (rrc_config_path)
- sprintf(filename,"%s/reconfig.raw",rrc_config_path);
- else
- sprintf(filename,"reconfig.raw");
- fd = fopen(filename,"r");
- char buffer[1024];
- AssertFatal(fd,
- "cannot read file %s: errno %d, %s\n",
- filename,
- errno,
- strerror(errno));
- int msg_len=fread(buffer,1,1024,fd);
- fclose(fd);
- process_nsa_message(NR_UE_rrc_inst, nr_SecondaryCellGroupConfig_r15, buffer,msg_len);
- if (rrc_config_path)
- sprintf(filename,"%s/rbconfig.raw",rrc_config_path);
- else
- sprintf(filename,"rbconfig.raw");
- fd = fopen(filename,"r");
- AssertFatal(fd,
- "cannot read file %s: errno %d, %s\n",
- filename,
- errno,
- strerror(errno));
- msg_len=fread(buffer,1,1024,fd);
- fclose(fd);
- process_nsa_message(NR_UE_rrc_inst, nr_RadioBearerConfigX_r15, buffer,msg_len);
- }
- }else{
- NR_UE_rrc_inst = NULL;
+ int nr_ue;
+ if(NB_NR_UE_INST > 0){
+ NR_UE_rrc_inst = (NR_UE_RRC_INST_t *)malloc(NB_NR_UE_INST * sizeof(NR_UE_RRC_INST_t));
+ memset(NR_UE_rrc_inst, 0, NB_NR_UE_INST * sizeof(NR_UE_RRC_INST_t));
+ for(nr_ue=0;nr_uephy_test==1 || get_softmodem_params()->do_ra==1) {
+ // read in files for RRCReconfiguration and RBconfig
+ FILE *fd;
+ char filename[1024];
+ if (rrc_config_path)
+ sprintf(filename,"%s/reconfig.raw",rrc_config_path);
+ else
+ sprintf(filename,"reconfig.raw");
+ fd = fopen(filename,"r");
+ char buffer[1024];
+ AssertFatal(fd,
+ "cannot read file %s: errno %d, %s\n",
+ filename,
+ errno,
+ strerror(errno));
+ int msg_len=fread(buffer,1,1024,fd);
+ fclose(fd);
+ process_nsa_message(NR_UE_rrc_inst, nr_SecondaryCellGroupConfig_r15, buffer,msg_len);
+ if (rrc_config_path)
+ sprintf(filename,"%s/rbconfig.raw",rrc_config_path);
+ else
+ sprintf(filename,"rbconfig.raw");
+ fd = fopen(filename,"r");
+ AssertFatal(fd,
+ "cannot read file %s: errno %d, %s\n",
+ filename,
+ errno,
+ strerror(errno));
+ msg_len=fread(buffer,1,1024,fd);
+ fclose(fd);
+ process_nsa_message(NR_UE_rrc_inst, nr_RadioBearerConfigX_r15, buffer,msg_len);
+ }
+ }else{
+ NR_UE_rrc_inst = NULL;
+ }
+
+ return NR_UE_rrc_inst;
}
@@ -392,7 +531,7 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
const uint8_t buffer_len ){
int i;
NR_BCCH_BCH_Message_t *bcch_message = NULL;
- NR_MIB_t *mib = NR_UE_rrc_inst->mib;
+ NR_MIB_t *mib = NR_UE_rrc_inst[module_id].mib;
if(mib != NULL){
SEQUENCE_free( &asn_DEF_NR_BCCH_BCH_Message, (void *)mib, 1 );
@@ -412,7 +551,7 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
if ((dec_rval.code != RC_OK) || (dec_rval.consumed == 0)) {
printf("NR_BCCH_BCH decode error\n");
for (i=0; i 1)
+ return "ERR";
+
+ if (value)
+ return "notReserved";
+
+ return "reserved";
+}
+
+void nr_dump_sib2( NR_SIB2_t *sib2 ){
+//cellReselectionInfoCommon
+ //nrofSS_BlocksToAverage
+ if( sib2->cellReselectionInfoCommon.nrofSS_BlocksToAverage)
+ LOG_I( RRC, "cellReselectionInfoCommon.nrofSS_BlocksToAverage : %ld\n",
+ *sib2->cellReselectionInfoCommon.nrofSS_BlocksToAverage );
+ else
+ LOG_I( RRC, "cellReselectionInfoCommon->nrofSS_BlocksToAverage : not defined\n" );
+
+ //absThreshSS_BlocksConsolidation
+ if( sib2->cellReselectionInfoCommon.absThreshSS_BlocksConsolidation){
+ LOG_I( RRC, "absThreshSS_BlocksConsolidation.thresholdRSRP : %ld\n",
+ *sib2->cellReselectionInfoCommon.absThreshSS_BlocksConsolidation->thresholdRSRP );
+ LOG_I( RRC, "absThreshSS_BlocksConsolidation.thresholdRSRQ : %ld\n",
+ *sib2->cellReselectionInfoCommon.absThreshSS_BlocksConsolidation->thresholdRSRQ );
+ LOG_I( RRC, "absThreshSS_BlocksConsolidation.thresholdSINR : %ld\n",
+ *sib2->cellReselectionInfoCommon.absThreshSS_BlocksConsolidation->thresholdSINR );
+ } else
+ LOG_I( RRC, "cellReselectionInfoCommon->absThreshSS_BlocksConsolidation : not defined\n" );
+
+ //q_Hyst
+ LOG_I( RRC, "cellReselectionInfoCommon.q_Hyst : %ld\n",
+ sib2->cellReselectionInfoCommon.q_Hyst );
+
+ //speedStateReselectionPars
+ if( sib2->cellReselectionInfoCommon.speedStateReselectionPars){
+ LOG_I( RRC, "speedStateReselectionPars->mobilityStateParameters.t_Evaluation : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->mobilityStateParameters.t_Evaluation);
+ LOG_I( RRC, "speedStateReselectionPars->mobilityStateParameters.t_HystNormal : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->mobilityStateParameters.t_HystNormal);
+ LOG_I( RRC, "speedStateReselectionPars->mobilityStateParameters.n_CellChangeMedium : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->mobilityStateParameters.n_CellChangeMedium);
+ LOG_I( RRC, "speedStateReselectionPars->mobilityStateParameters.n_CellChangeHigh : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->mobilityStateParameters.n_CellChangeHigh);
+ LOG_I( RRC, "speedStateReselectionPars->q_HystSF.sf_Medium : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->q_HystSF.sf_Medium);
+ LOG_I( RRC, "speedStateReselectionPars->q_HystSF.sf_High : %ld\n",
+ sib2->cellReselectionInfoCommon.speedStateReselectionPars->q_HystSF.sf_High);
+ } else
+ LOG_I( RRC, "cellReselectionInfoCommon->speedStateReselectionPars : not defined\n" );
+
+//cellReselectionServingFreqInfo
+ if( sib2->cellReselectionServingFreqInfo.s_NonIntraSearchP)
+ LOG_I( RRC, "cellReselectionServingFreqInfo.s_NonIntraSearchP : %ld\n",
+ *sib2->cellReselectionServingFreqInfo.s_NonIntraSearchP );
+ else
+ LOG_I( RRC, "cellReselectionServingFreqInfo->s_NonIntraSearchP : not defined\n" );
+
+ if( sib2->cellReselectionServingFreqInfo.s_NonIntraSearchQ)
+ LOG_I( RRC, "cellReselectionServingFreqInfo.s_NonIntraSearchQ : %ld\n",
+ *sib2->cellReselectionServingFreqInfo.s_NonIntraSearchQ );
+ else
+ LOG_I( RRC, "cellReselectionServingFreqInfo->s_NonIntraSearchQ : not defined\n" );
+
+ LOG_I( RRC, "cellReselectionServingFreqInfo.threshServingLowP : %ld\n",
+ sib2->cellReselectionServingFreqInfo.threshServingLowP );
+
+ if( sib2->cellReselectionServingFreqInfo.threshServingLowQ)
+ LOG_I( RRC, "cellReselectionServingFreqInfo.threshServingLowQ : %ld\n",
+ *sib2->cellReselectionServingFreqInfo.threshServingLowQ );
+ else
+ LOG_I( RRC, "cellReselectionServingFreqInfo->threshServingLowQ : not defined\n" );
+
+ LOG_I( RRC, "cellReselectionServingFreqInfo.cellReselectionPriority : %ld\n",
+ sib2->cellReselectionServingFreqInfo.cellReselectionPriority );
+ if( sib2->cellReselectionServingFreqInfo.cellReselectionSubPriority)
+ LOG_I( RRC, "cellReselectionServingFreqInfo.cellReselectionSubPriority : %ld\n",
+ *sib2->cellReselectionServingFreqInfo.cellReselectionSubPriority );
+ else
+ LOG_I( RRC, "cellReselectionServingFreqInfo->cellReselectionSubPriority : not defined\n" );
+
+//intraFreqCellReselectionInfo
+ LOG_I( RRC, "intraFreqCellReselectionInfo.q_RxLevMin : %ld\n",
+ sib2->intraFreqCellReselectionInfo.q_RxLevMin );
+
+ if( sib2->intraFreqCellReselectionInfo.q_RxLevMinSUL)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.q_RxLevMinSUL : %ld\n",
+ *sib2->intraFreqCellReselectionInfo.q_RxLevMinSUL );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->q_RxLevMinSUL : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.q_QualMin)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.q_QualMin : %ld\n",
+ *sib2->intraFreqCellReselectionInfo.q_QualMin );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->q_QualMin : not defined\n" );
+
+ LOG_I( RRC, "intraFreqCellReselectionInfo.s_IntraSearchP : %ld\n",
+ sib2->intraFreqCellReselectionInfo.s_IntraSearchP );
+
+ if( sib2->intraFreqCellReselectionInfo.s_IntraSearchQ)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.s_IntraSearchQ : %ld\n",
+ *sib2->intraFreqCellReselectionInfo.s_IntraSearchQ );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->s_IntraSearchQ : not defined\n" );
+
+ LOG_I( RRC, "intraFreqCellReselectionInfo.t_ReselectionNR : %ld\n",
+ sib2->intraFreqCellReselectionInfo.t_ReselectionNR );
+
+ if( sib2->intraFreqCellReselectionInfo.frequencyBandList)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.frequencyBandList : %p\n",
+ sib2->intraFreqCellReselectionInfo.frequencyBandList );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->frequencyBandList : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.frequencyBandListSUL)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.frequencyBandListSUL : %p\n",
+ sib2->intraFreqCellReselectionInfo.frequencyBandListSUL );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->frequencyBandListSUL : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.p_Max)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.p_Max : %ld\n",
+ *sib2->intraFreqCellReselectionInfo.p_Max );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->p_Max : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.smtc)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.smtc : %p\n",
+ sib2->intraFreqCellReselectionInfo.smtc );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->smtc : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.ss_RSSI_Measurement)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.ss_RSSI_Measurement : %p\n",
+ sib2->intraFreqCellReselectionInfo.ss_RSSI_Measurement );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->ss_RSSI_Measurement : not defined\n" );
+
+ if( sib2->intraFreqCellReselectionInfo.ssb_ToMeasure)
+ LOG_I( RRC, "intraFreqCellReselectionInfo.ssb_ToMeasure : %p\n",
+ sib2->intraFreqCellReselectionInfo.ssb_ToMeasure );
+ else
+ LOG_I( RRC, "intraFreqCellReselectionInfo->ssb_ToMeasure : not defined\n" );
+
+ LOG_I( RRC, "intraFreqCellReselectionInfo.deriveSSB_IndexFromCell : %d\n",
+ sib2->intraFreqCellReselectionInfo.deriveSSB_IndexFromCell );
+
+}
+
+void nr_dump_sib3( NR_SIB3_t *sib3 ) {
+//intraFreqNeighCellList
+ if( sib3->intraFreqNeighCellList){
+ LOG_I( RRC, "intraFreqNeighCellList : %p\n",
+ sib3->intraFreqNeighCellList );
+ const int n = sib3->intraFreqNeighCellList->list.count;
+ for (int i = 0; i < n; ++i){
+ LOG_I( RRC, "intraFreqNeighCellList->physCellId : %ld\n",
+ sib3->intraFreqNeighCellList->list.array[i]->physCellId );
+ LOG_I( RRC, "intraFreqNeighCellList->q_OffsetCell : %ld\n",
+ sib3->intraFreqNeighCellList->list.array[i]->q_OffsetCell );
+
+ if( sib3->intraFreqNeighCellList->list.array[i]->q_RxLevMinOffsetCell)
+ LOG_I( RRC, "intraFreqNeighCellList->q_RxLevMinOffsetCell : %ld\n",
+ *sib3->intraFreqNeighCellList->list.array[i]->q_RxLevMinOffsetCell );
+ else
+ LOG_I( RRC, "intraFreqNeighCellList->q_RxLevMinOffsetCell : not defined\n" );
+
+ if( sib3->intraFreqNeighCellList->list.array[i]->q_RxLevMinOffsetCellSUL)
+ LOG_I( RRC, "intraFreqNeighCellList->q_RxLevMinOffsetCellSUL : %ld\n",
+ *sib3->intraFreqNeighCellList->list.array[i]->q_RxLevMinOffsetCellSUL );
+ else
+ LOG_I( RRC, "intraFreqNeighCellList->q_RxLevMinOffsetCellSUL : not defined\n" );
+
+ if( sib3->intraFreqNeighCellList->list.array[i]->q_QualMinOffsetCell)
+ LOG_I( RRC, "intraFreqNeighCellList->q_QualMinOffsetCell : %ld\n",
+ *sib3->intraFreqNeighCellList->list.array[i]->q_QualMinOffsetCell );
+ else
+ LOG_I( RRC, "intraFreqNeighCellList->q_QualMinOffsetCell : not defined\n" );
+ }
+ } else{
+ LOG_I( RRC, "intraFreqCellReselectionInfo : not defined\n" );
+ }
+
+//intraFreqBlackCellList
+ if( sib3->intraFreqBlackCellList){
+ LOG_I( RRC, "intraFreqBlackCellList : %p\n",
+ sib3->intraFreqBlackCellList );
+ const int n = sib3->intraFreqBlackCellList->list.count;
+ for (int i = 0; i < n; ++i){
+ LOG_I( RRC, "intraFreqBlackCellList->start : %ld\n",
+ sib3->intraFreqBlackCellList->list.array[i]->start );
+
+ if( sib3->intraFreqBlackCellList->list.array[i]->range)
+ LOG_I( RRC, "intraFreqBlackCellList->range : %ld\n",
+ *sib3->intraFreqBlackCellList->list.array[i]->range );
+ else
+ LOG_I( RRC, "intraFreqBlackCellList->range : not defined\n" );
+ }
+ } else{
+ LOG_I( RRC, "intraFreqBlackCellList : not defined\n" );
+ }
+
+//lateNonCriticalExtension
+ if( sib3->lateNonCriticalExtension)
+ LOG_I( RRC, "lateNonCriticalExtension : %p\n",
+ sib3->lateNonCriticalExtension );
+ else
+ 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 new_sib = 0;
+ NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
+ 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 );
+ } 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++) {
+ SystemInformation_IEs__sib_TypeAndInfo__Member *typeandinfo;
+ 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;
+ //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 );
+ //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 (AMF_MODE_ENABLED) {
+ rrc_ue_generate_RRCSetupRequest( ctxt_pP, 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, 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;
+ 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] );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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]);
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ 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 );
+ }
+
+ 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;
+ new_sib=1;
+ memcpy( NR_UE_rrc_inst[ctxt_pP->module_id].sib13[gNB_index], 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] );
+ // 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);
+ // 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;
+ 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 );
+ }
+
+ break;
+
+ default:
+ 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)
+ nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE );
+
+ LOG_I(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,
+ sib1->si_SchedulingInfo->schedulingInfoList.list.count);
+ }
+ }
+
+ //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->schedulingInfoList.list.count)
+ // rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE );
+
+ // LOG_I(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,
+ // sib1->schedulingInfoList.list.count);
+ //}
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_OUT);
+ return 0;
+}
+
+int nr_decode_SIB1( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index, const uint8_t rsrq, const uint8_t rsrp ) {
+ NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_IN );
+ LOG_I( RRC, "[UE %d] : Dumping SIB 1\n", ctxt_pP->module_id );
+ const int n = sib1->cellAccessRelatedInfo.plmn_IdentityList.list.count;
+ for (int i = 0; i < n; ++i) {
+ NR_PLMN_Identity_t *PLMN_identity = sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[i]->plmn_IdentityList.list.array[0];
+ int mccdigits = PLMN_identity->mcc->list.count;
+ int mncdigits = PLMN_identity->mnc.list.count;
+
+ int mcc;
+ if (mccdigits == 2) {
+ mcc = *PLMN_identity->mcc->list.array[0]*10 + *PLMN_identity->mcc->list.array[1];
+ } else {
+ mcc = *PLMN_identity->mcc->list.array[0]*100 + *PLMN_identity->mcc->list.array[1]*10 + *PLMN_identity->mcc->list.array[2];
+ }
+
+ int mnc;
+ if (mncdigits == 2) {
+ mnc = *PLMN_identity->mnc.list.array[0]*10 + *PLMN_identity->mnc.list.array[1];
+ } else {
+ mnc = *PLMN_identity->mnc.list.array[0]*100 + *PLMN_identity->mnc.list.array[1]*10 + *PLMN_identity->mnc.list.array[2];
+ }
+
+ LOG_I( RRC, "PLMN %d MCC %0*d, MNC %0*d\n", i + 1, mccdigits, mcc, mncdigits, mnc);
+ // search internal table for provider name
+ int plmn_ind = 0;
+
+ while (plmn_data[plmn_ind].mcc > 0) {
+ if ((plmn_data[plmn_ind].mcc == mcc) && (plmn_data[plmn_ind].mnc == mnc)) {
+ LOG_I( RRC, "Found %s (name from internal table)\n", plmn_data[plmn_ind].oper_short );
+ break;
+ }
+
+ plmn_ind++;
+ }
+ }
+ LOG_I( RRC, "TAC 0x%04x\n",
+ ((sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->trackingAreaCode->size == 2)?((sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->trackingAreaCode->buf[0]<<8) + sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->trackingAreaCode->buf[1]):0));
+ LOG_I( RRC, "cellReservedForOperatorUse : raw:%ld decoded:%s\n", sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellReservedForOperatorUse,
+ nr_SIBreserved(sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellReservedForOperatorUse) );
+
+ LOG_I( RRC, "cellAccessRelatedInfo.cellIdentity : raw:%"PRIu32" decoded:%02x.%02x.%02x.%02x\n",
+ BIT_STRING_to_uint32( &sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity ),
+ sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity.buf[0],
+ sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity.buf[1],
+ sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity.buf[2],
+ sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity.buf[3] >> sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity.bits_unused);
+ //LOG_I( RRC, "cellAccessRelatedInfo.cellBarred : raw:%ld decoded:%s\n", sib1->cellAccessRelatedInfo.cellBarred, SIBbarred(sib1->cellAccessRelatedInfo.cellBarred) );
+ //LOG_I( RRC, "cellAccessRelatedInfo.intraFreqReselection : raw:%ld decoded:%s\n", sib1->cellAccessRelatedInfo.intraFreqReselection, SIBallowed(sib1->cellAccessRelatedInfo.intraFreqReselection) );
+ //LOG_I( RRC, "cellAccessRelatedInfo.csg_Indication : %d\n", sib1->cellAccessRelatedInfo.csg_Indication );
+
+ //if (sib1->cellAccessRelatedInfo.csg_Identity)
+ // LOG_I( RRC, "cellAccessRelatedInfo.csg_Identity : %"PRIu32"\n", BIT_STRING_to_uint32(sib1->cellAccessRelatedInfo.csg_Identity) );
+ //else
+ // LOG_I( RRC, "cellAccessRelatedInfo.csg_Identity : not defined\n" );
+
+ LOG_I( RRC, "cellSelectionInfo.q_RxLevMin : %ld\n", sib1->cellSelectionInfo->q_RxLevMin );
+
+ if (sib1->cellSelectionInfo->q_RxLevMinOffset)
+ LOG_I( RRC, "cellSelectionInfo.q_RxLevMinOffset : %ld\n", *sib1->cellSelectionInfo->q_RxLevMinOffset );
+ else
+ LOG_I( RRC, "cellSelectionInfo.q_RxLevMinOffset : not defined\n" );
+
+ //if (sib1->p_Max)
+ // LOG_I( RRC, "p_Max : %ld\n", *sib1->p_Max );
+ //else
+ // LOG_I( RRC, "p_Max : not defined\n" );
+
+ //LOG_I( RRC, "freqBandIndicator : %ld\n", sib1->freqBandIndicator );
+
+ if (sib1->si_SchedulingInfo->schedulingInfoList.list.count > 0) {
+ for (int i=0; isi_SchedulingInfo->schedulingInfoList.list.count; i++) {
+ LOG_I( RRC, "si_Periodicity[%d] : %s\n", i, SIBPeriod[min(sib1->si_SchedulingInfo->schedulingInfoList.list.array[i]->si_Periodicity,7)]);
+
+ if (sib1->si_SchedulingInfo->schedulingInfoList.list.array[i]->sib_MappingInfo.list.count > 0) {
+ char temp[32 * sizeof(SIBType[0])] = {0}; // maxSIB==32
+
+ for (int j=0; jsi_SchedulingInfo->schedulingInfoList.list.array[i]->sib_MappingInfo.list.count; j++) {
+ sprintf( temp + j*sizeof(SIBType[0]), "%*s ", (int)sizeof(SIBType[0])-1, SIBType[min(sib1->si_SchedulingInfo->schedulingInfoList.list.array[i]->sib_MappingInfo.list.array[0]->type,11)] );
+ }
+
+ LOG_I( RRC, "siSchedulingInfoSIBType[%d] : %s\n", i, temp );
+ } else {
+ LOG_I( RRC, "mapping list %d is null\n", i );
+ }
+ }
+ } else {
+ LOG_E( RRC, "siSchedulingInfoPeriod[0] : PROBLEM!!!\n" );
+ return -1;
+ }
+
+ if (sib1->servingCellConfigCommon->tdd_UL_DL_ConfigurationCommon) {
+ //TODO
+ }
+
+ LOG_I( RRC, "siWindowLength : %s\n", siWindowLength[min(sib1->si_SchedulingInfo->si_WindowLength,8)] );
+ //LOG_I( RRC, "systemInfoValueTag : %ld\n", sib1->systemInfoValueTag );
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIperiod = siPeriod_int[sib1->si_SchedulingInfo->schedulingInfoList.list.array[0]->si_Periodicity];
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIwindowsize = siWindowLength_int[sib1->si_SchedulingInfo->si_WindowLength];
+ LOG_I( RRC, "[FRAME unknown][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB1 params gNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n",
+ ctxt_pP->module_id, gNB_index, ctxt_pP->module_id );
+ //rrc_mac_config_req_ue
+ LOG_I(RRC,"Setting SIStatus bit 0 to 1\n");
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus = 1;
+ //NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIB1systemInfoValueTag = sib1->systemInfoValueTag;
+
+ if (AMF_MODE_ENABLED) {
+ int cell_valid = 0;
+
+ //if (sib1->cellAccessRelatedInfo.cellBarred == LTE_SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred) {
+ /* Cell is not barred */
+ int plmn;
+ int plmn_number;
+ plmn_number = sib1->cellAccessRelatedInfo.plmn_IdentityList.list.count;
+
+ /* Compare requested PLMN and PLMNs from SIB1*/
+ for (plmn = 0; plmn < plmn_number; plmn++) {
+ NR_PLMN_Identity_t *plmn_Identity;
+ plmn_Identity = sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[plmn]->plmn_IdentityList.list.array[0];
+
+ if (
+ (
+ (plmn_Identity->mcc == NULL)
+ ||
+ (
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MCCdigit1 == *(plmn_Identity->mcc->list.array[0])) &&
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MCCdigit2 == *(plmn_Identity->mcc->list.array[1])) &&
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MCCdigit3 == *(plmn_Identity->mcc->list.array[2]))
+ )
+ )
+ &&
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MNCdigit1 == *(plmn_Identity->mnc.list.array[0]))
+ &&
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MNCdigit2 == *(plmn_Identity->mnc.list.array[1]))
+ &&
+ (
+ ((NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MNCdigit3 == 0xf) && (plmn_Identity->mnc.list.count == 2))
+ ||
+ (NR_UE_rrc_inst[ctxt_pP->module_id].plmnID.MNCdigit3 == *(plmn_Identity->mnc.list.array[2]))
+ )
+ ) {
+ /* PLMN match, send a confirmation to NAS */
+ MessageDef *msg_p;
+ msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CELL_SELECTION_CNF);
+ NAS_CELL_SELECTION_CNF (msg_p).errCode = AS_SUCCESS;
+ NAS_CELL_SELECTION_CNF (msg_p).cellID = BIT_STRING_to_uint32(&sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->cellIdentity);
+ NAS_CELL_SELECTION_CNF (msg_p).tac = BIT_STRING_to_uint16(sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0]->trackingAreaCode);
+ NAS_CELL_SELECTION_CNF (msg_p).rat = 0xFF;
+ NAS_CELL_SELECTION_CNF (msg_p).rsrq = rsrq;
+ NAS_CELL_SELECTION_CNF (msg_p).rsrp = rsrp;
+ itti_send_msg_to_task(TASK_NAS_UE, ctxt_pP->instance, msg_p);
+ cell_valid = 1;
+ NR_UE_rrc_inst[ctxt_pP->module_id].selected_plmn_identity = plmn + 1;
+ break;
+ }
+ }
+ //}
+
+ if (cell_valid == 0) {
+ /* Cell can not be used, ask PHY to try the next one */
+ MessageDef *msg_p;
+ msg_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_NEXT_CELL_REQ);
+ itti_send_msg_to_task(TASK_PHY_UE, ctxt_pP->instance, msg_p);
+ LOG_E(RRC,
+ "Synched with a cell, but PLMN doesn't match our SIM "
+ "(selected_plmn_identity %ld), the message PHY_FIND_NEXT_CELL_REQ "
+ "is sent but lost in current UE implementation!\n",
+ NR_UE_rrc_inst[ctxt_pP->module_id].selected_plmn_identity);
+ }
+ }
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_OUT );
+ return 0;
+}
+
+int nr_decode_BCCH_DLSCH_Message(
+ const protocol_ctxt_t *const ctxt_pP,
+ const uint8_t gNB_index,
+ uint8_t *const Sdu,
+ const uint8_t Sdu_len,
+ const uint8_t rsrq,
+ const uint8_t rsrp ) {
+ NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
+ NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_IN );
+
+ if (((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 1) && // SIB1 received
+ (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].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;
+ }
+
+ nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_RECEIVING_SIB_NR );
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_BCCH_DL_SCH_Message,(void *)bcch_message );
+ }
+
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_BCCH_DL_SCH_Message,
+ (void **)&bcch_message,
+ (const void *)Sdu,
+ Sdu_len );
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E( RRC, "[UE %"PRIu8"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n",
+ ctxt_pP->module_id,
+ dec_rval.consumed );
+ log_dump(RRC, Sdu, Sdu_len, LOG_DUMP_CHAR," Received bytes:\n" );
+ // free the memory
+ SEQUENCE_free( &asn_DEF_LTE_BCCH_DL_SCH_Message, (void *)bcch_message, 1 );
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
+ return -1;
+ }
+
+ 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 ((ctxt_pP->frame % 2) == 0) {
+ // even frame
+ if ((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 0) {
+ NR_SIB1_t *sib1 = NR_UE_rrc_inst[ctxt_pP->module_id].sib1[gNB_index];
+ memcpy( (void *)sib1,
+ (void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1,
+ sizeof(NR_SIB1_t) );
+ LOG_D( RRC, "[UE %"PRIu8"] Decoding First SIB1\n", ctxt_pP->module_id );
+ nr_decode_SIB1( ctxt_pP, gNB_index, rsrq, rsrp );
+ }
+ }
+
+ break;
+
+ case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
+ if ((NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIStatus&1) == 1) {
+ // SIB1 with schedulingInfoList is available
+ NR_SystemInformation_t *si = NR_UE_rrc_inst[ctxt_pP->module_id].si[gNB_index];
+ memcpy( si,
+ bcch_message->message.choice.c1->choice.systemInformation,
+ sizeof(NR_SystemInformation_t) );
+ LOG_I( RRC, "[UE %"PRIu8"] Decoding SI for frameP %"PRIu32"\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame );
+ nr_decode_SI( ctxt_pP, gNB_index );
+ //if (nfapi_mode == 3)
+ //UE_mac_inst[ctxt_pP->module_id].SI_Decoded = 1;
+ }
+
+ break;
+
+ case NR_BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
+ default:
+ break;
+ }
+ }
+
+ if (nr_rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE_NR) {
+ //if ( (NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL) || (!AMF_MODE_ENABLED)) {
+ rrc_ue_generate_RRCSetupRequest(ctxt_pP, 0);
+ nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_CONNECTING );
+ //}
+ }
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
+ return 0;
+}
+
+//-----------------------------------------------------------------------------
+void
+nr_rrc_ue_process_masterCellGroup(
+ const protocol_ctxt_t *const ctxt_pP,
+ uint8_t gNB_index,
+ OCTET_STRING_t *masterCellGroup
+)
+//-----------------------------------------------------------------------------
+{
+ NR_CellGroupConfig_t *cellGroupConfig = (NR_CellGroupConfig_t *)masterCellGroup;
+ if( cellGroupConfig->spCellConfig != NULL && cellGroupConfig->spCellConfig->reconfigurationWithSync != NULL){
+ //TODO (perform Reconfiguration with sync according to 5.3.5.5.2)
+ //TODO (resume all suspended radio bearers and resume SCG transmission for all radio bearers, if suspended)
+ }
+
+ if( cellGroupConfig->rlc_BearerToReleaseList != NULL){
+ //TODO (perform RLC bearer release as specified in 5.3.5.5.3)
+ }
+
+ if( cellGroupConfig->rlc_BearerToAddModList != NULL){
+ //TODO (perform the RLC bearer addition/modification as specified in 5.3.5.5.4)
+ }
+
+ if( cellGroupConfig->mac_CellGroupConfig != NULL){
+ //TODO (configure the MAC entity of this cell group as specified in 5.3.5.5.5)
+ }
+
+ if( cellGroupConfig->sCellToReleaseList != NULL){
+ //TODO (perform SCell release as specified in 5.3.5.5.8)
+ }
+
+ if( cellGroupConfig->spCellConfig != NULL){
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig) {
+ memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig,cellGroupConfig->spCellConfig,
+ sizeof(struct NR_SpCellConfig));
+ } else {
+ NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->spCellConfig = cellGroupConfig->spCellConfig;
+ }
+ //TODO (configure the SpCell as specified in 5.3.5.5.7)
+ }
+
+ if( cellGroupConfig->sCellToAddModList != NULL){
+ //TODO (perform SCell addition/modification as specified in 5.3.5.5.9)
+ }
+
+ if( cellGroupConfig->ext2->bh_RLC_ChannelToReleaseList_r16 != NULL){
+ //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
+ }
+
+ if( cellGroupConfig->ext2->bh_RLC_ChannelToAddModList_r16 != NULL){
+ //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11)
+ }
+}
+
+/*--------------------------------------------------*/
+static void rrc_ue_generate_RRCSetupComplete(
+ const protocol_ctxt_t *const ctxt_pP,
+ const uint8_t gNB_index,
+ const uint8_t Transaction_id,
+ uint8_t sel_plmn_id){
+
+ uint8_t buffer[100];
+ uint8_t size;
+ const char *nas_msg;
+ int nas_msg_length;
+ if (AMF_MODE_ENABLED) {
+#if ITTI_SIM
+ as_nas_info_t initialNasMsg;
+ generateRegistrationRequest(&initialNasMsg);
+ nas_msg = (char*)initialNasMsg.data;
+ nas_msg_length = initialNasMsg.length;
+#else
+ nas_msg = (char *) NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
+ nas_msg_length = NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
+#endif
+ } else {
+ nas_msg = nr_nas_attach_req_imsi;
+ nas_msg_length = sizeof(nr_nas_attach_req_imsi);
+ }
+ size = do_RRCSetupComplete(ctxt_pP->module_id,buffer,Transaction_id,sel_plmn_id,nas_msg_length,nas_msg);
+ LOG_I(NR_RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCSetupComplete (bytes%d, gNB %d)\n",
+ ctxt_pP->module_id,ctxt_pP->frame, size, gNB_index);
+ LOG_D(RLC,
+ "[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to gNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n",
+ ctxt_pP->frame, ctxt_pP->module_id+NB_RN_INST, size, gNB_index, nr_rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH);
+ // ctxt_pP_local.rnti = ctxt_pP->rnti;
+ rrc_data_req_ue(
+ ctxt_pP,
+ DCCH,
+ nr_rrc_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_UE_SIM, TASK_RRC_GNB_SIM, size);
+ memcpy (message_buffer, buffer, size);
+ message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, UE_RRC_DCCH_DATA_IND);
+ UE_RRC_DCCH_DATA_IND (message_p).rbid = 1;
+ UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ UE_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
+#endif
+}
+
+int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB_INFO *const Srb_info, const uint8_t gNB_index ){
+ NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
+ asn_dec_rval_t dec_rval;
+ int rval=0;
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_IN);
+ // LOG_D(RRC,"[UE %d] Decoding DL-CCCH message (%d bytes), State %d\n",ue_mod_idP,Srb_info->Rx_buffer.payload_size,
+ // NR_UE_rrc_inst[ue_mod_idP].Info[gNB_index].State);
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_DL_CCCH_Message,
+ (void **)&dl_ccch_msg,
+ (uint8_t *)Srb_info->Rx_buffer.Payload,
+ 100,0,0);
+
+ // if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout,&asn_DEF_NR_DL_CCCH_Message,(void *)dl_ccch_msg);
+ // }
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) {
+ LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
+ return -1;
+ }
+
+ if (dl_ccch_msg->message.present == NR_DL_CCCH_MessageType_PR_c1) {
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State == NR_RRC_SI_RECEIVED) {
+ 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",
+ ctxt_pP->module_id,
+ ctxt_pP->frame);
+ rval = 0;
+ break;
+
+ case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
+ LOG_I(NR_RRC,
+ "[UE%d] Frame %d : Logical Channel DL-CCCH (SRB0), Received RRCConnectionReject \n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame);
+ rval = 0;
+ break;
+
+ case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
+ LOG_I(NR_RRC,
+ "[UE%d][RAPROC] Frame %d : Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ ctxt_pP->rnti);
+ // Get configuration
+ // Release T300 timer
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].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_sa_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_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED);
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti;
+ 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;
+
+ default:
+ LOG_E(NR_RRC, "[UE%d] Frame %d : Unknown message\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame);
+ rval = -1;
+ break;
+ }
+ }
+ }
+
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT);
+ return rval;
+}
+
// from NR SRB3
int8_t nr_rrc_ue_decode_NR_DL_DCCH_Message(
- const module_id_t module_id,
- const uint8_t gNB_index,
- const uint8_t *bufferP,
- const uint32_t buffer_len ){
- // uper_decode by nr R15 rrc_connection_reconfiguration
-
- int32_t i;
- NR_DL_DCCH_Message_t *nr_dl_dcch_msg = NULL;
+ const module_id_t module_id,
+ const uint8_t gNB_index,
+ const uint8_t *bufferP,
+ const uint32_t buffer_len ){
+ // uper_decode by nr R15 rrc_connection_reconfiguration
+
+ int32_t i;
+ NR_DL_DCCH_Message_t *nr_dl_dcch_msg = NULL;
+ MessageDef *msg_p;
- asn_dec_rval_t dec_rval = uper_decode( NULL,
- &asn_DEF_NR_DL_DCCH_Message,
- (void**)&nr_dl_dcch_msg,
- (uint8_t *)bufferP,
- buffer_len, 0, 0);
+ asn_dec_rval_t dec_rval = uper_decode( NULL,
+ &asn_DEF_NR_DL_DCCH_Message,
+ (void**)&nr_dl_dcch_msg,
+ (uint8_t *)bufferP,
+ buffer_len, 0, 0);
- if ((dec_rval.code != RC_OK) || (dec_rval.consumed == 0)) {
+ if ((dec_rval.code != RC_OK) || (dec_rval.consumed == 0)) {
+ for (i=0; imessage.present){
+ case NR_DL_DCCH_MessageType_PR_c1:
+ switch(nr_dl_dcch_msg->message.choice.c1->present){
+ case NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration:
+ nr_rrc_ue_process_rrcReconfiguration(module_id,nr_dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration);
+ break;
- printf("\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_NR_DL_DCCH_Message, (void *)nr_dl_dcch_msg, 1 );
- return -1;
- }
-
- if(nr_dl_dcch_msg != NULL){
- switch(nr_dl_dcch_msg->message.present){
- case NR_DL_DCCH_MessageType_PR_c1:
-
- switch(nr_dl_dcch_msg->message.choice.c1->present){
- case NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration:
- nr_rrc_ue_process_rrcReconfiguration(nr_dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration);
- break;
-
- case NR_DL_DCCH_MessageType__c1_PR_NOTHING:
- case NR_DL_DCCH_MessageType__c1_PR_rrcResume:
- case NR_DL_DCCH_MessageType__c1_PR_rrcRelease:
- case NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment:
- case NR_DL_DCCH_MessageType__c1_PR_securityModeCommand:
- case NR_DL_DCCH_MessageType__c1_PR_dlInformationTransfer:
- case NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry:
- case NR_DL_DCCH_MessageType__c1_PR_counterCheck:
- case NR_DL_DCCH_MessageType__c1_PR_mobilityFromNRCommand:
- case NR_DL_DCCH_MessageType__c1_PR_spare7:
- case NR_DL_DCCH_MessageType__c1_PR_spare6:
- case NR_DL_DCCH_MessageType__c1_PR_spare5:
- case NR_DL_DCCH_MessageType__c1_PR_spare4:
- case NR_DL_DCCH_MessageType__c1_PR_spare3:
- case NR_DL_DCCH_MessageType__c1_PR_spare2:
- case NR_DL_DCCH_MessageType__c1_PR_spare1:
- default:
- // not supported or unused
- break;
- }
- break;
- case NR_DL_DCCH_MessageType_PR_NOTHING:
- case NR_DL_DCCH_MessageType_PR_messageClassExtension:
- default:
- // not supported or unused
- break;
+ case NR_DL_DCCH_MessageType__c1_PR_NOTHING:
+ case NR_DL_DCCH_MessageType__c1_PR_rrcResume:
+ case NR_DL_DCCH_MessageType__c1_PR_rrcRelease:
+ msg_p = itti_alloc_new_message(TASK_RRC_NRUE, NAS_CONN_RELEASE_IND);
+ if((nr_dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.present == NR_RRCRelease__criticalExtensions_PR_rrcRelease) &&
+ (nr_dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcRelease)){
+ nr_dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.choice.rrcRelease->deprioritisationReq->deprioritisationTimer =
+ NR_RRCRelease_IEs__deprioritisationReq__deprioritisationTimer_min5;
+ nr_dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.choice.rrcRelease->deprioritisationReq->deprioritisationType =
+ NR_RRCRelease_IEs__deprioritisationReq__deprioritisationType_frequency;
+ }
+ itti_send_msg_to_task(TASK_RRC_NRUE,module_id,msg_p);
+ break;
+
+ case NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment:
+ case NR_DL_DCCH_MessageType__c1_PR_securityModeCommand:
+ case NR_DL_DCCH_MessageType__c1_PR_dlInformationTransfer:
+ case NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry:
+ case NR_DL_DCCH_MessageType__c1_PR_counterCheck:
+ case NR_DL_DCCH_MessageType__c1_PR_mobilityFromNRCommand:
+ case NR_DL_DCCH_MessageType__c1_PR_dlDedicatedMessageSegment_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_ueInformationRequest_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_dlInformationTransferMRDC_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_loggedMeasurementConfiguration_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_spare3:
+ case NR_DL_DCCH_MessageType__c1_PR_spare2:
+ case NR_DL_DCCH_MessageType__c1_PR_spare1:
+ default:
+ // not supported or unused
+ break;
}
-
- // release memory allocation
- SEQUENCE_free( &asn_DEF_NR_DL_DCCH_Message, (void *)nr_dl_dcch_msg, 1 );
- }else{
- // log..
+ break;
+ case NR_DL_DCCH_MessageType_PR_NOTHING:
+ case NR_DL_DCCH_MessageType_PR_messageClassExtension:
+ default:
+ // not supported or unused
+ break;
+ }
+
+ // release memory allocation
+ SEQUENCE_free( &asn_DEF_NR_DL_DCCH_Message, (void *)nr_dl_dcch_msg, 1 );
+ }else{
+ // log..
+ }
+
+ return 0;
+}
+
+
+//-----------------------------------------------------------------------------
+void
+nr_rrc_ue_process_securityModeCommand(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_SecurityModeCommand_t *const securityModeCommand,
+ const uint8_t gNB_index
+)
+//-----------------------------------------------------------------------------
+{
+ asn_enc_rval_t enc_rval;
+ NR_UL_DCCH_Message_t ul_dcch_msg;
+ uint8_t buffer[200];
+ int i, securityMode;
+ LOG_I(NR_RRC,"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), Processing securityModeCommand (eNB %d)\n",
+ ctxt_pP->module_id,ctxt_pP->frame, ctxt_pP->subframe, gNB_index);
+
+ switch (securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm) {
+ case NR_CipheringAlgorithm_nea0:
+ LOG_I(NR_RRC,"[UE %d] Security algorithm is set to nea0\n",
+ ctxt_pP->module_id);
+ securityMode= NR_CipheringAlgorithm_nea0;
+ break;
+
+ case NR_CipheringAlgorithm_nea1:
+ LOG_I(NR_RRC,"[UE %d] Security algorithm is set to nea1\n",ctxt_pP->module_id);
+ securityMode= NR_CipheringAlgorithm_nea1;
+ break;
+
+ case NR_CipheringAlgorithm_nea2:
+ LOG_I(NR_RRC,"[UE %d] Security algorithm is set to nea2\n",
+ ctxt_pP->module_id);
+ securityMode = NR_CipheringAlgorithm_nea2;
+ break;
+
+ default:
+ LOG_I(NR_RRC,"[UE %d] Security algorithm is set to none\n",ctxt_pP->module_id);
+ securityMode = NR_CipheringAlgorithm_spare1;
+ break;
+ }
+
+ switch (*securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm) {
+ case NR_IntegrityProtAlgorithm_nia1:
+ LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia1\n",ctxt_pP->module_id);
+ securityMode |= 1 << 5;
+ break;
+
+ case NR_IntegrityProtAlgorithm_nia2:
+ LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to nia2\n",ctxt_pP->module_id);
+ securityMode |= 1 << 6;
+ break;
+
+ default:
+ LOG_I(NR_RRC,"[UE %d] Integrity protection algorithm is set to none\n",ctxt_pP->module_id);
+ securityMode |= 0x70 ;
+ break;
+ }
+
+ LOG_D(NR_RRC,"[UE %d] security mode is %x \n",ctxt_pP->module_id, securityMode);
+ NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm =
+ securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm;
+ NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm =
+ *securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm;
+ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
+ //memset((void *)&SecurityModeCommand,0,sizeof(SecurityModeCommand_t));
+ ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
+ ul_dcch_msg.message.choice.c1 = calloc(1, sizeof(*ul_dcch_msg.message.choice.c1));
+
+ if (securityMode >= NO_SECURITY_MODE) {
+ LOG_I(NR_RRC, "rrc_ue_process_securityModeCommand, security mode complete case \n");
+ ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_securityModeComplete;
+ } else {
+ LOG_I(NR_RRC, "rrc_ue_process_securityModeCommand, security mode failure case \n");
+ ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_securityModeFailure;
+ }
+
+ uint8_t *kRRCenc = NULL;
+ uint8_t *kUPenc = NULL;
+ uint8_t *kRRCint = NULL;
+ pdcp_t *pdcp_p = NULL;
+ hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE;
+ hashtable_rc_t h_rc;
+ key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti,
+ ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES);
+ h_rc = hashtable_get(pdcp_coll_p, key, (void **) &pdcp_p);
+
+ if (h_rc == HASH_TABLE_OK) {
+ LOG_D(NR_RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %ld\n", key);
+ LOG_D(NR_RRC, "driving kRRCenc, kRRCint and kUPenc from KgNB="
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x\n",
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[0], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[1], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[2], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[3],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[4], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[5], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[6], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[7],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[8], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[9], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[10], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[11],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[12], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[13], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[14], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[15],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[16], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[17], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[18], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[19],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[20], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[21], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[22], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[23],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[24], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[25], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[26], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[27],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[28], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[29], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[30], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[31]);
+ derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
+ derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
+ derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
+
+ if (securityMode != 0xff) {
+ pdcp_config_set_security(ctxt_pP, pdcp_p, 0, 0,
+ NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm
+ | (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
+ kRRCenc, kRRCint, kUPenc);
+ } else {
+ LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x",
+ securityMode);
+ }
+ } else {
+ LOG_I(NR_RRC, "Could not get PDCP instance where key=0x%ld\n", key);
+ }
+
+ if (securityModeCommand->criticalExtensions.present == NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand) {
+ ul_dcch_msg.message.choice.c1->choice.securityModeComplete = CALLOC(1, sizeof(NR_SecurityModeComplete_t));
+ ul_dcch_msg.message.choice.c1->choice.securityModeComplete->rrc_TransactionIdentifier = securityModeCommand->rrc_TransactionIdentifier;
+ ul_dcch_msg.message.choice.c1->choice.securityModeComplete->criticalExtensions.present = NR_SecurityModeComplete__criticalExtensions_PR_securityModeComplete;
+ ul_dcch_msg.message.choice.c1->choice.securityModeComplete->criticalExtensions.choice.securityModeComplete = CALLOC(1, sizeof(NR_SecurityModeComplete_IEs_t));
+ ul_dcch_msg.message.choice.c1->choice.securityModeComplete->criticalExtensions.choice.securityModeComplete->nonCriticalExtension =NULL;
+ LOG_I(NR_RRC,"[UE %d] SFN/SF %d/%d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (gNB %d), rrc_TransactionIdentifier: %ld\n",
+ ctxt_pP->module_id,ctxt_pP->frame, ctxt_pP->subframe, gNB_index, securityModeCommand->rrc_TransactionIdentifier);
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message,
+ NULL,
+ (void *)&ul_dcch_msg,
+ buffer,
+ 100);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
+ }
+
+ LOG_D(NR_RRC, "securityModeComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8);
+
+ for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) {
+ LOG_T(NR_RRC, "%02x.", buffer[i]);
}
- return 0;
+ LOG_T(NR_RRC, "\n");
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_UE_SIM,TASK_RRC_GNB_SIM,
+ (enc_rval.encoded + 7) / 8);
+ memcpy (message_buffer, buffer, (enc_rval.encoded + 7) / 8);
+
+ message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, UE_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = (enc_rval.encoded + 7) / 8;
+ itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
+#else
+ rrc_data_req (
+ ctxt_pP,
+ DCCH,
+ nr_rrc_mui++,
+ SDU_CONFIRM_NO,
+ (enc_rval.encoded + 7) / 8,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+ } else
+ LOG_W(NR_RRC,"securityModeCommand->criticalExtensions.present (%d) != NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand\n",
+ securityModeCommand->criticalExtensions.present);
+}
+
+//-----------------------------------------------------------------------------
+void rrc_ue_generate_RRCSetupRequest( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index ) {
+ uint8_t i=0,rv[6];
+
+ if(NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size ==0) {
+ // Get RRCConnectionRequest, fill random for now
+ // Generate random byte stream for contention resolution
+ for (i=0; i<6; i++) {
+#ifdef SMBV
+ // if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
+ rv[i]=i;
+#else
+ rv[i]=taus()&0xff;
+#endif
+ LOG_T(NR_RRC,"%x.",rv[i]);
+ }
+
+ LOG_T(NR_RRC,"\n");
+ // NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size =
+ // do_RRCSetupRequest(
+ // ctxt_pP->module_id,
+ // (uint8_t *)NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.Payload,
+ // rv);
+ LOG_I(NR_RRC,"[UE %d] : Frame %d, Logical Channel UL-CCCH (SRB0), Generating RRCSetupRequest (bytes %d, eNB %d)\n",
+ ctxt_pP->module_id, ctxt_pP->frame, NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size, gNB_index);
+
+ for (i=0; imodule_id].Srb0[gNB_index].Tx_buffer.payload_size; i++) {
+ LOG_T(NR_RRC,"%x.",NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.Payload[i]);
+ }
+
+ LOG_T(NR_RRC,"\n");
+ /*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
+ UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
+
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_UE_SIM,TASK_RRC_GNB_SIM,
+ NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size);
+ memcpy (message_buffer, (uint8_t*)NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.Payload,
+ NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size);
+ message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, UE_RRC_CCCH_DATA_IND);
+ GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_CCCH_DATA_IND (message_p).size = NR_UE_rrc_inst[ctxt_pP->module_id].Srb0[gNB_index].Tx_buffer.payload_size;
+ itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
+#endif
+ }
+}
+
+//-----------------------------------------------------------------------------
+int32_t
+nr_rrc_ue_establish_srb1(
+ module_id_t ue_mod_idP,
+ frame_t frameP,
+ uint8_t gNB_index,
+ NR_SRB_ToAddMod_t *SRB_config
+)
+//-----------------------------------------------------------------------------
+{
+ // add descriptor from RRC PDU
+ NR_UE_rrc_inst[ue_mod_idP].Srb1[gNB_index].Active = 1;
+ NR_UE_rrc_inst[ue_mod_idP].Srb1[gNB_index].Status = RADIO_CONFIG_OK;//RADIO CFG
+ NR_UE_rrc_inst[ue_mod_idP].Srb1[gNB_index].Srb_info.Srb_id = 1;
+ LOG_I(NR_RRC, "[UE %d], CONFIG_SRB1 %d corresponding to gNB_index %d\n", ue_mod_idP, DCCH, gNB_index);
+ return(0);
+}
+
+//-----------------------------------------------------------------------------
+int32_t
+nr_rrc_ue_establish_srb2(
+ module_id_t ue_mod_idP,
+ frame_t frameP,
+ uint8_t gNB_index,
+ NR_SRB_ToAddMod_t *SRB_config
+)
+//-----------------------------------------------------------------------------
+{
+ // add descriptor from RRC PDU
+ NR_UE_rrc_inst[ue_mod_idP].Srb2[gNB_index].Active = 1;
+ NR_UE_rrc_inst[ue_mod_idP].Srb2[gNB_index].Status = RADIO_CONFIG_OK;//RADIO CFG
+ NR_UE_rrc_inst[ue_mod_idP].Srb2[gNB_index].Srb_info.Srb_id = 2;
+ LOG_I(NR_RRC, "[UE %d], CONFIG_SRB2 %d corresponding to gNB_index %d\n", ue_mod_idP, DCCH1, gNB_index);
+ return(0);
+}
+
+//-----------------------------------------------------------------------------
+int32_t
+nr_rrc_ue_establish_drb(
+ module_id_t ue_mod_idP,
+ frame_t frameP,
+ uint8_t gNB_index,
+ NR_DRB_ToAddMod_t *DRB_config
+)
+//-----------------------------------------------------------------------------
+{
+ // add descriptor from RRC PDU
+ int oip_ifup = 0, ip_addr_offset3 = 0, ip_addr_offset4 = 0;
+ /* avoid gcc warnings */
+ (void)oip_ifup;
+ (void)ip_addr_offset3;
+ (void)ip_addr_offset4;
+ LOG_I(NR_RRC,"[UE %d] Frame %d: processing RRCReconfiguration: reconfiguring DRB %ld\n",
+ ue_mod_idP, frameP, DRB_config->drb_Identity);
+
+ if(!AMF_MODE_ENABLED) {
+ ip_addr_offset3 = 0;
+ ip_addr_offset4 = 1;
+ LOG_I(OIP, "[UE %d] trying to bring up the OAI interface %d, IP X.Y.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP,
+ ip_addr_offset3+ue_mod_idP+1, ip_addr_offset4+ue_mod_idP+1);
+ oip_ifup = nas_config(ip_addr_offset3+ue_mod_idP+1, // interface_id
+ UE_NAS_USE_TUN?1:(ip_addr_offset3+ue_mod_idP+1), // third_octet
+ ip_addr_offset4+ue_mod_idP+1, // fourth_octet
+ "oip"); // interface suffix (when using kernel module)
+
+ if (oip_ifup == 0 && (!UE_NAS_USE_TUN)) { // interface is up --> send a config the DRB
+ LOG_I(OIP, "[UE %d] Config the ue net interface %d to send/receive pkt on DRB %ld to/from the protocol stack\n",
+ ue_mod_idP,
+ ip_addr_offset3+ue_mod_idP,
+ (long int)((gNB_index * NR_maxDRB) + DRB_config->drb_Identity));
+ rb_conf_ipv4(0,//add
+ ue_mod_idP,//cx align with the UE index
+ ip_addr_offset3+ue_mod_idP,//inst num_enb+ue_index
+ (gNB_index * NR_maxDRB) + DRB_config->drb_Identity,//rb
+ 0,//dscp
+ ipv4_address(ip_addr_offset3+ue_mod_idP+1, ip_addr_offset4+ue_mod_idP+1),//saddr
+ ipv4_address(ip_addr_offset3+ue_mod_idP+1, gNB_index+1));//daddr
+ LOG_D(NR_RRC,"[UE %d] State = Attached (gNB %d)\n",ue_mod_idP,gNB_index);
+ }
+ }
+
+ return(0);
+}
+
+//-----------------------------------------------------------------------------
+void
+nr_rrc_ue_process_measConfig(
+ const protocol_ctxt_t *const ctxt_pP,
+ const uint8_t gNB_index,
+ NR_MeasConfig_t *const measConfig
+)
+//-----------------------------------------------------------------------------
+{
+ int i;
+ long ind;
+ NR_MeasObjectToAddMod_t *measObj = NULL;
+ NR_ReportConfigToAddMod_t *reportConfig = NULL;
+
+ if (measConfig->measObjectToRemoveList != NULL) {
+ for (i = 0; i < measConfig->measObjectToRemoveList->list.count; i++) {
+ ind = *measConfig->measObjectToRemoveList->list.array[i];
+ free(NR_UE_rrc_inst[ctxt_pP->module_id].MeasObj[gNB_index][ind-1]);
+ }
+ }
+
+ if (measConfig->measObjectToAddModList != NULL) {
+ LOG_I(NR_RRC, "Measurement Object List is present\n");
+ for (i = 0; i < measConfig->measObjectToAddModList->list.count; i++) {
+ measObj = measConfig->measObjectToAddModList->list.array[i];
+ ind = measConfig->measObjectToAddModList->list.array[i]->measObjectId;
+
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].MeasObj[gNB_index][ind-1]) {
+ LOG_D(NR_RRC, "Modifying measurement object %ld\n",ind);
+ memcpy((char *)NR_UE_rrc_inst[ctxt_pP->module_id].MeasObj[gNB_index][ind-1],
+ (char *)measObj,
+ sizeof(NR_MeasObjectToAddMod_t));
+ } else {
+ LOG_I(NR_RRC, "Adding measurement object %ld\n", ind);
+
+ if (measObj->measObject.present == NR_MeasObjectToAddMod__measObject_PR_measObjectNR) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].MeasObj[gNB_index][ind-1]=measObj;
+ }
+ }
+ }
+
+ LOG_I(NR_RRC, "call rrc_mac_config_req \n");
+ // rrc_mac_config_req_ue
+ }
+
+ if (measConfig->reportConfigToRemoveList != NULL) {
+ for (i = 0; i < measConfig->reportConfigToRemoveList->list.count; i++) {
+ ind = *measConfig->reportConfigToRemoveList->list.array[i];
+ free(NR_UE_rrc_inst[ctxt_pP->module_id].ReportConfig[gNB_index][ind-1]);
+ }
+ }
+
+ if (measConfig->reportConfigToAddModList != NULL) {
+ LOG_I(NR_RRC,"Report Configuration List is present\n");
+ for (i = 0; i < measConfig->reportConfigToAddModList->list.count; i++) {
+ ind = measConfig->reportConfigToAddModList->list.array[i]->reportConfigId;
+ reportConfig = measConfig->reportConfigToAddModList->list.array[i];
+
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].ReportConfig[gNB_index][ind-1]) {
+ LOG_I(NR_RRC, "Modifying Report Configuration %ld\n", ind-1);
+ memcpy((char *)NR_UE_rrc_inst[ctxt_pP->module_id].ReportConfig[gNB_index][ind-1],
+ (char *)measConfig->reportConfigToAddModList->list.array[i],
+ sizeof(NR_ReportConfigToAddMod_t));
+ } else {
+ LOG_D(RRC,"Adding Report Configuration %ld %p \n", ind-1, measConfig->reportConfigToAddModList->list.array[i]);
+ if (reportConfig->reportConfig.present == NR_ReportConfigToAddMod__reportConfig_PR_reportConfigNR) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].ReportConfig[gNB_index][ind-1] = measConfig->reportConfigToAddModList->list.array[i];
+ }
+ }
+ }
+ }
+
+ if (measConfig->measIdToRemoveList != NULL) {
+ for (i = 0; i < measConfig->measIdToRemoveList->list.count; i++) {
+ ind = *measConfig->measIdToRemoveList->list.array[i];
+ free(NR_UE_rrc_inst[ctxt_pP->module_id].MeasId[gNB_index][ind-1]);
+ }
+ }
+
+ if (measConfig->measIdToAddModList != NULL) {
+ for (i = 0; i < measConfig->measIdToAddModList->list.count; i++) {
+ ind = measConfig->measIdToAddModList->list.array[i]->measId;
+
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].MeasId[gNB_index][ind-1]) {
+ LOG_D(NR_RRC, "Modifying Measurement ID %ld\n",ind-1);
+ memcpy((char *)NR_UE_rrc_inst[ctxt_pP->module_id].MeasId[gNB_index][ind-1],
+ (char *)measConfig->measIdToAddModList->list.array[i],
+ sizeof(NR_MeasIdToAddMod_t));
+ } else {
+ LOG_D(NR_RRC, "Adding Measurement ID %ld %p\n", ind-1, measConfig->measIdToAddModList->list.array[i]);
+ NR_UE_rrc_inst[ctxt_pP->module_id].MeasId[gNB_index][ind-1] = measConfig->measIdToAddModList->list.array[i];
+ }
+ }
+ }
+
+ if (measConfig->quantityConfig != NULL) {
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[gNB_index]) {
+ LOG_D(RRC,"Modifying Quantity Configuration \n");
+ memcpy((char *)NR_UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[gNB_index],
+ (char *)measConfig->quantityConfig,
+ sizeof(NR_QuantityConfig_t));
+ } else {
+ LOG_D(NR_RRC, "Adding Quantity configuration\n");
+ NR_UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[gNB_index] = measConfig->quantityConfig;
+ }
+ }
+
+ if (measConfig->measGapConfig != NULL) {
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].measGapConfig[gNB_index]) {
+ memcpy((char *)NR_UE_rrc_inst[ctxt_pP->module_id].measGapConfig[gNB_index],
+ (char *)measConfig->measGapConfig,
+ sizeof(NR_MeasGapConfig_t));
+ } else {
+ NR_UE_rrc_inst[ctxt_pP->module_id].measGapConfig[gNB_index] = measConfig->measGapConfig;
+ }
+ }
+
+ if (measConfig->s_MeasureConfig->present == NR_MeasConfig__s_MeasureConfig_PR_ssb_RSRP) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].s_measure = measConfig->s_MeasureConfig->choice.ssb_RSRP;
+ } else if (measConfig->s_MeasureConfig->present == NR_MeasConfig__s_MeasureConfig_PR_csi_RSRP) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].s_measure = measConfig->s_MeasureConfig->choice.csi_RSRP;
+ }
+}
+
+//-----------------------------------------------------------------------------
+void
+nr_sa_rrc_ue_process_radioBearerConfig(
+ const protocol_ctxt_t *const ctxt_pP,
+ const uint8_t gNB_index,
+ NR_RadioBearerConfig_t *const radioBearerConfig
+)
+//-----------------------------------------------------------------------------
+{
+ long SRB_id, DRB_id;
+ int i, cnt;
+
+ if( radioBearerConfig->srb3_ToRelease != NULL){
+ if( *radioBearerConfig->srb3_ToRelease == TRUE){
+ //TODO (release the PDCP entity and the srb-Identity of the SRB3.)
+ }
+ }
+
+ if (radioBearerConfig->srb_ToAddModList != NULL) {
+ if (radioBearerConfig->securityConfig != NULL) {
+ if (*radioBearerConfig->securityConfig->keyToUse == NR_SecurityConfig__keyToUse_master) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm =
+ radioBearerConfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm;
+ NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm =
+ *radioBearerConfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm;
+ }
+ }
+
+ uint8_t *kRRCenc = NULL;
+ uint8_t *kRRCint = NULL;
+ derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
+ derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
+ // Refresh SRBs
+ // nr_rrc_pdcp_config_asn1_req(ctxt_pP,
+ // radioBearerConfig->srb_ToAddModList,
+ // NULL,
+ // NULL,
+ // NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm |
+ // (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
+ // kRRCenc,
+ // kRRCint,
+ // NULL,
+ // NULL,
+ // NULL,
+ // NULL);
+ // Refresh SRBs
+ // nr_rrc_rlc_config_asn1_req(ctxt_pP,
+ // radioBearerConfig->srb_ToAddModList,
+ // NULL,
+ // NULL,
+ // NULL,
+ // NULL
+ // );
+
+ for (cnt = 0; cnt < radioBearerConfig->srb_ToAddModList->list.count; cnt++) {
+ SRB_id = radioBearerConfig->srb_ToAddModList->list.array[cnt]->srb_Identity;
+ LOG_D(NR_RRC,"[UE %d]: Frame %d SRB config cnt %d (SRB%ld)\n", ctxt_pP->module_id, ctxt_pP->frame, cnt, SRB_id);
+ if (SRB_id == 1) {
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index]) {
+ memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index],
+ radioBearerConfig->srb_ToAddModList->list.array[cnt], sizeof(NR_SRB_ToAddMod_t));
+ } else {
+ NR_UE_rrc_inst[ctxt_pP->module_id].SRB1_config[gNB_index] = radioBearerConfig->srb_ToAddModList->list.array[cnt];
+ nr_rrc_ue_establish_srb1(ctxt_pP->module_id,
+ ctxt_pP->frame,
+ gNB_index,
+ radioBearerConfig->srb_ToAddModList->list.array[cnt]);
+
+ LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 gNB %d) --->][MAC_UE][MOD %02d][]\n",
+ ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
+ // rrc_mac_config_req_ue
+ }
+ } else {
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index]) {
+ memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index],
+ radioBearerConfig->srb_ToAddModList->list.array[cnt], sizeof(NR_SRB_ToAddMod_t));
+ } else {
+ NR_UE_rrc_inst[ctxt_pP->module_id].SRB2_config[gNB_index] = radioBearerConfig->srb_ToAddModList->list.array[cnt];
+ nr_rrc_ue_establish_srb2(ctxt_pP->module_id,
+ ctxt_pP->frame,
+ gNB_index,
+ radioBearerConfig->srb_ToAddModList->list.array[cnt]);
+
+ LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 gNB %d) --->][MAC_UE][MOD %02d][]\n",
+ ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
+ // rrc_mac_config_req_ue
+ }
+ } // srb2
+ }
+ } // srb_ToAddModList
+
+ // Establish DRBs if present
+ if (radioBearerConfig->drb_ToAddModList != NULL) {
+ if ((NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB == NULL) &&
+ (radioBearerConfig->drb_ToAddModList->list.count >= 1)) {
+ NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = malloc(sizeof(rb_id_t));
+ *NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB = radioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity;
+ }
+
+ for (cnt = 0; cnt < radioBearerConfig->drb_ToAddModList->list.count; cnt++) {
+ DRB_id = radioBearerConfig->drb_ToAddModList->list.array[cnt]->drb_Identity;
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]) {
+ memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1],
+ radioBearerConfig->drb_ToAddModList->list.array[cnt], sizeof(NR_DRB_ToAddMod_t));
+ } else {
+ LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
+ NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1] = radioBearerConfig->drb_ToAddModList->list.array[cnt];
+ }
+ }
+
+ uint8_t *kUPenc = NULL;
+ derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
+ MSC_LOG_TX_MESSAGE(
+ MSC_RRC_UE,
+ MSC_PDCP_UE,
+ NULL,
+ 0,
+ MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security %X)",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ctxt_pP->rnti,
+ NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm |
+ (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4));
+
+ // Refresh DRBs
+ // nr_rrc_pdcp_config_asn1_req(ctxt_pP,
+ // NULL,
+ // radioBearerConfig->drb_ToAddModList,
+ // NULL,
+ // NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm |
+ // (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
+ // NULL,
+ // NULL,
+ // kUPenc,
+ // NULL,
+ // NR_UE_rrc_inst[ctxt_pP->module_id].defaultDRB,
+ // NULL);
+ // Refresh DRBs
+ // nr_rrc_rlc_config_asn1_req(ctxt_pP,
+ // NULL,
+ // radioBearerConfig->drb_ToAddModList,
+ // NULL,
+ // NULL,
+ // NULL
+ // );
+ } // drb_ToAddModList
+
+ if (radioBearerConfig->drb_ToReleaseList != NULL) {
+ for (i = 0; i < radioBearerConfig->drb_ToReleaseList->list.count; i++) {
+ DRB_id = *radioBearerConfig->drb_ToReleaseList->list.array[i];
+ free(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1]);
+ }
+ }
+
+ NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State = NR_RRC_CONNECTED;
+ LOG_I(NR_RRC,"[UE %d] State = NR_RRC_CONNECTED (gNB %d)\n", ctxt_pP->module_id, gNB_index);
+}
+
+//-----------------------------------------------------------------------------
+void
+rrc_ue_process_rrcReconfiguration(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_RRCReconfiguration_t *rrcReconfiguration,
+ uint8_t gNB_index
+)
+//-----------------------------------------------------------------------------
+{
+ LOG_I(NR_RRC, "[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing RRCReconfiguration (gNB %d)\n",
+ ctxt_pP->module_id, ctxt_pP->frame, gNB_index);
+
+ NR_RRCReconfiguration_IEs_t *ie = NULL;
+
+ if (rrcReconfiguration->criticalExtensions.present
+ == NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration) {
+ ie = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
+ if (ie->measConfig != NULL) {
+ LOG_I(NR_RRC, "Measurement Configuration is present\n");
+ nr_rrc_ue_process_measConfig(ctxt_pP, gNB_index, ie->measConfig);
+ }
+
+ if (ie->radioBearerConfig != NULL) {
+ LOG_I(NR_RRC, "radio Bearer Configuration is present\n");
+ nr_sa_rrc_ue_process_radioBearerConfig(ctxt_pP, gNB_index, ie->radioBearerConfig);
+ }
+
+ /* Check if there is dedicated NAS information to forward to NAS */
+ if (ie->nonCriticalExtension->dedicatedNAS_MessageList != NULL) {
+ int list_count;
+ uint32_t pdu_length;
+ uint8_t *pdu_buffer;
+ MessageDef *msg_p;
+
+ for (list_count = 0; list_count < ie->nonCriticalExtension->dedicatedNAS_MessageList->list.count; list_count++) {
+ pdu_length = ie->nonCriticalExtension->dedicatedNAS_MessageList->list.array[list_count]->size;
+ pdu_buffer = ie->nonCriticalExtension->dedicatedNAS_MessageList->list.array[list_count]->buf;
+ msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CONN_ESTABLI_CNF);
+ NAS_CONN_ESTABLI_CNF(msg_p).errCode = AS_SUCCESS;
+ NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length = pdu_length;
+ NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data = pdu_buffer;
+ itti_send_msg_to_task(TASK_NAS_UE, ctxt_pP->instance, msg_p);
+ }
+
+ free (ie->nonCriticalExtension->dedicatedNAS_MessageList);
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void nr_rrc_ue_generate_RRCReconfigurationComplete( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index, const uint8_t Transaction_id ) {
+ uint8_t buffer[32], size;
+ size = do_NR_RRCReconfigurationComplete(ctxt_pP, buffer, Transaction_id);
+ LOG_I(NR_RRC,PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel UL-DCCH (SRB1), Generating RRCReconfigurationComplete (bytes %d, gNB_index %d)\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), size, gNB_index);
+ LOG_D(RLC,
+ "[FRAME %05d][RRC_UE][INST %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCReconfigurationComplete to gNB %d MUI %d) --->][PDCP][INST %02d][RB %02d]\n",
+ ctxt_pP->frame,
+ UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id),
+ size,
+ gNB_index,
+ nr_rrc_mui,
+ UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id),
+ DCCH);
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_UE_SIM,TASK_RRC_GNB_SIM,size);
+ memcpy (message_buffer, buffer, size);
+
+ message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, UE_RRC_DCCH_DATA_IND);
+ UE_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ UE_RRC_DCCH_DATA_IND (message_p).size = size;
+ itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
+#else
+ rrc_data_req_ue (
+ ctxt_pP,
+ DCCH,
+ nr_rrc_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
}
+
+// from NR SRB1
+//-----------------------------------------------------------------------------
+int
+nr_rrc_ue_decode_dcch(
+ const protocol_ctxt_t *const ctxt_pP,
+ const srb_id_t Srb_id,
+ const uint8_t *const Buffer,
+ const uint8_t gNB_indexP
+)
+//-----------------------------------------------------------------------------
+{
+ asn_dec_rval_t dec_rval;
+ NR_DL_DCCH_Message_t *dl_dcch_msg = NULL;
+ MessageDef *msg_p;
+
+ if (Srb_id != 1) {
+ LOG_E(NR_RRC,"[UE %d] Frame %d: Received message on DL-DCCH (SRB%ld), should not have ...\n",
+ ctxt_pP->module_id, ctxt_pP->frame, Srb_id);
+ return -1;
+ } else {
+ LOG_D(NR_RRC, "Received message on SRB%ld\n", Srb_id);
+ }
+
+ LOG_D(NR_RRC, "Decoding DL-DCCH Message\n");
+ dec_rval = uper_decode( NULL,
+ &asn_DEF_NR_DL_DCCH_Message,
+ (void **)&dl_dcch_msg,
+ Buffer,
+ RRC_BUF_SIZE,
+ 0,
+ 0);
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(NR_RRC, "Failed to decode DL-DCCH (%zu bytes)\n", dec_rval.consumed);
+ return -1;
+ }
+
+ // if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message,(void *)dl_dcch_msg);
+ // }
+
+ if (dl_dcch_msg->message.present == NR_DL_DCCH_MessageType_PR_c1) {
+ switch (dl_dcch_msg->message.choice.c1->present) {
+ case NR_DL_DCCH_MessageType__c1_PR_NOTHING:
+ LOG_I(NR_RRC, "Received PR_NOTHING on DL-DCCH-Message\n");
+ break;
+
+ case NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration:
+ rrc_ue_process_rrcReconfiguration(ctxt_pP,
+ dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration,
+ gNB_indexP);
+ nr_rrc_ue_generate_RRCReconfigurationComplete(ctxt_pP,
+ gNB_indexP,
+ dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier);
+ break;
+
+ case NR_DL_DCCH_MessageType__c1_PR_rrcResume:
+ case NR_DL_DCCH_MessageType__c1_PR_rrcRelease:
+ msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CONN_RELEASE_IND);
+
+ if((dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.present == NR_RRCRelease__criticalExtensions_PR_rrcRelease) &&
+ (dl_dcch_msg->message.choice.c1->present == NR_DL_DCCH_MessageType__c1_PR_rrcRelease)){
+ dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.choice.rrcRelease->deprioritisationReq->deprioritisationTimer =
+ NR_RRCRelease_IEs__deprioritisationReq__deprioritisationTimer_min5;
+ dl_dcch_msg->message.choice.c1->choice.rrcRelease->criticalExtensions.choice.rrcRelease->deprioritisationReq->deprioritisationType =
+ NR_RRCRelease_IEs__deprioritisationReq__deprioritisationType_frequency;
+ }
+
+ itti_send_msg_to_task(TASK_NAS_UE, ctxt_pP->instance, msg_p);
+ break;
+ case NR_DL_DCCH_MessageType__c1_PR_ueCapabilityEnquiry:
+ LOG_I(RRC, "[UE %d] Received Capability Enquiry (gNB %d)\n",
+ ctxt_pP->module_id,gNB_indexP);
+ nr_rrc_ue_process_ueCapabilityEnquiry(
+ ctxt_pP,
+ dl_dcch_msg->message.choice.c1->choice.ueCapabilityEnquiry,
+ gNB_indexP);
+ break;
+ case NR_DL_DCCH_MessageType__c1_PR_rrcReestablishment:
+ case NR_DL_DCCH_MessageType__c1_PR_dlInformationTransfer:
+ case NR_DL_DCCH_MessageType__c1_PR_mobilityFromNRCommand:
+ case NR_DL_DCCH_MessageType__c1_PR_dlDedicatedMessageSegment_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_ueInformationRequest_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_dlInformationTransferMRDC_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_loggedMeasurementConfiguration_r16:
+ case NR_DL_DCCH_MessageType__c1_PR_spare3:
+ case NR_DL_DCCH_MessageType__c1_PR_spare2:
+ case NR_DL_DCCH_MessageType__c1_PR_spare1:
+ case NR_DL_DCCH_MessageType__c1_PR_counterCheck:
+ break;
+ case NR_DL_DCCH_MessageType__c1_PR_securityModeCommand:
+ LOG_I(RRC, "[UE %d] Received securityModeCommand (gNB %d)\n",
+ ctxt_pP->module_id, gNB_indexP);
+ nr_rrc_ue_process_securityModeCommand(
+ ctxt_pP,
+ dl_dcch_msg->message.choice.c1->choice.securityModeCommand,
+ gNB_indexP);
+
+ break;
+ }
+ }
+ return 0;
+}
+
+//-----------------------------------------------------------------------------
+void *rrc_nrue_task( void *args_p ) {
+ MessageDef *msg_p;
+ instance_t instance;
+ unsigned int ue_mod_id;
+ int result;
+ NR_SRB_INFO *srb_info_p;
+ protocol_ctxt_t ctxt;
+ itti_mark_task_ready (TASK_RRC_NRUE);
+
+ while(1) {
+ // Wait for a message
+ itti_receive_msg (TASK_RRC_NRUE, &msg_p);
+ instance = ITTI_MSG_INSTANCE (msg_p);
+ ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance);
+
+ switch (ITTI_MSG_ID(msg_p)) {
+ case TERMINATE_MESSAGE:
+ LOG_W(NR_RRC, " *** Exiting RRC thread\n");
+ itti_exit_task ();
+ break;
+
+ case MESSAGE_TEST:
+ LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+
+ case NR_RRC_MAC_BCCH_DATA_IND:
+ LOG_D(NR_RRC, "[UE %d] Received %s: frameP %d, gNB %d\n", ue_mod_id, ITTI_MSG_NAME (msg_p),
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index);
+ // PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0);
+ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NOT_A_RNTI, NR_RRC_MAC_BCCH_DATA_IND (msg_p).frame, 0,NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index);
+ nr_decode_BCCH_DLSCH_Message (&ctxt,
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index,
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).sdu,
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size,
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrq,
+ NR_RRC_MAC_BCCH_DATA_IND (msg_p).rsrp);
+
+ case NR_RRC_MAC_CCCH_DATA_IND:
+ LOG_D(NR_RRC, "[UE %d] RNTI %x Received %s: frameP %d, gNB %d\n",
+ ue_mod_id,
+ NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti,
+ ITTI_MSG_NAME (msg_p),
+ NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame,
+ NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
+ srb_info_p = &NR_UE_rrc_inst[ue_mod_id].Srb0[NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index];
+ memcpy (srb_info_p->Rx_buffer.Payload, NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu,
+ NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
+ srb_info_p->Rx_buffer.payload_size = NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
+ // PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, RRC_MAC_CCCH_DATA_IND (msg_p).rnti, RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0);
+ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, NR_RRC_MAC_CCCH_DATA_IND (msg_p).frame, 0, NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
+ nr_rrc_ue_decode_ccch (&ctxt,
+ srb_info_p,
+ NR_RRC_MAC_CCCH_DATA_IND (msg_p).gnb_index);
+ break;
+
+ /* PDCP messages */
+ case NR_RRC_DCCH_DATA_IND:
+ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, NR_RRC_DCCH_DATA_IND (msg_p).module_id, GNB_FLAG_NO, NR_RRC_DCCH_DATA_IND (msg_p).rnti, NR_RRC_DCCH_DATA_IND (msg_p).frame, 0,NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
+ LOG_D(NR_RRC, "[UE %d] Received %s: frameP %d, DCCH %d, gNB %d\n",
+ NR_RRC_DCCH_DATA_IND (msg_p).module_id,
+ ITTI_MSG_NAME (msg_p),
+ NR_RRC_DCCH_DATA_IND (msg_p).frame,
+ NR_RRC_DCCH_DATA_IND (msg_p).dcch_index,
+ NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
+ LOG_D(NR_RRC, PROTOCOL_RRC_CTXT_UE_FMT"Received %s DCCH %d, gNB %d\n",
+ PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),
+ ITTI_MSG_NAME (msg_p),
+ NR_RRC_DCCH_DATA_IND (msg_p).dcch_index,
+ NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
+ nr_rrc_ue_decode_dcch (
+ &ctxt,
+ NR_RRC_DCCH_DATA_IND (msg_p).dcch_index,
+ NR_RRC_DCCH_DATA_IND (msg_p).sdu_p,
+ NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
+ break;
+
+ default:
+ LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+ }
+ LOG_I(NR_RRC, "[UE %d] RRC Status %d\n", ue_mod_id, nr_rrc_get_state(ue_mod_id));
+ result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+ msg_p = NULL;
+ }
+}
+void nr_rrc_ue_process_sidelink_radioResourceConfig(
+ module_id_t Mod_idP,
+ uint8_t gNB_index,
+ NR_SetupRelease_SL_ConfigDedicatedNR_r16_t *sl_ConfigDedicatedNR
+)
+{
+ //process sl_CommConfig, configure MAC/PHY for transmitting SL communication (RRC_CONNECTED)
+ if (sl_ConfigDedicatedNR != NULL) {
+ switch (sl_ConfigDedicatedNR->present){
+ case NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_setup:
+ //TODO
+ break;
+ case NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_release:
+ break;
+ case NR_SetupRelease_SL_ConfigDedicatedNR_r16_PR_NOTHING:
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void
+nr_rrc_ue_process_ueCapabilityEnquiry(
+ const protocol_ctxt_t *const ctxt_pP,
+ NR_UECapabilityEnquiry_t *UECapabilityEnquiry,
+ uint8_t gNB_index
+)
+//-----------------------------------------------------------------------------
+{
+ asn_enc_rval_t enc_rval;
+ NR_UL_DCCH_Message_t ul_dcch_msg;
+ NR_UE_CapabilityRAT_Container_t ue_CapabilityRAT_Container;
+ uint8_t buffer[200];
+ int i;
+ LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry (gNB %d)\n",
+ ctxt_pP->module_id,
+ ctxt_pP->frame,
+ gNB_index);
+ memset((void *)&ul_dcch_msg,0,sizeof(NR_UL_DCCH_Message_t));
+ memset((void *)&ue_CapabilityRAT_Container,0,sizeof(NR_UE_CapabilityRAT_Container_t));
+ ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
+ ul_dcch_msg.message.choice.c1 = CALLOC(1, sizeof(struct NR_UL_DCCH_MessageType__c1));
+ ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation;
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation = CALLOC(1, sizeof(struct NR_UECapabilityInformation));
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->rrc_TransactionIdentifier = UECapabilityEnquiry->rrc_TransactionIdentifier;
+ ue_CapabilityRAT_Container.rat_Type = NR_RAT_Type_nr;
+ NR_UE_NR_Capability_t* UE_Capability_nr;
+ UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
+ NR_BandNR_t *nr_bandnr;
+ nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
+ nr_bandnr->bandNR = 1;
+ ASN_SEQUENCE_ADD(
+ &UE_Capability_nr->rf_Parameters.supportedBandListNR.list,
+ nr_bandnr);
+ OAI_NR_UECapability_t *UECap;
+ UECap = CALLOC(1,sizeof(OAI_NR_UECapability_t));
+ UECap->UE_NR_Capability = UE_Capability_nr;
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,(void *)UE_Capability_nr);
+ }
+
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_NR_Capability,
+ NULL,
+ (void *)UE_Capability_nr,
+ &UECap->sdu[0],
+ MAX_UE_NR_CAPABILITY_SIZE);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ UECap->sdu_size = (enc_rval.encoded + 7) / 8;
+ LOG_I(PHY, "[RRC]UE NR Capability encoded, %d bytes (%zd bits)\n",
+ UECap->sdu_size, enc_rval.encoded + 7);
+
+ NR_UE_rrc_inst[ctxt_pP->module_id].UECap = UECap;
+ NR_UE_rrc_inst[ctxt_pP->module_id].UECapability = UECap->sdu;
+ NR_UE_rrc_inst[ctxt_pP->module_id].UECapability_size = UECap->sdu_size;
+ OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container.ue_CapabilityRAT_Container,
+ (const char *)NR_UE_rrc_inst[ctxt_pP->module_id].UECapability,
+ NR_UE_rrc_inst[ctxt_pP->module_id].UECapability_size);
+ // ue_CapabilityRAT_Container.ueCapabilityRAT_Container.buf = UE_rrc_inst[ue_mod_idP].UECapability;
+ // ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size;
+ AssertFatal(UECapabilityEnquiry->criticalExtensions.present == NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry,
+ "UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n",
+ UECapabilityEnquiry->criticalExtensions.present,NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry);
+
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.present = NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation;
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation = CALLOC(1, sizeof(struct NR_UECapabilityInformation_IEs));
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList = CALLOC(1, sizeof(struct NR_UE_CapabilityRAT_ContainerList));
+ ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list.count = 0;
+
+ for (i=0; icriticalExtensions.choice.ueCapabilityEnquiry->ue_CapabilityRAT_RequestList.list.count; i++) {
+ if (UECapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry->ue_CapabilityRAT_RequestList.list.array[i]->rat_Type
+ == NR_RAT_Type_nr) {
+ ASN_SEQUENCE_ADD(
+ &ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList->list,
+ &ue_CapabilityRAT_Container);
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *) &ul_dcch_msg, buffer, 100);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+
+ if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+ xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
+ }
+
+ LOG_I(RRC,"UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
+#ifdef ITTI_SIM
+ MessageDef *message_p;
+ uint8_t *message_buffer;
+ message_buffer = itti_malloc (TASK_RRC_UE_SIM,TASK_RRC_GNB_SIM,
+ (enc_rval.encoded + 7) / 8);
+ memcpy (message_buffer, buffer, (enc_rval.encoded + 7) / 8);
+
+ message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, UE_RRC_DCCH_DATA_IND);
+ GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
+ GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
+ GNB_RRC_DCCH_DATA_IND (message_p).size = (enc_rval.encoded + 7) / 8;
+ itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
+#else
+ rrc_data_req_ue (
+ ctxt_pP,
+ DCCH,
+ nr_rrc_mui++,
+ SDU_CONFIRM_NO,
+ (enc_rval.encoded + 7) / 8,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
+#endif
+ }
+ }
+}
diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h
index 6481fb0cea..a2c66e4961 100644
--- a/openair2/RRC/NR_UE/rrc_defs.h
+++ b/openair2/RRC/NR_UE/rrc_defs.h
@@ -53,8 +53,15 @@
#include "NR_MIB.h"
#include "NR_BCCH-BCH-Message.h"
#include "NR_DL-DCCH-Message.h"
+#include "../NR/nr_rrc_defs.h"
#define NB_NR_UE_INST 1
+#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
+#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE
+
+#define MAX_MEAS_OBJ 6
+#define MAX_MEAS_CONFIG 6
+#define MAX_MEAS_ID 6
typedef uint32_t channel_t;
@@ -63,14 +70,65 @@ typedef enum {
nr_RadioBearerConfigX_r15=1
} nsa_message_t;
+#define MAX_UE_NR_CAPABILITY_SIZE 255
+typedef struct OAI_NR_UECapability_s {
+ uint8_t sdu[MAX_UE_NR_CAPABILITY_SIZE];
+ uint8_t sdu_size;
+ NR_UE_NR_Capability_t *UE_NR_Capability;
+} OAI_NR_UECapability_t;
+
typedef struct NR_UE_RRC_INST_s {
NR_MeasConfig_t *meas_config;
NR_CellGroupConfig_t *cell_group_config;
NR_RadioBearerConfig_t *radio_bearer_config;
-
+
+ NR_MeasObjectToAddMod_t *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ];
+ NR_ReportConfigToAddMod_t *ReportConfig[NB_CNX_UE][MAX_MEAS_CONFIG];
+ NR_QuantityConfig_t *QuantityConfig[NB_CNX_UE];
+ NR_MeasIdToAddMod_t *MeasId[NB_CNX_UE][MAX_MEAS_ID];
+ NR_MeasGapConfig_t *measGapConfig[NB_CNX_UE];
+ NR_RSRP_Range_t s_measure;
+ NR_SRB_ToAddMod_t *SRB1_config[NB_CNX_UE];
+ NR_SRB_ToAddMod_t *SRB2_config[NB_CNX_UE];
+ NR_DRB_ToAddMod_t *DRB_config[NB_CNX_UE][8];
+ rb_id_t *defaultDRB; // remember the ID of the default DRB
+
+ NR_SRB_INFO Srb0[NB_SIG_CNX_UE];
+ NR_SRB_INFO_TABLE_ENTRY Srb1[NB_CNX_UE];
+ NR_SRB_INFO_TABLE_ENTRY Srb2[NB_CNX_UE];
+
+ uint8_t MBMS_flag;
+ OAI_NR_UECapability_t *UECap;
+ uint8_t *UECapability;
+ uint8_t UECapability_size;
+
+ 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];
+
NR_MIB_t *mib;
-
+
+ /* KeNB as computed from parameters within USIM card */
+ uint8_t kgnb[32];
+ 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;
@@ -118,7 +176,11 @@ typedef struct NR_UE_RRC_INST_s {
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;
+ Rrc_Sub_State_NR_t nrRrcSubState;
+ as_nas_info_t initialNasMsg;
} NR_UE_RRC_INST_t;
#endif
diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h
index 7bc7e4b90c..cb1c6a117f 100644
--- a/openair2/RRC/NR_UE/rrc_proto.h
+++ b/openair2/RRC/NR_UE/rrc_proto.h
@@ -59,12 +59,12 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char*);
\param size length of buffer*/
//TODO check to use which one
//int8_t nr_rrc_ue_decode_rrcReconfiguration(const uint8_t *buffer, const uint32_t size);
-int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const uint8_t *buffer, const uint32_t size);
+int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const module_id_t module_id, const uint8_t *buffer, const uint32_t size);
/**\brief Process NR RRC connection reconfiguration via SRB3
\param rrcReconfiguration decoded rrc connection reconfiguration*/
-int8_t nr_rrc_ue_process_rrcReconfiguration(NR_RRCReconfiguration_t *rrcReconfiguration);
+int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCReconfiguration_t *rrcReconfiguration);
/**\prief Process measurement config from NR RRC connection reconfiguration message
\param meas_config measurement configuration*/
@@ -73,7 +73,7 @@ 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(NR_CellGroupConfig_t *cell_group_config);
+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*/
@@ -114,6 +114,16 @@ int8_t mac_rrc_nr_data_req_ue(const module_id_t Mod_idP,
const rb_id_t Srb_id,
uint8_t *const buffer_pP);
+
+/**\brief RRC UE task.
+ \param void *args_p Pointer on arguments to start the task. */
+void *rrc_nrue_task(void *args_p);
+
+/**\brief RRC UE generate RRCSetupRequest message.
+ \param ctxt_pP protocol context
+ \param gNB_index gNB index */
+void rrc_ue_generate_RRCSetupRequest( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index );
+
/** @}*/
#endif
diff --git a/openair2/SDAP/nr_sdap/sdap_gNB.c b/openair2/SDAP/nr_sdap/sdap_gNB.c
new file mode 100644
index 0000000000..ad84e4c273
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/sdap_gNB.c
@@ -0,0 +1,30 @@
+/*
+ * 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 sdap_gNB.c
+ * \brief sdap tasks for gNB
+ * \author Konstantinos Alexandris , Cedric Roux , Navid Nikaein
+ * \date 2018
+ * \version 1.0
+ */
+#define SDAP_GNB
+#define SDAP_GNB_C
+
diff --git a/openair2/SIMULATION/NR_RRC/itti_sim.c b/openair2/SIMULATION/NR_RRC/itti_sim.c
new file mode 100644
index 0000000000..d9352f2d0a
--- /dev/null
+++ b/openair2/SIMULATION/NR_RRC/itti_sim.c
@@ -0,0 +1,649 @@
+/*
+ * 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 itti_sim.c
+ * \brief simulator for itti message from node to UE
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+
+
+#include "T.h"
+
+#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
+#include
+
+#include "msc.h"
+
+#include "common/ran_context.h"
+
+#include "common/config/config_userapi.h"
+#include "common/utils/load_module_shlib.h"
+#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
+
+#include "PHY/phy_vars.h"
+#include "SCHED/sched_common_vars.h"
+#include "LAYER2/MAC/mac_vars.h"
+#include "RRC/LTE/rrc_vars.h"
+#include "gnb_config.h"
+#include "SIMULATION/TOOLS/sim.h"
+
+#ifdef SMBV
+#include "PHY/TOOLS/smbv.h"
+unsigned short config_frames[4] = {2,9,11,13};
+#endif
+
+#include "common/utils/LOG/log.h"
+#include "common/utils/LOG/vcd_signal_dumper.h"
+#include "UTIL/OPT/opt.h"
+
+#ifndef OPENAIR2
+ #include "UTIL/OTG/otg_vars.h"
+#endif
+
+#include "intertask_interface.h"
+
+
+#include "system.h"
+#include
+#include "PHY/TOOLS/phy_scope_interface.h"
+#include "PHY/TOOLS/nr_phy_scope.h"
+#include "stats.h"
+#include "nr-softmodem.h"
+#include "executables/softmodem-common.h"
+#include "executables/thread-common.h"
+#include "NB_IoT_interface.h"
+#include "x2ap_eNB.h"
+#include "ngap_gNB.h"
+#include "RRC/NR_UE/rrc_proto.h"
+#include "RRC/NR_UE/rrc_vars.h"
+#include "openair3/NAS/UE/nas_ue_task.h"
+
+pthread_cond_t nfapi_sync_cond;
+pthread_mutex_t nfapi_sync_mutex;
+int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
+
+uint8_t nfapi_mode = 0; // Default to monolithic mode
+uint32_t target_dl_mcs = 28;
+uint32_t target_ul_mcs = 20;
+uint32_t timing_advance = 0;
+uint64_t num_missed_slots=0;
+
+int split73=0;
+void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
+ AssertFatal(false, "Must not be called in this context\n");
+}
+
+pthread_cond_t sync_cond;
+pthread_mutex_t sync_mutex;
+int sync_var=-1; //!< protected by mutex \ref sync_mutex.
+int config_sync_var=-1;
+
+openair0_config_t openair0_cfg[MAX_CARDS];
+
+volatile int start_gNB = 0;
+volatile int oai_exit = 0;
+
+//static int wait_for_sync = 0;
+
+unsigned int mmapped_dma=0;
+int single_thread_flag=1;
+
+int8_t threequarter_fs=0;
+
+uint64_t downlink_frequency[MAX_NUM_CCs][4];
+int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
+
+//Temp fix for inexistent NR upper layer
+unsigned char NB_gNB_INST = 1;
+
+static char *itti_dump_file = NULL;
+
+int UE_scan = 1;
+int UE_scan_carrier = 0;
+runmode_t mode = normal_txrx;
+static double snr_dB=20;
+
+FILE *input_fd=NULL;
+
+int chain_offset=0;
+
+
+uint8_t dci_Format = 0;
+uint8_t agregation_Level =0xFF;
+
+uint8_t nb_antenna_tx = 1;
+uint8_t nb_antenna_rx = 1;
+
+char ref[128] = "internal";
+char channels[128] = "0";
+
+int otg_enabled;
+
+extern void *udp_eNB_task(void *args_p);
+
+int transmission_mode=1;
+int emulate_rf = 0;
+int numerology = 0;
+int usrp_tx_thread = 0;
+
+
+double cpuf;
+
+extern char uecap_xer[1024];
+char uecap_xer_in=0;
+
+/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
+ * this is very hackish - find a proper solution
+ */
+uint8_t abstraction_flag=0;
+
+/* forward declarations */
+void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs], NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]);
+
+/*---------------------BMC: timespec helpers -----------------------------*/
+
+struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
+struct timespec max_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
+
+struct timespec clock_difftime(struct timespec start, struct timespec end) {
+ struct timespec temp;
+
+ if ((end.tv_nsec-start.tv_nsec)<0) {
+ temp.tv_sec = end.tv_sec-start.tv_sec-1;
+ temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
+ } else {
+ temp.tv_sec = end.tv_sec-start.tv_sec;
+ temp.tv_nsec = end.tv_nsec-start.tv_nsec;
+ }
+
+ return temp;
+}
+
+
+
+#define KNRM "\x1B[0m"
+#define KRED "\x1B[31m"
+#define KGRN "\x1B[32m"
+#define KBLU "\x1B[34m"
+#define RESET "\033[0m"
+
+
+void exit_function(const char *file, const char *function, const int line, const char *s) {
+ int ru_id;
+
+ if (s != NULL) {
+ printf("%s:%d %s() Exiting OAI softmodem: %s\n",file,line, function, s);
+ }
+
+ oai_exit = 1;
+
+ if (RC.ru == NULL)
+ exit(-1); // likely init not completed, prevent crash or hang, exit now...
+
+ for (ru_id=0; ru_idrfdevice.trx_end_func) {
+ RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
+ RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
+ }
+
+ if (RC.ru[ru_id] && RC.ru[ru_id]->ifdevice.trx_end_func) {
+ RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
+ RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
+ }
+ }
+
+ sleep(1); //allow lte-softmodem threads to exit first
+ exit(1);
+}
+
+void wait_gNBs(void) {
+ int i;
+ int waiting=1;
+
+ while (waiting==1) {
+ printf("Waiting for gNB L1 instances to all get configured ... sleeping 50ms (nb_nr_sL1_inst %d)\n",RC.nb_nr_L1_inst);
+ usleep(50*1000);
+ waiting=0;
+
+ for (i=0; iconfigured==0) {
+ waiting=1;
+ break;
+ }
+ }
+ }
+
+ printf("gNB L1 are configured\n");
+}
+
+void wait_RUs(void) {
+ LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
+ // wait for all RUs to be configured over fronthaul
+ pthread_mutex_lock(&RC.ru_mutex);
+
+ while (RC.ru_mask>0) {
+ pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex);
+ printf("RC.ru_mask:%02lx\n", RC.ru_mask);
+ }
+
+ pthread_mutex_unlock(&RC.ru_mutex);
+ LOG_I(PHY,"RUs configured\n");
+}
+
+
+int stop_L1L2(module_id_t gnb_id) {
+ return 0;
+}
+
+int restart_L1L2(module_id_t gnb_id) {
+ return 0;
+}
+
+int create_gNB_tasks(uint32_t gnb_nb) {
+ LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb);
+ itti_wait_ready(1);
+
+
+ if (gnb_nb > 0) {
+ if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
+ LOG_E(SCTP, "Create task for SCTP failed\n");
+ return -1;
+ }
+ if (is_x2ap_enabled()) {
+ if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
+ LOG_E(X2AP, "Create task for X2AP failed\n");
+ }
+ }
+ else {
+ LOG_I(X2AP, "X2AP is disabled.\n");
+ }
+ }
+
+ if (AMF_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0)) {
+ if (gnb_nb > 0) {
+ if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
+ LOG_E(S1AP, "Create task for NGAP failed\n");
+ return -1;
+ }
+
+
+ if(!emulate_rf){
+ if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) {
+ LOG_E(UDP_, "Create task for UDP failed\n");
+ return -1;
+ }
+ }
+
+ if (itti_create_task (TASK_GTPV1_U, >pv1u_gNB_task, NULL) < 0) {
+ LOG_E(GTPU, "Create task for GTPV1U failed\n");
+ return -1;
+ }
+ }
+ }
+
+
+ if (gnb_nb > 0) {
+ if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
+ LOG_E(GNB_APP, "Create task for gNB APP failed\n");
+ return -1;
+ }
+ LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
+
+ if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
+ LOG_E(NR_RRC, "Create task for NR RRC gNB failed\n");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+static void get_options(void) {
+
+
+ paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
+
+ CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
+ get_common_options(SOFTMODEM_GNB_BIT );
+ config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
+ CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
+
+
+
+
+ if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
+ memset((void *)&RC,0,sizeof(RC));
+ /* Read RC configuration file */
+ NRRCConfig();
+ NB_gNB_INST = RC.nb_nr_inst;
+ NB_RU = RC.nb_RU;
+ printf("Configuration: nb_rrc_inst %d, nb_nr_L1_inst %d, nb_ru %hhu\n",NB_gNB_INST,RC.nb_nr_L1_inst,NB_RU);
+ }
+
+}
+
+
+void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
+ NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs])
+{
+ for (int CC_id=0; CC_idssb_config.scs_common.value = 1;
+ config[CC_id]->cell_config.frame_duplex_type.value = 1; //FDD
+ config[CC_id]->carrier_config.dl_grid_size[1].value = 106;
+ config[CC_id]->carrier_config.ul_grid_size[1].value = 106;
+ config[CC_id]->cell_config.phy_cell_id.value = 0;
+ }
+}
+
+/*
+ * helper function to terminate a certain ITTI task
+ */
+void terminate_task(task_id_t task_id, module_id_t mod_id) {
+ LOG_I(GNB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
+ MessageDef *msg;
+ msg = itti_alloc_new_message (ENB_APP, TERMINATE_MESSAGE);
+ itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
+}
+
+//extern void free_transport(PHY_VARS_gNB *);
+extern void nr_phy_free_RU(RU_t *);
+
+void init_pdcp(void) {
+ //if (!NODE_IS_DU(RC.rrc[0]->node_type)) {
+ pdcp_layer_init();
+ uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
+ (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
+
+ if (IS_SOFTMODEM_NOS1) {
+ printf("IS_SOFTMODEM_NOS1 option enabled \n");
+ pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
+ }
+
+ pdcp_module_init(pdcp_initmask);
+
+ pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
+ pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
+}
+
+
+int create_tasks_nrue(uint32_t ue_nb) {
+ LOG_D(ENB_APP, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb);
+ itti_wait_ready(1);
+
+ if (ue_nb > 0) {
+ printf("create TASK_RRC_NRUE\n");
+ if (itti_create_task (TASK_RRC_NRUE, rrc_nrue_task, NULL) < 0) {
+ LOG_E(NR_RRC, "Create task for RRC UE failed\n");
+ return -1;
+ }
+ }
+
+
+ itti_wait_ready(0);
+ return 0;
+}
+
+
+void *itti_sim_ue_rrc_task( void *args_p) {
+ MessageDef *msg_p, *message_p;
+ instance_t instance;
+ unsigned int ue_mod_id;
+ int result;
+ itti_mark_task_ready (TASK_RRC_UE_SIM);
+
+ while(1) {
+ // Wait for a message
+ itti_receive_msg (TASK_RRC_UE_SIM, &msg_p);
+ instance = ITTI_MSG_INSTANCE (msg_p);
+ ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance);
+
+ switch (ITTI_MSG_ID(msg_p)) {
+ case TERMINATE_MESSAGE:
+ LOG_W(NR_RRC, " *** Exiting RRC thread\n");
+ itti_exit_task ();
+ break;
+
+ case MESSAGE_TEST:
+ LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+ case GNB_RRC_BCCH_DATA_IND:
+ message_p = itti_alloc_new_message (TASK_RRC_NRUE, NR_RRC_MAC_BCCH_DATA_IND);
+ memset (NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE);
+ NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = GNB_RRC_BCCH_DATA_IND(msg_p).size;
+ memcpy (NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, GNB_RRC_BCCH_DATA_IND(msg_p).sdu, GNB_RRC_BCCH_DATA_IND(msg_p).size);
+ itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
+ break;
+ case GNB_RRC_CCCH_DATA_IND:
+ message_p = itti_alloc_new_message (TASK_RRC_NRUE, NR_RRC_MAC_CCCH_DATA_IND);
+ printf("receive GNB_RRC_CCCH_DATA_IND\n");
+ memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
+ memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, GNB_RRC_CCCH_DATA_IND(msg_p).sdu, GNB_RRC_CCCH_DATA_IND(msg_p).size);
+ NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = GNB_RRC_CCCH_DATA_IND(msg_p).size;
+ itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
+ break;
+ case GNB_RRC_DCCH_DATA_IND:
+ printf("receive GNB_RRC_DCCH_DATA_IND\n");
+ message_p = itti_alloc_new_message (TASK_RRC_NRUE, NR_RRC_DCCH_DATA_IND);
+ NR_RRC_DCCH_DATA_IND (message_p).dcch_index = GNB_RRC_DCCH_DATA_IND(msg_p).rbid;
+ NR_RRC_DCCH_DATA_IND (message_p).sdu_size = GNB_RRC_DCCH_DATA_IND(msg_p).size;
+ NR_RRC_DCCH_DATA_IND (message_p).sdu_p = GNB_RRC_DCCH_DATA_IND(msg_p).sdu;
+ itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
+ break;
+ default:
+ LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+ }
+
+ result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+ msg_p = NULL;
+ }
+}
+
+
+void *itti_sim_gnb_rrc_task( void *args_p) {
+ MessageDef *msg_p, *message_p;
+ instance_t instance;
+ unsigned int ue_mod_id;
+ int result;
+ itti_mark_task_ready (TASK_RRC_GNB_SIM);
+
+ while(1) {
+ // Wait for a message
+ itti_receive_msg (TASK_RRC_GNB_SIM, &msg_p);
+ instance = ITTI_MSG_INSTANCE (msg_p);
+ ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance);
+
+ switch (ITTI_MSG_ID(msg_p)) {
+ case TERMINATE_MESSAGE:
+ LOG_W(NR_RRC, " *** Exiting RRC thread\n");
+ itti_exit_task ();
+ break;
+
+ case MESSAGE_TEST:
+ LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+ case UE_RRC_CCCH_DATA_IND:
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, NR_RRC_MAC_CCCH_DATA_IND);
+ NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = UE_RRC_CCCH_DATA_IND(msg_p).size;
+ memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
+ memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, UE_RRC_CCCH_DATA_IND(msg_p).sdu, UE_RRC_CCCH_DATA_IND(msg_p).size);
+ itti_send_msg_to_task (TASK_RRC_GNB, instance, message_p);
+ break;
+ case UE_RRC_DCCH_DATA_IND:
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, NR_RRC_DCCH_DATA_IND);
+ NR_RRC_DCCH_DATA_IND (message_p).sdu_size = UE_RRC_DCCH_DATA_IND(msg_p).size;
+ NR_RRC_DCCH_DATA_IND (message_p).dcch_index = UE_RRC_DCCH_DATA_IND(msg_p).rbid;
+ NR_RRC_DCCH_DATA_IND (message_p).sdu_p = UE_RRC_DCCH_DATA_IND(msg_p).sdu;
+ itti_send_msg_to_task (TASK_RRC_GNB, instance, message_p);
+ break;
+
+ default:
+ LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
+ break;
+ }
+
+ result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+ msg_p = NULL;
+ }
+}
+
+
+int main( int argc, char **argv )
+{
+ start_background_system();
+
+ ///static configuration for NR at the moment
+ if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) {
+ exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
+ }
+ set_softmodem_sighandler();
+#ifdef DEBUG_CONSOLE
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+#endif
+
+ logInit();
+ //configure_linux();
+ printf("Reading in command-line options\n");
+ get_options ();
+
+ if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) {
+ fprintf(stderr,"Getting configuration failed\n");
+ exit(-1);
+ }
+
+ // AMF_MODE_ENABLED = !IS_SOFTMODEM_NOS1;
+ AMF_MODE_ENABLED = 0;
+
+#if T_TRACER
+ T_Config_Init();
+#endif
+ //randominit (0);
+ set_taus_seed (0);
+ printf("configuring for RAU/RRU\n");
+
+ if (opp_enabled ==1) {
+ reset_opp_meas();
+ }
+
+ cpuf=get_cpu_freq_GHz();
+ itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
+ // initialize mscgen log after ITTI
+ MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
+
+
+ init_opt();
+
+ LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
+
+ if(IS_SOFTMODEM_NOS1)
+ init_pdcp();
+
+ if (RC.nb_nr_inst > 0) {
+ // don't create if node doesn't connect to RRC/S1/GTP
+ AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
+ } else {
+ printf("No ITTI, Initializing L1\n");
+ return 0;
+ }
+
+ if(itti_create_task (TASK_RRC_GNB_SIM, itti_sim_gnb_rrc_task, NULL) < 0){
+ printf("cannot create ITTI tasks\n");
+ exit(-1); // need a softer mode
+ }
+
+ openair_rrc_top_init_ue_nr("./");
+
+ if (create_tasks_nrue(1) < 0) {
+ printf("cannot create ITTI tasks\n");
+ exit(-1); // need a softer mode
+ }
+
+ if(itti_create_task (TASK_RRC_UE_SIM, itti_sim_ue_rrc_task, NULL) < 0){
+ printf("cannot create ITTI tasks\n");
+ exit(-1); // need a softer mode
+ }
+
+ pthread_cond_init(&sync_cond,NULL);
+ pthread_mutex_init(&sync_mutex, NULL);
+
+ printf("Sending sync to all threads\n");
+ pthread_mutex_lock(&sync_mutex);
+ sync_var=0;
+ pthread_cond_broadcast(&sync_cond);
+ pthread_mutex_unlock(&sync_mutex);
+ // wait for end of program
+ printf("TYPE TO TERMINATE\n");
+
+ usleep(100000);
+ protocol_ctxt_t ctxt;
+ struct rrc_gNB_ue_context_s *ue_context_p = NULL;
+
+
+ ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[0]);
+
+ if(ue_context_p == NULL){
+ printf("ue_context_p == NULL");
+ }
+ PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
+ 0,
+ ENB_FLAG_YES,
+ 0,
+ 0,
+ 0);
+ NR_UE_rrc_inst[ctxt.module_id].Info[0].State = RRC_SI_RECEIVED;
+
+ rrc_ue_generate_RRCSetupRequest(&ctxt, 0);
+
+ printf("Entering ITTI signals handler\n");
+ itti_wait_tasks_end();
+ printf("Returned from ITTI signal handler\n");
+ oai_exit=1;
+ printf("oai_exit=%d\n",oai_exit);
+
+ printf("stopping MODEM threads\n");
+
+
+ /* release memory used by the RU/gNB threads (incomplete), after all
+ * threads have been stopped (they partially use the same memory) */
+
+ pthread_cond_destroy(&sync_cond);
+ pthread_mutex_destroy(&sync_mutex);
+
+ logClean();
+ printf("Bye.\n");
+ return 0;
+}
+
+
+
diff --git a/openair3/COMMON/messages_types.h b/openair3/COMMON/messages_types.h
index f91881bf11..f8fd464288 100644
--- a/openair3/COMMON/messages_types.h
+++ b/openair3/COMMON/messages_types.h
@@ -39,6 +39,7 @@
#include "udp_messages_types.h"
#include "mme_app_messages_types.h"
#include "m2ap_messages_types.h"
+#include "ngap_messages_types.h"
#endif /* MESSAGES_TYPES_H_ */
diff --git a/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.c b/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.c
new file mode 100644
index 0000000000..3d177c396a
--- /dev/null
+++ b/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.c
@@ -0,0 +1,114 @@
+/*
+ * 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 RegistrationRequest.c
+ * \brief registration request procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+#include
+#include
+#include
+
+#include "nas_log.h"
+
+#include "RegistrationRequest.h"
+
+int decode_registration_request(registration_request_msg *registration_request, uint8_t *buffer, uint32_t len)
+{
+ uint32_t decoded = 0;
+ int decoded_result = 0;
+
+ LOG_FUNC_IN;
+ LOG_TRACE(INFO, "EMM - registration_request len = %d",
+ len);
+
+ /* Decoding mandatory fields */
+ if ((decoded_result = decode_5gs_registration_type(®istration_request->fgsregistrationtype, 0, *(buffer + decoded) & 0x0f, len - decoded)) < 0) {
+ // return decoded_result;
+ LOG_FUNC_RETURN(decoded_result);
+ }
+
+ if ((decoded_result = decode_u8_nas_key_set_identifier(®istration_request->naskeysetidentifier, 0, *(buffer + decoded) >> 4, len - decoded)) < 0) {
+ // return decoded_result;
+ LOG_FUNC_RETURN(decoded_result);
+ }
+
+ decoded++;
+
+ if ((decoded_result = decode_5gs_mobile_identity(®istration_request->fgsmobileidentity, 0, buffer + decoded, len - decoded)) < 0) {
+ // return decoded_result;
+ LOG_FUNC_RETURN(decoded_result);
+ } else
+ decoded += decoded_result;
+
+
+ // TODO, Decoding optional fields
+
+ return decoded;
+}
+
+int encode_registration_request(registration_request_msg *registration_request, uint8_t *buffer, uint32_t len)
+{
+ int encoded = 0;
+ int encode_result = 0;
+
+ *(buffer + encoded) = ((encode_u8_nas_key_set_identifier(®istration_request->naskeysetidentifier) & 0x0f) << 4) | (encode_5gs_registration_type(®istration_request->fgsregistrationtype) & 0x0f);
+ encoded++;
+
+ if ((encode_result =
+ encode_5gs_mobile_identity(®istration_request->fgsmobileidentity, 0, buffer +
+ encoded, len - encoded)) < 0) //Return in case of error
+ return encode_result;
+ else
+ encoded += encode_result;
+
+ if ((registration_request->presencemask & REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT)
+ == REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT) {
+ if ((encode_result = encode_5gmm_capability(®istration_request->fgmmcapability,
+ REGISTRATION_REQUEST_5GMM_CAPABILITY_IEI, buffer + encoded, len -
+ encoded)) < 0)
+ // Return in case of error
+ return encode_result;
+ else
+ encoded += encode_result;
+ }
+
+ if ((registration_request->presencemask & REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT)
+ == REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT) {
+ if ((encode_result = encode_nrue_security_capability(®istration_request->nruesecuritycapability,
+ REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_IEI, buffer + encoded, len -
+ encoded)) < 0)
+ // Return in case of error
+ return encode_result;
+ else
+ encoded += encode_result;
+ }
+
+
+ // TODO, Encoding optional fields
+ return encoded;
+}
+
diff --git a/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.h b/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.h
new file mode 100644
index 0000000000..ce534bfff9
--- /dev/null
+++ b/openair3/NAS/COMMON/EMM/MSG/RegistrationRequest.h
@@ -0,0 +1,125 @@
+/*
+ * 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 RegistrationRequest.h
+ * \brief registration request procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+#include "ExtendedProtocolDiscriminator.h"
+#include "SecurityHeaderType.h"
+#include "SpareHalfOctet.h"
+#include "FGSMobileIdentity.h"
+#include "NasKeySetIdentifier.h"
+#include "FGSRegistrationType.h"
+#include "MessageType.h"
+#include "FGMMCapability.h"
+#include "NrUESecurityCapability.h"
+
+#ifndef REGISTRATION_REQUEST_H_
+#define REGISTRATION_REQUEST_H_
+
+
+# define REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEYSET_PRESENT (1<<0)
+# define REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT (1<<1)
+# define REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT (1<<2)
+# define REGISTRATION_REQUEST_REQUESTED_NSSAI_PRESENT (1<<3)
+# define REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT (1<<4)
+# define REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_PRESENT (1<<5)
+# define REGISTRATION_REQUEST_UPLINK_DATA_STATUS_PRESENT (1<<6)
+# define REGISTRATION_REQUEST_PDU_SESSION_STATUS_PRESENT (1<<7)
+# define REGISTRATION_REQUEST_MICO_INDICATION_PRESENT (1<<8)
+# define REGISTRATION_REQUEST_UE_STATUS_PRESENT (1<<9)
+# define REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT (1<<10)
+# define REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT (1<<11)
+# define REGISTRATION_REQUEST_UE_USAGE_SETTING_PRESENT (1<<12)
+# define REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_PRESENT (1<<13)
+# define REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT (1<<14)
+# define REGISTRATION_REQUEST_LADN_INDICATION_PRESENT (1<<15)
+# define REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT (1<<16)
+# define REGISTRATION_REQUEST_PAYLOAD_CONTAINER_PRESENT (1<<17)
+# define REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_PRESENT (1<<18)
+# define REGISTRATION_REQUEST_5GS_UPDATE_TYPE_PRESENT (1<<19)
+# define REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT (1<<20)
+# define REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT (1<<21)
+
+typedef enum registration_request_iei_tag {
+ REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEYSET_IEI = 0xC0, /* 0xC- = 192- */
+ REGISTRATION_REQUEST_5GMM_CAPABILITY_IEI = 0x10, /* 0x10 = 16 */
+ REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_IEI = 0x2E, /* 0x2E = 46 */
+ REGISTRATION_REQUEST_REQUESTED_NSSAI_IEI = 0x2F, /* 0x2F = 47 */
+ REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI = 0x52, /* 0x52 = 82 */
+ REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_IEI = 0x17, /* 0x17 = 23 */
+ REGISTRATION_REQUEST_UPLINK_DATA_STATUS_IEI = 0x40, /* 0x40 = 64 */
+ REGISTRATION_REQUEST_PDU_SESSION_STATUS_IEI = 0x50, /* 0x50 = 80 */
+ REGISTRATION_REQUEST_MICO_INDICATION_IEI = 0xB0, /* 0xB- = 176- */
+ REGISTRATION_REQUEST_UE_STATUS_IEI = 0x2B, /* 0x2B = 43 */
+ REGISTRATION_REQUEST_ADDITIONAL_GUTI_IEI = 0x77, /* 0x77 = 119 */
+ REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_IEI = 0x25, /* 0x25 = 37 */
+ REGISTRATION_REQUEST_UE_USAGE_SETTING_IEI = 0x18, /* 0x18 = 24 */
+ REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_IEI = 0x51, /* 0x51 = 81 */
+ REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_IEI = 0x70, /* 0x70 = 112 */
+ REGISTRATION_REQUEST_LADN_INDICATION_IEI = 0x74, /* 0x74 = 116 */
+ REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_IEI = 0x80, /* 0x80 = 128 */
+ REGISTRATION_REQUEST_PAYLOAD_CONTAINER_IEI = 0x7B, /* 0x7B = 123 */
+ REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_IEI = 0x90, /* 0x90 = 144 */
+ REGISTRATION_REQUEST_5GS_UPDATE_TYPE_IEI = 0x53, /* 0x53 = 83 */
+ REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_IEI = 0x71, /* 0x71 = 113 */
+ REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_IEI = 0x60 /* 0x60 = 96 */
+} registration_request_iei;
+
+/*
+ * Message name: Registration request
+ * Description: This message is sent by the UE to the AMF. See TS24.501 table 8.2.6.1.1.
+ * Significance: dual
+ * Direction: UE to network
+ */
+
+typedef struct registration_request_msg_tag {
+ /* Mandatory fields */
+ ExtendedProtocolDiscriminator protocoldiscriminator;
+ SecurityHeaderType securityheadertype:4;
+ SpareHalfOctet sparehalfoctet:4;
+ MessageType messagetype;
+ FGSRegistrationType fgsregistrationtype;
+ NasKeySetIdentifier naskeysetidentifier;
+ FGSMobileIdentity fgsmobileidentity;
+
+ /* Optional fields */
+ uint32_t presencemask;
+ FGMMCapability fgmmcapability;
+ NrUESecurityCapability nruesecuritycapability;
+} registration_request_msg;
+
+int decode_registration_request(registration_request_msg *registrationrequest, uint8_t *buffer, uint32_t len);
+
+int encode_registration_request(registration_request_msg *registrationrequest, uint8_t *buffer, uint32_t len);
+
+#endif /* ! defined(REGISTRATION_REQUEST_H_) */
+
diff --git a/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.c b/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.c
new file mode 100644
index 0000000000..e3b4bd021a
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.c
@@ -0,0 +1,50 @@
+/*
+ * 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 ExtendedProtocolDiscriminator.c
+
+\brief Extended protocol discriminator for registration request procedures
+\author Yoshio INOUE, Masayuki HARADA
+\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+\date 2020
+\version 0.1
+*/
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "ExtendedProtocolDiscriminator.h"
+
+int encode_ex_protocol_discriminator(ExtendedProtocolDiscriminator *exprotocoldiscriminator, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ return 0;
+}
+
+int decode_ex_protocol_discriminator(ExtendedProtocolDiscriminator *exprotocoldiscriminator, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ return 0;
+}
+
diff --git a/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.h b/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.h
new file mode 100644
index 0000000000..3bf1f6ec8f
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/ExtendedProtocolDiscriminator.h
@@ -0,0 +1,48 @@
+/*
+ * 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 ExtendedProtocolDiscriminator.h
+
+\brief Extended protocol discriminator for registration request procedures
+\author Yoshio INOUE, Masayuki HARADA
+\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+\date 2020
+\version 0.1
+*/
+
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef EXTENDED_PROTOCOL_DISCRIMINATOR_H_
+#define EXTENDED_PROTOCOL_DISCRIMINATOR_H_
+
+typedef uint8_t ExtendedProtocolDiscriminator;
+
+int encode_ex_protocol_discriminator(ExtendedProtocolDiscriminator *exprotocoldiscriminator, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+int decode_ex_protocol_discriminator(ExtendedProtocolDiscriminator *exprotocoldiscriminator, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+#endif /* EXTENDED PROTOCOL DISCRIMINATOR_H_ */
+
diff --git a/openair3/NAS/COMMON/IES/FGMMCapability.c b/openair3/NAS/COMMON/IES/FGMMCapability.c
new file mode 100644
index 0000000000..ce156e63bf
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGMMCapability.c
@@ -0,0 +1,54 @@
+/*
+ * 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 FGMMCapability.c
+ * \brief 5GS Mobile Identity for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "FGMMCapability.h"
+
+
+
+int encode_5gmm_capability(FGMMCapability *fgmmcapability, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ int encoded = 0;
+ if(iei){
+ *buffer = fgmmcapability->iei;
+ encoded++;
+ *(buffer+encoded) = fgmmcapability->length;
+ encoded++;
+ *(buffer+encoded) = fgmmcapability->value;
+ encoded++;
+ }
+ return encoded;
+}
+
diff --git a/openair3/NAS/COMMON/IES/FGMMCapability.h b/openair3/NAS/COMMON/IES/FGMMCapability.h
new file mode 100644
index 0000000000..d427896338
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGMMCapability.h
@@ -0,0 +1,51 @@
+/*
+ * 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 FGMMCapability.h
+ * \brief 5GS Mobile Capability for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef FGMM_CAPABILITY_H_
+#define FGMM_CAPABILITY_H_
+
+
+typedef struct {
+ uint8_t iei;
+ uint8_t length;
+ uint8_t value;
+} FGMMCapability;
+
+
+int encode_5gmm_capability(FGMMCapability *fgmmcapability, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+#endif /* FGMM_CAPABILITY_H_ */
+
diff --git a/openair3/NAS/COMMON/IES/FGSMobileIdentity.c b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c
new file mode 100644
index 0000000000..cd7bee5bd7
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGSMobileIdentity.c
@@ -0,0 +1,175 @@
+/*
+ * 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 FGSMobileIdentity.c
+ * \brief 5GS Mobile Identity for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "FGSMobileIdentity.h"
+
+static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer);
+
+static int encode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer);
+
+int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ int decoded_rc = TLV_DECODE_VALUE_DOESNT_MATCH;
+ int decoded = 0;
+ uint8_t ielen = 0;
+
+ if (iei > 0) {
+ CHECK_IEI_DECODER(iei, *buffer);
+ decoded++;
+ }
+
+ ielen = *(buffer + decoded);
+ decoded++;
+ CHECK_LENGTH_DECODER(len - decoded, ielen);
+
+ uint8_t typeofidentity = *(buffer + decoded) & 0x7;
+
+ if (typeofidentity == FGS_MOBILE_IDENTITY_5G_GUTI) {
+ decoded_rc = decode_guti_5gs_mobile_identity(&fgsmobileidentity->guti,
+ buffer + decoded);
+ }
+
+ if (decoded_rc < 0) {
+ return decoded_rc;
+ }
+
+ return (decoded + decoded_rc);
+}
+
+int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ int encoded_rc = TLV_ENCODE_VALUE_DOESNT_MATCH;
+ uint32_t encoded = 0;
+
+ if (iei > 0) {
+ *buffer = iei;
+ encoded++;
+ }
+
+ encoded = encoded + 2;
+
+ if (fgsmobileidentity->guti.typeofidentity == FGS_MOBILE_IDENTITY_5G_GUTI) {
+ encoded_rc = encode_guti_5gs_mobile_identity(&fgsmobileidentity->guti,
+ buffer + encoded);
+ }
+
+ if (encoded_rc < 0) {
+ return encoded_rc;
+ }
+
+ *(uint16_t*) buffer = htons(encoded + encoded_rc - 2 - ((iei > 0) ? 1 : 0));
+ return (encoded + encoded_rc);
+}
+
+static int decode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer)
+{
+ int decoded = 0;
+ uint16_t temp;
+ guti->spare = (*(buffer + decoded) >> 4) & 0xf;
+
+ /*
+ * For the 5G-GUTI, bits 5 to 8 of octet 3 are coded as "1111"
+ */
+ if (guti->spare != 0xf) {
+ return (TLV_ENCODE_VALUE_DOESNT_MATCH);
+ }
+
+
+ guti->oddeven = (*(buffer + decoded) >> 3) & 0x1;
+
+ /*
+ * For the 5G-GUTI, bits 4 of octet 3 are coded as "0"
+ */
+ if (guti->oddeven != 0) {
+ return (TLV_ENCODE_VALUE_DOESNT_MATCH);
+ }
+ guti->typeofidentity = *(buffer + decoded) & 0x7;
+
+ if (guti->typeofidentity != FGS_MOBILE_IDENTITY_5G_GUTI) {
+ return (TLV_ENCODE_VALUE_DOESNT_MATCH);
+ }
+
+ decoded++;
+ guti->mccdigit2 = (*(buffer + decoded) >> 4) & 0xf;
+ guti->mccdigit1 = *(buffer + decoded) & 0xf;
+ decoded++;
+ guti->mncdigit3 = (*(buffer + decoded) >> 4) & 0xf;
+ guti->mccdigit3 = *(buffer + decoded) & 0xf;
+ decoded++;
+ guti->mncdigit2 = (*(buffer + decoded) >> 4) & 0xf;
+ guti->mncdigit1 = *(buffer + decoded) & 0xf;
+ decoded++;
+
+
+ guti->amfregionid = *(buffer+decoded);
+ decoded++;
+ IES_DECODE_U16(buffer, decoded, temp);
+ guti->amfsetid = temp>>3;
+ guti->amfpointer = temp&0x3f;
+
+ IES_DECODE_U32(buffer, decoded, guti->tmsi);
+ return decoded;
+}
+
+
+static int encode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_t *buffer)
+{
+ uint32_t encoded = 0;
+ uint16_t temp;
+ *(buffer + encoded) = 0xf0 | ((guti->oddeven & 0x1) << 3) |
+ (guti->typeofidentity & 0x7);
+ encoded++;
+ *(buffer + encoded) = 0x00 | ((guti->mccdigit2 & 0xf) << 4) |
+ (guti->mccdigit1 & 0xf);
+ encoded++;
+ *(buffer + encoded) = 0x00 | ((guti->mncdigit3 & 0xf) << 4) |
+ (guti->mccdigit3 & 0xf);
+ encoded++;
+ *(buffer + encoded) = 0x00 | ((guti->mncdigit2 & 0xf) << 4) |
+ (guti->mncdigit1 & 0xf);
+ encoded++;
+
+ *(buffer + encoded) = guti->amfregionid;
+ encoded++;
+
+ temp = 0x00 | ((guti->amfsetid & 0x3f) << 6) | (guti->amfpointer & 0x3f);
+
+ IES_ENCODE_U16(buffer, encoded, temp);
+ IES_ENCODE_U32(buffer, encoded, guti->tmsi);
+ return encoded;
+}
+
diff --git a/openair3/NAS/COMMON/IES/FGSMobileIdentity.h b/openair3/NAS/COMMON/IES/FGSMobileIdentity.h
new file mode 100644
index 0000000000..40ca73c60b
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGSMobileIdentity.h
@@ -0,0 +1,134 @@
+/*
+ * 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 FGSMobileIdentity.h
+ * \brief 5GS Mobile Identity for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef FGS_MOBILE_IDENTITY_H_
+#define FGS_MOBILE_IDENTITY_H_
+
+
+typedef struct {
+ uint8_t spare:5;
+ uint8_t typeofidentity:3;
+} NoIdentity5GSMobileIdentity_t;
+
+typedef struct {
+ uint8_t spare1:1;
+ uint8_t supiformat:3;
+ uint8_t spare2:1;
+ uint8_t typeofidentity:3;
+ uint8_t mccdigit2:4;
+ uint8_t mccdigit1:4;
+ uint8_t mncdigit3:4;
+ uint8_t mccdigit3:4;
+ uint8_t mncdigit2:4;
+ uint8_t mncdigit1:4;
+ uint8_t routingindicatordigit2:4;
+ uint8_t routingindicatordigit1:4;
+ uint8_t routingindicatordigit4:4;
+ uint8_t routingindicatordigit3:4;
+ uint8_t spare3:1;
+ uint8_t spare4:1;
+ uint8_t spare5:1;
+ uint8_t spare6:1;
+ uint8_t protectionschemeId:4;
+ uint8_t homenetworkpki;
+} Suci5GSMobileIdentity_t;
+
+typedef struct {
+ uint8_t spare:4;
+ uint8_t oddeven:1;
+ uint8_t typeofidentity:3;
+ uint8_t mccdigit2:4;
+ uint8_t mccdigit1:4;
+ uint8_t mncdigit3:4;
+ uint8_t mccdigit3:4;
+ uint8_t mncdigit2:4;
+ uint8_t mncdigit1:4;
+ uint8_t amfregionid;
+ uint16_t amfsetid:10;
+ uint16_t amfpointer:6;
+ uint32_t tmsi;
+} Guti5GSMobileIdentity_t;
+
+
+typedef struct {
+ uint8_t digit1:4;
+ uint8_t oddeven:1;
+ uint8_t typeofidentity:3;
+ uint8_t digitp1:4;
+ uint8_t digitp:4;
+} Imei5GSMobileIdentity_t;
+
+typedef Imei5GSMobileIdentity_t Imeisv5GSMobileIdentity_t;
+
+
+typedef struct {
+ uint8_t digit1:4;
+ uint8_t spare:1;
+ uint8_t typeofidentity:3;
+ uint16_t amfsetid:10;
+ uint16_t amfpointer:6;
+ uint32_t tmsi;
+} Stmsi5GSMobileIdentity_t;
+
+typedef struct {
+ uint8_t spare:5;
+ uint8_t typeofidentity:3;
+ uint8_t macaddr;
+} Macaddr5GSMobileIdentity_t;
+
+typedef union FGSMobileIdentity_tag {
+#define FGS_MOBILE_IDENTITY_NOIDENTITY 0b000
+#define FGS_MOBILE_IDENTITY_SUCI 0b001
+#define FGS_MOBILE_IDENTITY_5G_GUTI 0b010
+#define FGS_MOBILE_IDENTITY_IMEI 0b011
+#define FGS_MOBILE_IDENTITY_5GS_TMSI 0b100
+#define FGS_MOBILE_IDENTITY_IMEISV 0b101
+#define FGS_MOBILE_IDENTITY_MAC_ADDR 0b110
+ NoIdentity5GSMobileIdentity_t noidentity;
+ Suci5GSMobileIdentity_t suci;
+ Guti5GSMobileIdentity_t guti;
+ Imei5GSMobileIdentity_t imei;
+ Stmsi5GSMobileIdentity_t stmsi;
+ Imeisv5GSMobileIdentity_t imeisv;
+ Macaddr5GSMobileIdentity_t macaddress;
+} FGSMobileIdentity;
+
+int encode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+int decode_5gs_mobile_identity(FGSMobileIdentity *fgsmobileidentity, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+#endif /* FGS MOBILE IDENTITY_H_ */
+
diff --git a/openair3/NAS/COMMON/IES/FGSRegistrationType.c b/openair3/NAS/COMMON/IES/FGSRegistrationType.c
new file mode 100644
index 0000000000..7f1c3ae667
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGSRegistrationType.c
@@ -0,0 +1,65 @@
+/*
+ * 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 FGSRegistrationType.c
+ * \brief 5GS Registration Type for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "FGSRegistrationType.h"
+
+int decode_5gs_registration_type(FGSRegistrationType *fgsregistrationtype, uint8_t iei, uint8_t value, uint32_t len)
+{
+ int decoded = 0;
+ uint8_t *buffer = &value;
+ if (iei > 0) {
+ CHECK_IEI_DECODER((*buffer & 0xf0), iei);
+ }
+
+ *fgsregistrationtype = *buffer & 0x7;
+ decoded++;
+
+ return decoded;
+}
+
+int encode_5gs_registration_type(FGSRegistrationType *fgsregistrationtype)
+{
+ uint8_t bufferReturn;
+ uint8_t *buffer = &bufferReturn;
+ uint8_t encoded = 0;
+ uint8_t iei = 0;
+ *(buffer + encoded) = 0x00 | (iei & 0xf0) | 0x8|
+ (*fgsregistrationtype & 0x7);
+ encoded++;
+
+ return bufferReturn;
+}
+
diff --git a/openair3/NAS/COMMON/IES/FGSRegistrationType.h b/openair3/NAS/COMMON/IES/FGSRegistrationType.h
new file mode 100644
index 0000000000..a548d45d93
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/FGSRegistrationType.h
@@ -0,0 +1,55 @@
+/*
+ * 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 FGSRegistrationType.h
+ * \brief 5GS Registration Type for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef FGS_REGISTRATION_TYPE_H_
+#define FGS_REGISTRATION_TYPE_H_
+
+#define FGS_REGISTRATION_TYPE_MINIMUM_LENGTH 1
+#define FGS_REGISTRATION_TYPE_MAXIMUM_LENGTH 1
+
+typedef uint8_t FGSRegistrationType;
+
+
+#define INITIAL_REGISTRATION 0b001
+#define MOBILITY_REGISTRATION_UPDATING 0b010
+#define PERIODIC_REGISTRATION_UPDATING 0b011
+#define EMERGENCY_REGISTRATION 0b100
+
+int encode_5gs_registration_type(FGSRegistrationType *fgsregistrationtype);
+
+int decode_5gs_registration_type(FGSRegistrationType *fgsregistrationtype, uint8_t iei, uint8_t value, uint32_t len);
+
+
+#endif /* FGS_REGISTRATION_TYPE_H_*/
+
diff --git a/openair3/NAS/COMMON/IES/NrUESecurityCapability.c b/openair3/NAS/COMMON/IES/NrUESecurityCapability.c
new file mode 100644
index 0000000000..6c0ff7e7c7
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/NrUESecurityCapability.c
@@ -0,0 +1,63 @@
+/*
+ * 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 NrUESecurityCapability.c
+ * \brief 5GS UE Security Capability for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "NrUESecurityCapability.h"
+
+
+
+int encode_nrue_security_capability(NrUESecurityCapability *nruesecuritycapability, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ int encoded = 0;
+ if(iei){
+ *buffer = nruesecuritycapability->iei;
+ encoded++;
+ *(buffer+encoded) = nruesecuritycapability->length;
+ encoded++;
+ *(buffer+encoded) = nruesecuritycapability->fg_EA;
+ encoded++;
+ *(buffer+encoded) = nruesecuritycapability->fg_IA;
+ encoded++;
+ *(buffer+encoded) = nruesecuritycapability->EEA;
+ encoded++;
+ *(buffer+encoded) = nruesecuritycapability->EIA;
+ encoded++;
+ if((nruesecuritycapability->length - 4) > 0)
+ encoded = encoded + nruesecuritycapability->length - 4;
+ }
+ return encoded;
+}
+
diff --git a/openair3/NAS/COMMON/IES/NrUESecurityCapability.h b/openair3/NAS/COMMON/IES/NrUESecurityCapability.h
new file mode 100644
index 0000000000..10aa0cf0ea
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/NrUESecurityCapability.h
@@ -0,0 +1,53 @@
+/*
+ * 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 NrUESecurityCapability.h
+ * \brief 5GS UE Security Capability for registration request procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef NRUE_SECURITY_CAPABILITY_H_
+#define NRUE_SECURITY_CAPABILITY_H_
+
+
+typedef struct {
+ uint8_t iei;
+ uint8_t length;
+ uint8_t fg_EA;
+ uint8_t fg_IA;
+ uint8_t EEA;
+ uint8_t EIA;
+} NrUESecurityCapability;
+
+
+int encode_nrue_security_capability(NrUESecurityCapability *nruesecuritycapability, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+#endif /* NRUE_SECURITY_CAPABILITY_H_ */
+
diff --git a/openair3/NAS/COMMON/IES/SpareHalfOctet.c b/openair3/NAS/COMMON/IES/SpareHalfOctet.c
new file mode 100644
index 0000000000..60c45e07c2
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/SpareHalfOctet.c
@@ -0,0 +1,50 @@
+/*
+ * 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 SpareHalfOctet.c
+
+\brief registration request procedures for gNB
+\author Yoshio INOUE, Masayuki HARADA
+\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+\date 2020
+\version 0.1
+*/
+
+#include
+#include
+#include
+
+
+#include "TLVEncoder.h"
+#include "TLVDecoder.h"
+#include "SpareHalfOctet.h"
+
+int decode_spare_half_octet(SpareHalfOctet *sparehalfoctet, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ return 0;
+}
+
+int encode_spare_half_octet(SpareHalfOctet *sparehalfoctet, uint8_t iei, uint8_t *buffer, uint32_t len)
+{
+ return 0;
+}
+
diff --git a/openair3/NAS/COMMON/IES/SpareHalfOctet.h b/openair3/NAS/COMMON/IES/SpareHalfOctet.h
new file mode 100644
index 0000000000..fbf410d4f8
--- /dev/null
+++ b/openair3/NAS/COMMON/IES/SpareHalfOctet.h
@@ -0,0 +1,51 @@
+/*
+ * 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 SpareHalfOctet.h
+
+\brief registration request procedures for gNB
+\author Yoshio INOUE, Masayuki HARADA
+\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+\date 2020
+\version 0.1
+*/
+
+#include
+#include
+#include
+
+#include "OctetString.h"
+
+#ifndef SPARE_HALF_OCTET_H_
+#define SPARE_HALF_OCTET_H_
+
+#define SPARE_HALF_OCTET_MINIMUM_LENGTH 1
+#define SPARE_HALF_OCTET_MAXIMUM_LENGTH 1
+
+typedef uint8_t SpareHalfOctet;
+
+int encode_spare_half_octet(SpareHalfOctet *sparehalfoctet, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+int decode_spare_half_octet(SpareHalfOctet *sparehalfoctet, uint8_t iei, uint8_t *buffer, uint32_t len);
+
+#endif /* SPARE HALF OCTET_H_ */
+
diff --git a/openair3/NAS/NR_UE/.gitkeep b/openair3/NAS/NR_UE/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
new file mode 100644
index 0000000000..218475f8ff
--- /dev/null
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -0,0 +1,168 @@
+/*
+ * 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_nas_msg_sim.c
+ * \brief simulator for nr nas message
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include // memset
+#include // malloc, free
+
+#include "nas_log.h"
+#include "TLVDecoder.h"
+#include "TLVEncoder.h"
+#include "nr_nas_msg_sim.h"
+
+
+static int _nas_mm_msg_encode_header(const mm_msg_header_t *header,
+ uint8_t *buffer, uint32_t len) {
+ int size = 0;
+
+ /* Check the buffer length */
+ if (len < sizeof(mm_msg_header_t)) {
+ return (TLV_ENCODE_BUFFER_TOO_SHORT);
+ }
+
+ /* Check the protocol discriminator */
+ if (header->ex_protocol_discriminator != FGS_MOBILITY_MANAGEMENT_MESSAGE) {
+ LOG_TRACE(ERROR, "ESM-MSG - Unexpected extened protocol discriminator: 0x%x",
+ header->ex_protocol_discriminator);
+ return (TLV_ENCODE_PROTOCOL_NOT_SUPPORTED);
+ }
+
+ /* Encode the extendedprotocol discriminator */
+ ENCODE_U8(buffer + size, header->ex_protocol_discriminator, size);
+ /* Encode the security header type */
+ ENCODE_U8(buffer + size, (header->security_header_type & 0xf), size);
+ /* Encode the message type */
+ ENCODE_U8(buffer + size, header->message_type, size);
+ return (size);
+}
+
+
+int mm_msg_encode(MM_msg *mm_msg, uint8_t *buffer, uint32_t len) {
+ LOG_FUNC_IN;
+ int header_result;
+ int encode_result;
+ uint8_t msg_type = mm_msg->header.message_type;
+
+
+ /* First encode the EMM message header */
+ header_result = _nas_mm_msg_encode_header(&mm_msg->header, buffer, len);
+
+ if (header_result < 0) {
+ LOG_TRACE(ERROR, "EMM-MSG - Failed to encode EMM message header "
+ "(%d)", header_result);
+ LOG_FUNC_RETURN(header_result);
+ }
+
+ buffer += header_result;
+ len -= header_result;
+
+ switch(msg_type) {
+ case REGISTRATION_REQUEST:
+ encode_result = encode_registration_request(&mm_msg->registration_request, buffer, len);
+ break;
+
+ default:
+ LOG_TRACE(ERROR, "EMM-MSG - Unexpected message type: 0x%x",
+ mm_msg->header.message_type);
+ encode_result = TLV_ENCODE_WRONG_MESSAGE_TYPE;
+ break;
+ /* TODO: Handle not standard layer 3 messages: SERVICE_REQUEST */
+ }
+
+ if (encode_result < 0) {
+ LOG_TRACE(ERROR, "EMM-MSG - Failed to encode L3 EMM message 0x%x "
+ "(%d)", mm_msg->header.message_type, encode_result);
+ }
+
+ if (encode_result < 0)
+ LOG_FUNC_RETURN (encode_result);
+
+ LOG_FUNC_RETURN (header_result + encode_result);
+}
+
+
+
+void generateRegistrationRequest(as_nas_info_t *initialNasMsg) {
+ int size = sizeof(mm_msg_header_t);
+ fgs_nas_message_t nas_msg;
+ memset(&nas_msg, 0, sizeof(fgs_nas_message_t));
+ MM_msg *mm_msg;
+
+ mm_msg = &nas_msg.plain.mm_msg;
+ // set header
+ mm_msg->header.ex_protocol_discriminator = FGS_MOBILITY_MANAGEMENT_MESSAGE;
+ mm_msg->header.security_header_type = PLAIN_5GS_MSG;
+ mm_msg->header.message_type = REGISTRATION_REQUEST;
+
+
+ // set registration request
+ mm_msg->registration_request.protocoldiscriminator = FGS_MOBILITY_MANAGEMENT_MESSAGE;
+ size += 1;
+ mm_msg->registration_request.securityheadertype = PLAIN_5GS_MSG;
+ size += 1;
+ mm_msg->registration_request.messagetype = REGISTRATION_REQUEST;
+ size += 1;
+ mm_msg->registration_request.fgsregistrationtype = INITIAL_REGISTRATION;
+ mm_msg->registration_request.naskeysetidentifier.naskeysetidentifier = NAS_KEY_SET_IDENTIFIER_NOT_AVAILABLE;
+ size += 1;
+ mm_msg->registration_request.fgsmobileidentity.guti.typeofidentity = FGS_MOBILE_IDENTITY_5G_GUTI;
+// mm_msg->registration_request.fgsmobileidentity.guti.amfregionid = 1;
+// mm_msg->registration_request.fgsmobileidentity.guti.amfpointer = 1;
+// mm_msg->registration_request.fgsmobileidentity.guti.amfsetid = 1;
+ mm_msg->registration_request.fgsmobileidentity.guti.tmsi = 10;
+ mm_msg->registration_request.fgsmobileidentity.guti.mncdigit1 = 9;
+ mm_msg->registration_request.fgsmobileidentity.guti.mncdigit2 = 3;
+ mm_msg->registration_request.fgsmobileidentity.guti.mccdigit1 = 2;
+ mm_msg->registration_request.fgsmobileidentity.guti.mccdigit2 = 0;
+ mm_msg->registration_request.fgsmobileidentity.guti.mccdigit3 = 8;
+
+ size += 13;
+
+ mm_msg->registration_request.presencemask |= REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT;
+ mm_msg->registration_request.fgmmcapability.iei = REGISTRATION_REQUEST_5GMM_CAPABILITY_IEI;
+ mm_msg->registration_request.fgmmcapability.length = 1;
+ mm_msg->registration_request.fgmmcapability.value = 0x7;
+ size += 3;
+
+ mm_msg->registration_request.presencemask |= REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT;
+ mm_msg->registration_request.nruesecuritycapability.iei = REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_IEI;
+ mm_msg->registration_request.nruesecuritycapability.length = 8;
+ mm_msg->registration_request.nruesecuritycapability.fg_EA = 0x80;
+ mm_msg->registration_request.nruesecuritycapability.fg_IA = 0x20;
+ mm_msg->registration_request.nruesecuritycapability.EEA = 0;
+ mm_msg->registration_request.nruesecuritycapability.EIA = 0;
+ size += 10;
+
+ // encode the message
+ initialNasMsg->data = (Byte_t *)malloc(size * sizeof(Byte_t));
+
+ initialNasMsg->length = mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data), size);
+
+
+}
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
new file mode 100644
index 0000000000..198564b441
--- /dev/null
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
@@ -0,0 +1,94 @@
+/*
+ * 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_nas_msg_sim.h
+ * \brief simulator for nr nas message
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
+ * \date 2020
+ * \version 0.1
+ */
+
+
+
+#ifndef __NR_NAS_MSG_SIM_H__
+#define __NR_NAS_MSG_SIM_H__
+
+#include "RegistrationRequest.h"
+#include "as_message.h"
+
+
+#define PLAIN_5GS_MSG 0b0000
+#define INTEGRITY_PROTECTED 0b0001
+
+#define REGISTRATION_REQUEST 0b01000001 /* 65 = 0x41 */
+#define INITIAL_REGISTRATION 0b001
+
+
+typedef enum fgs_protocol_discriminator_e {
+ /* Protocol discriminator identifier for 5GS Mobility Management */
+ FGS_MOBILITY_MANAGEMENT_MESSAGE = 0x7E,
+
+ /* Protocol discriminator identifier for 5GS Session Management */
+ FGS_SESSION_MANAGEMENT_MESSAGE = 0x2E,
+} fgs_protocol_discriminator_t;
+
+
+typedef struct {
+ uint8_t ex_protocol_discriminator;
+ uint8_t security_header_type;
+ uint8_t message_type;
+} mm_msg_header_t;
+
+/* Structure of security protected header */
+typedef struct {
+ fgs_protocol_discriminator_t protocol_discriminator;
+ uint8_t security_header_type;
+ uint32_t message_authentication_code;
+ uint8_t sequence_number;
+} fgs_nas_message_security_header_t;
+
+typedef union {
+ mm_msg_header_t header;
+ registration_request_msg registration_request;
+} MM_msg;
+
+
+
+typedef struct {
+ MM_msg mm_msg; /* 5GS Mobility Management messages */
+} fgs_nas_message_plain_t;
+
+typedef struct {
+ fgs_nas_message_security_header_t header;
+ fgs_nas_message_plain_t plain;
+} fgs_nas_message_security_protected_t;
+
+
+typedef union {
+ fgs_nas_message_security_header_t header;
+ fgs_nas_message_security_protected_t security_protected;
+ fgs_nas_message_plain_t plain;
+} fgs_nas_message_t;
+
+void generateRegistrationRequest(as_nas_info_t *initialNasMsg);
+
+#endif /* __NR_NAS_MSG_SIM_H__*/
diff --git a/openair3/NGAP/MESSAGES/ASN1/ASN1_files/ngap-15.8.0.asn1 b/openair3/NGAP/MESSAGES/ASN1/ASN1_files/ngap-15.8.0.asn1
new file mode 100644
index 0000000000..b808ed3ada
--- /dev/null
+++ b/openair3/NGAP/MESSAGES/ASN1/ASN1_files/ngap-15.8.0.asn1
@@ -0,0 +1,6886 @@
+-- ASN1START
+-- **************************************************************
+--
+-- Elementary Procedure definitions
+--
+-- **************************************************************
+
+NGAP-PDU-Descriptions {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-PDU-Descriptions (0)}
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+
+ Criticality,
+ ProcedureCode
+FROM NGAP-CommonDataTypes
+
+ AMFConfigurationUpdate,
+ AMFConfigurationUpdateAcknowledge,
+ AMFConfigurationUpdateFailure,
+ AMFStatusIndication,
+ CellTrafficTrace,
+ DeactivateTrace,
+ DownlinkNASTransport,
+ DownlinkNonUEAssociatedNRPPaTransport,
+ DownlinkRANConfigurationTransfer,
+ DownlinkRANStatusTransfer,
+ DownlinkUEAssociatedNRPPaTransport,
+ ErrorIndication,
+ HandoverCancel,
+ HandoverCancelAcknowledge,
+ HandoverCommand,
+ HandoverFailure,
+ HandoverNotify,
+ HandoverPreparationFailure,
+ HandoverRequest,
+ HandoverRequestAcknowledge,
+ HandoverRequired,
+ InitialContextSetupFailure,
+ InitialContextSetupRequest,
+ InitialContextSetupResponse,
+ InitialUEMessage,
+ LocationReport,
+ LocationReportingControl,
+ LocationReportingFailureIndication,
+ NASNonDeliveryIndication,
+ NGReset,
+ NGResetAcknowledge,
+ NGSetupFailure,
+ NGSetupRequest,
+ NGSetupResponse,
+ OverloadStart,
+ OverloadStop,
+ Paging,
+ PathSwitchRequest,
+ PathSwitchRequestAcknowledge,
+ PathSwitchRequestFailure,
+ PDUSessionResourceModifyConfirm,
+ PDUSessionResourceModifyIndication,
+ PDUSessionResourceModifyRequest,
+ PDUSessionResourceModifyResponse,
+ PDUSessionResourceNotify,
+ PDUSessionResourceReleaseCommand,
+ PDUSessionResourceReleaseResponse,
+ PDUSessionResourceSetupRequest,
+ PDUSessionResourceSetupResponse,
+ PrivateMessage,
+ PWSCancelRequest,
+ PWSCancelResponse,
+ PWSFailureIndication,
+ PWSRestartIndication,
+ RANConfigurationUpdate,
+ RANConfigurationUpdateAcknowledge,
+ RANConfigurationUpdateFailure,
+ RerouteNASRequest,
+ RRCInactiveTransitionReport,
+ SecondaryRATDataUsageReport,
+ TraceFailureIndication,
+ TraceStart,
+ UEContextModificationFailure,
+ UEContextModificationRequest,
+ UEContextModificationResponse,
+ UEContextReleaseCommand,
+ UEContextReleaseComplete,
+ UEContextReleaseRequest,
+ UERadioCapabilityCheckRequest,
+ UERadioCapabilityCheckResponse,
+ UERadioCapabilityInfoIndication,
+ UETNLABindingReleaseRequest,
+ UplinkNASTransport,
+ UplinkNonUEAssociatedNRPPaTransport,
+ UplinkRANConfigurationTransfer,
+ UplinkRANStatusTransfer,
+ UplinkUEAssociatedNRPPaTransport,
+ WriteReplaceWarningRequest,
+ WriteReplaceWarningResponse
+FROM NGAP-PDU-Contents
+
+ id-AMFConfigurationUpdate,
+ id-AMFStatusIndication,
+ id-CellTrafficTrace,
+ id-DeactivateTrace,
+ id-DownlinkNASTransport,
+ id-DownlinkNonUEAssociatedNRPPaTransport,
+ id-DownlinkRANConfigurationTransfer,
+ id-DownlinkRANStatusTransfer,
+ id-DownlinkUEAssociatedNRPPaTransport,
+ id-ErrorIndication,
+ id-HandoverCancel,
+ id-HandoverNotification,
+ id-HandoverPreparation,
+ id-HandoverResourceAllocation,
+ id-InitialContextSetup,
+ id-InitialUEMessage,
+ id-LocationReport,
+ id-LocationReportingControl,
+ id-LocationReportingFailureIndication,
+ id-NASNonDeliveryIndication,
+ id-NGReset,
+ id-NGSetup,
+ id-OverloadStart,
+ id-OverloadStop,
+ id-Paging,
+ id-PathSwitchRequest,
+ id-PDUSessionResourceModify,
+ id-PDUSessionResourceModifyIndication,
+ id-PDUSessionResourceNotify,
+ id-PDUSessionResourceRelease,
+ id-PDUSessionResourceSetup,
+ id-PrivateMessage,
+ id-PWSCancel,
+ id-PWSFailureIndication,
+ id-PWSRestartIndication,
+ id-RANConfigurationUpdate,
+ id-RerouteNASRequest,
+ id-RRCInactiveTransitionReport,
+ id-SecondaryRATDataUsageReport,
+ id-TraceFailureIndication,
+ id-TraceStart,
+ id-UEContextModification,
+ id-UEContextRelease,
+ id-UEContextReleaseRequest,
+ id-UERadioCapabilityCheck,
+ id-UERadioCapabilityInfoIndication,
+ id-UETNLABindingRelease,
+ id-UplinkNASTransport,
+ id-UplinkNonUEAssociatedNRPPaTransport,
+ id-UplinkRANConfigurationTransfer,
+ id-UplinkRANStatusTransfer,
+ id-UplinkUEAssociatedNRPPaTransport,
+ id-WriteReplaceWarning
+FROM NGAP-Constants;
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure Class
+--
+-- **************************************************************
+
+NGAP-ELEMENTARY-PROCEDURE ::= CLASS {
+ &InitiatingMessage ,
+ &SuccessfulOutcome OPTIONAL,
+ &UnsuccessfulOutcome OPTIONAL,
+ &procedureCode ProcedureCode UNIQUE,
+ &criticality Criticality DEFAULT ignore
+}
+
+WITH SYNTAX {
+ INITIATING MESSAGE &InitiatingMessage
+ [SUCCESSFUL OUTCOME &SuccessfulOutcome]
+ [UNSUCCESSFUL OUTCOME &UnsuccessfulOutcome]
+ PROCEDURE CODE &procedureCode
+ [CRITICALITY &criticality]
+}
+
+-- **************************************************************
+--
+-- Interface PDU Definition
+--
+-- **************************************************************
+
+NGAP-PDU ::= CHOICE {
+ initiatingMessage InitiatingMessage,
+ successfulOutcome SuccessfulOutcome,
+ unsuccessfulOutcome UnsuccessfulOutcome,
+ ...
+}
+
+InitiatingMessage ::= SEQUENCE {
+ procedureCode NGAP-ELEMENTARY-PROCEDURE.&procedureCode ({NGAP-ELEMENTARY-PROCEDURES}),
+ criticality NGAP-ELEMENTARY-PROCEDURE.&criticality ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+ value NGAP-ELEMENTARY-PROCEDURE.&InitiatingMessage ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+SuccessfulOutcome ::= SEQUENCE {
+ procedureCode NGAP-ELEMENTARY-PROCEDURE.&procedureCode ({NGAP-ELEMENTARY-PROCEDURES}),
+ criticality NGAP-ELEMENTARY-PROCEDURE.&criticality ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+ value NGAP-ELEMENTARY-PROCEDURE.&SuccessfulOutcome ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+UnsuccessfulOutcome ::= SEQUENCE {
+ procedureCode NGAP-ELEMENTARY-PROCEDURE.&procedureCode ({NGAP-ELEMENTARY-PROCEDURES}),
+ criticality NGAP-ELEMENTARY-PROCEDURE.&criticality ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+ value NGAP-ELEMENTARY-PROCEDURE.&UnsuccessfulOutcome ({NGAP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure List
+--
+-- **************************************************************
+
+NGAP-ELEMENTARY-PROCEDURES NGAP-ELEMENTARY-PROCEDURE ::= {
+ NGAP-ELEMENTARY-PROCEDURES-CLASS-1 |
+ NGAP-ELEMENTARY-PROCEDURES-CLASS-2,
+ ...
+}
+
+NGAP-ELEMENTARY-PROCEDURES-CLASS-1 NGAP-ELEMENTARY-PROCEDURE ::= {
+ aMFConfigurationUpdate |
+ handoverCancel |
+ handoverPreparation |
+ handoverResourceAllocation |
+ initialContextSetup |
+ nGReset |
+ nGSetup |
+ pathSwitchRequest |
+ pDUSessionResourceModify |
+ pDUSessionResourceModifyIndication |
+ pDUSessionResourceRelease |
+ pDUSessionResourceSetup |
+ pWSCancel |
+ rANConfigurationUpdate |
+ uEContextModification |
+ uEContextRelease |
+ uERadioCapabilityCheck |
+ writeReplaceWarning
+}
+
+NGAP-ELEMENTARY-PROCEDURES-CLASS-2 NGAP-ELEMENTARY-PROCEDURE ::= {
+ aMFStatusIndication |
+ cellTrafficTrace |
+ deactivateTrace |
+ downlinkNASTransport |
+ downlinkNonUEAssociatedNRPPaTransport |
+ downlinkRANConfigurationTransfer |
+ downlinkRANStatusTransfer |
+ downlinkUEAssociatedNRPPaTransport |
+ errorIndication |
+ handoverNotification |
+ initialUEMessage |
+ locationReport |
+ locationReportingControl |
+ locationReportingFailureIndication |
+ nASNonDeliveryIndication |
+ overloadStart |
+ overloadStop |
+ paging |
+ pDUSessionResourceNotify |
+ privateMessage |
+ pWSFailureIndication |
+ pWSRestartIndication |
+ rerouteNASRequest |
+ rRCInactiveTransitionReport |
+ secondaryRATDataUsageReport |
+ traceFailureIndication |
+ traceStart |
+ uEContextReleaseRequest |
+ uERadioCapabilityInfoIndication |
+ uETNLABindingRelease |
+ uplinkNASTransport |
+ uplinkNonUEAssociatedNRPPaTransport |
+ uplinkRANConfigurationTransfer |
+ uplinkRANStatusTransfer |
+ uplinkUEAssociatedNRPPaTransport
+}
+
+-- **************************************************************
+--
+-- Interface Elementary Procedures
+--
+-- **************************************************************
+
+aMFConfigurationUpdate NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE AMFConfigurationUpdate
+ SUCCESSFUL OUTCOME AMFConfigurationUpdateAcknowledge
+ UNSUCCESSFUL OUTCOME AMFConfigurationUpdateFailure
+ PROCEDURE CODE id-AMFConfigurationUpdate
+ CRITICALITY reject
+}
+
+aMFStatusIndication NGAP-ELEMENTARY-PROCEDURE ::={
+ INITIATING MESSAGE AMFStatusIndication
+ PROCEDURE CODE id-AMFStatusIndication
+ CRITICALITY ignore
+}
+
+cellTrafficTrace NGAP-ELEMENTARY-PROCEDURE ::={
+ INITIATING MESSAGE CellTrafficTrace
+ PROCEDURE CODE id-CellTrafficTrace
+ CRITICALITY ignore
+}
+
+deactivateTrace NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DeactivateTrace
+ PROCEDURE CODE id-DeactivateTrace
+ CRITICALITY ignore
+}
+
+downlinkNASTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DownlinkNASTransport
+ PROCEDURE CODE id-DownlinkNASTransport
+ CRITICALITY ignore
+}
+
+downlinkNonUEAssociatedNRPPaTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DownlinkNonUEAssociatedNRPPaTransport
+ PROCEDURE CODE id-DownlinkNonUEAssociatedNRPPaTransport
+ CRITICALITY ignore
+}
+
+downlinkRANConfigurationTransfer NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DownlinkRANConfigurationTransfer
+ PROCEDURE CODE id-DownlinkRANConfigurationTransfer
+ CRITICALITY ignore
+}
+
+downlinkRANStatusTransfer NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DownlinkRANStatusTransfer
+ PROCEDURE CODE id-DownlinkRANStatusTransfer
+ CRITICALITY ignore
+}
+
+downlinkUEAssociatedNRPPaTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE DownlinkUEAssociatedNRPPaTransport
+ PROCEDURE CODE id-DownlinkUEAssociatedNRPPaTransport
+ CRITICALITY ignore
+}
+
+errorIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE ErrorIndication
+ PROCEDURE CODE id-ErrorIndication
+ CRITICALITY ignore
+}
+
+handoverCancel NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE HandoverCancel
+ SUCCESSFUL OUTCOME HandoverCancelAcknowledge
+ PROCEDURE CODE id-HandoverCancel
+ CRITICALITY reject
+}
+
+handoverNotification NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE HandoverNotify
+ PROCEDURE CODE id-HandoverNotification
+ CRITICALITY ignore
+}
+
+handoverPreparation NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE HandoverRequired
+ SUCCESSFUL OUTCOME HandoverCommand
+ UNSUCCESSFUL OUTCOME HandoverPreparationFailure
+ PROCEDURE CODE id-HandoverPreparation
+ CRITICALITY reject
+}
+
+handoverResourceAllocation NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE HandoverRequest
+ SUCCESSFUL OUTCOME HandoverRequestAcknowledge
+ UNSUCCESSFUL OUTCOME HandoverFailure
+ PROCEDURE CODE id-HandoverResourceAllocation
+ CRITICALITY reject
+}
+
+initialContextSetup NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE InitialContextSetupRequest
+ SUCCESSFUL OUTCOME InitialContextSetupResponse
+ UNSUCCESSFUL OUTCOME InitialContextSetupFailure
+ PROCEDURE CODE id-InitialContextSetup
+ CRITICALITY reject
+}
+
+initialUEMessage NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE InitialUEMessage
+ PROCEDURE CODE id-InitialUEMessage
+ CRITICALITY ignore
+}
+
+locationReport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE LocationReport
+ PROCEDURE CODE id-LocationReport
+ CRITICALITY ignore
+}
+
+locationReportingControl NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE LocationReportingControl
+ PROCEDURE CODE id-LocationReportingControl
+ CRITICALITY ignore
+}
+
+locationReportingFailureIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE LocationReportingFailureIndication
+ PROCEDURE CODE id-LocationReportingFailureIndication
+ CRITICALITY ignore
+}
+
+nASNonDeliveryIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE NASNonDeliveryIndication
+ PROCEDURE CODE id-NASNonDeliveryIndication
+ CRITICALITY ignore
+}
+
+nGReset NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE NGReset
+ SUCCESSFUL OUTCOME NGResetAcknowledge
+ PROCEDURE CODE id-NGReset
+ CRITICALITY reject
+}
+
+nGSetup NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE NGSetupRequest
+ SUCCESSFUL OUTCOME NGSetupResponse
+ UNSUCCESSFUL OUTCOME NGSetupFailure
+ PROCEDURE CODE id-NGSetup
+ CRITICALITY reject
+}
+
+overloadStart NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE OverloadStart
+ PROCEDURE CODE id-OverloadStart
+ CRITICALITY ignore
+}
+
+overloadStop NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE OverloadStop
+ PROCEDURE CODE id-OverloadStop
+ CRITICALITY reject
+}
+
+paging NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE Paging
+ PROCEDURE CODE id-Paging
+ CRITICALITY ignore
+}
+
+pathSwitchRequest NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PathSwitchRequest
+ SUCCESSFUL OUTCOME PathSwitchRequestAcknowledge
+ UNSUCCESSFUL OUTCOME PathSwitchRequestFailure
+ PROCEDURE CODE id-PathSwitchRequest
+ CRITICALITY reject
+}
+
+pDUSessionResourceModify NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PDUSessionResourceModifyRequest
+ SUCCESSFUL OUTCOME PDUSessionResourceModifyResponse
+ PROCEDURE CODE id-PDUSessionResourceModify
+ CRITICALITY reject
+}
+
+pDUSessionResourceModifyIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PDUSessionResourceModifyIndication
+ SUCCESSFUL OUTCOME PDUSessionResourceModifyConfirm
+ PROCEDURE CODE id-PDUSessionResourceModifyIndication
+ CRITICALITY reject
+}
+
+pDUSessionResourceNotify NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PDUSessionResourceNotify
+ PROCEDURE CODE id-PDUSessionResourceNotify
+ CRITICALITY ignore
+}
+
+pDUSessionResourceRelease NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PDUSessionResourceReleaseCommand
+ SUCCESSFUL OUTCOME PDUSessionResourceReleaseResponse
+ PROCEDURE CODE id-PDUSessionResourceRelease
+ CRITICALITY reject
+}
+
+pDUSessionResourceSetup NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PDUSessionResourceSetupRequest
+ SUCCESSFUL OUTCOME PDUSessionResourceSetupResponse
+ PROCEDURE CODE id-PDUSessionResourceSetup
+ CRITICALITY reject
+}
+
+privateMessage NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PrivateMessage
+ PROCEDURE CODE id-PrivateMessage
+ CRITICALITY ignore
+}
+
+pWSCancel NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PWSCancelRequest
+ SUCCESSFUL OUTCOME PWSCancelResponse
+ PROCEDURE CODE id-PWSCancel
+ CRITICALITY reject
+}
+
+pWSFailureIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PWSFailureIndication
+ PROCEDURE CODE id-PWSFailureIndication
+ CRITICALITY ignore
+}
+
+pWSRestartIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE PWSRestartIndication
+ PROCEDURE CODE id-PWSRestartIndication
+ CRITICALITY ignore
+}
+
+rANConfigurationUpdate NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE RANConfigurationUpdate
+ SUCCESSFUL OUTCOME RANConfigurationUpdateAcknowledge
+ UNSUCCESSFUL OUTCOME RANConfigurationUpdateFailure
+ PROCEDURE CODE id-RANConfigurationUpdate
+ CRITICALITY reject
+}
+
+rerouteNASRequest NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE RerouteNASRequest
+ PROCEDURE CODE id-RerouteNASRequest
+ CRITICALITY reject
+}
+
+rRCInactiveTransitionReport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE RRCInactiveTransitionReport
+ PROCEDURE CODE id-RRCInactiveTransitionReport
+ CRITICALITY ignore
+}
+
+secondaryRATDataUsageReport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE SecondaryRATDataUsageReport
+ PROCEDURE CODE id-SecondaryRATDataUsageReport
+ CRITICALITY ignore
+}
+
+traceFailureIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE TraceFailureIndication
+ PROCEDURE CODE id-TraceFailureIndication
+ CRITICALITY ignore
+}
+
+traceStart NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE TraceStart
+ PROCEDURE CODE id-TraceStart
+ CRITICALITY ignore
+}
+
+uEContextModification NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UEContextModificationRequest
+ SUCCESSFUL OUTCOME UEContextModificationResponse
+ UNSUCCESSFUL OUTCOME UEContextModificationFailure
+ PROCEDURE CODE id-UEContextModification
+ CRITICALITY reject
+}
+
+uEContextRelease NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UEContextReleaseCommand
+ SUCCESSFUL OUTCOME UEContextReleaseComplete
+ PROCEDURE CODE id-UEContextRelease
+ CRITICALITY reject
+}
+
+uEContextReleaseRequest NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UEContextReleaseRequest
+ PROCEDURE CODE id-UEContextReleaseRequest
+ CRITICALITY ignore
+}
+
+uERadioCapabilityCheck NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UERadioCapabilityCheckRequest
+ SUCCESSFUL OUTCOME UERadioCapabilityCheckResponse
+ PROCEDURE CODE id-UERadioCapabilityCheck
+ CRITICALITY reject
+}
+
+uERadioCapabilityInfoIndication NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UERadioCapabilityInfoIndication
+ PROCEDURE CODE id-UERadioCapabilityInfoIndication
+ CRITICALITY ignore
+}
+
+uETNLABindingRelease NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UETNLABindingReleaseRequest
+ PROCEDURE CODE id-UETNLABindingRelease
+ CRITICALITY ignore
+}
+
+uplinkNASTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UplinkNASTransport
+ PROCEDURE CODE id-UplinkNASTransport
+ CRITICALITY ignore
+}
+
+uplinkNonUEAssociatedNRPPaTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UplinkNonUEAssociatedNRPPaTransport
+ PROCEDURE CODE id-UplinkNonUEAssociatedNRPPaTransport
+ CRITICALITY ignore
+}
+
+uplinkRANConfigurationTransfer NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UplinkRANConfigurationTransfer
+ PROCEDURE CODE id-UplinkRANConfigurationTransfer
+ CRITICALITY ignore
+}
+
+uplinkRANStatusTransfer NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UplinkRANStatusTransfer
+ PROCEDURE CODE id-UplinkRANStatusTransfer
+ CRITICALITY ignore
+}
+
+uplinkUEAssociatedNRPPaTransport NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE UplinkUEAssociatedNRPPaTransport
+ PROCEDURE CODE id-UplinkUEAssociatedNRPPaTransport
+ CRITICALITY ignore
+}
+
+writeReplaceWarning NGAP-ELEMENTARY-PROCEDURE ::= {
+ INITIATING MESSAGE WriteReplaceWarningRequest
+ SUCCESSFUL OUTCOME WriteReplaceWarningResponse
+ PROCEDURE CODE id-WriteReplaceWarning
+ CRITICALITY reject
+}
+
+END
+-- ASN1STOP
+
+-- ASN1START
+-- **************************************************************
+--
+-- PDU definitions for NGAP.
+--
+-- **************************************************************
+
+NGAP-PDU-Contents {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-PDU-Contents (1) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+
+ AllowedNSSAI,
+ AMFName,
+ AMFSetID,
+ AMF-TNLAssociationSetupList,
+ AMF-TNLAssociationToAddList,
+ AMF-TNLAssociationToRemoveList,
+ AMF-TNLAssociationToUpdateList,
+ AMF-UE-NGAP-ID,
+ AssistanceDataForPaging,
+ BroadcastCancelledAreaList,
+ BroadcastCompletedAreaList,
+ CancelAllWarningMessages,
+ Cause,
+ CellIDListForRestart,
+ CNAssistedRANTuning,
+ ConcurrentWarningMessageInd,
+ CoreNetworkAssistanceInformationForInactive,
+ CPTransportLayerInformation,
+ CriticalityDiagnostics,
+ DataCodingScheme,
+ DirectForwardingPathAvailability,
+ EmergencyAreaIDListForRestart,
+ EmergencyFallbackIndicator,
+ EN-DCSONConfigurationTransfer,
+ EUTRA-CGI,
+ FiveG-S-TMSI,
+ GlobalRANNodeID,
+ GUAMI,
+ HandoverFlag,
+ HandoverType,
+ IMSVoiceSupportIndicator,
+ IndexToRFSP,
+ InfoOnRecommendedCellsAndRANNodesForPaging,
+ LocationReportingRequestType,
+ MaskedIMEISV,
+ MessageIdentifier,
+ MobilityRestrictionList,
+ NAS-PDU,
+ NASSecurityParametersFromNGRAN,
+ NewSecurityContextInd,
+ NGRAN-CGI,
+ NGRAN-TNLAssociationToRemoveList,
+ NGRANTraceID,
+ NR-CGI,
+ NRPPa-PDU,
+ NumberOfBroadcastsRequested,
+ OverloadResponse,
+ OverloadStartNSSAIList,
+ PagingDRX,
+ PagingOrigin,
+ PagingPriority,
+ PDUSessionAggregateMaximumBitRate,
+ PDUSessionResourceAdmittedList,
+ PDUSessionResourceFailedToModifyListModCfm,
+ PDUSessionResourceFailedToModifyListModRes,
+ PDUSessionResourceFailedToSetupListCxtFail,
+ PDUSessionResourceFailedToSetupListCxtRes,
+ PDUSessionResourceFailedToSetupListHOAck,
+ PDUSessionResourceFailedToSetupListPSReq,
+ PDUSessionResourceFailedToSetupListSURes,
+ PDUSessionResourceHandoverList,
+ PDUSessionResourceListCxtRelCpl,
+ PDUSessionResourceListCxtRelReq,
+ PDUSessionResourceListHORqd,
+ PDUSessionResourceModifyListModCfm,
+ PDUSessionResourceModifyListModInd,
+ PDUSessionResourceModifyListModReq,
+ PDUSessionResourceModifyListModRes,
+ PDUSessionResourceNotifyList,
+ PDUSessionResourceReleasedListNot,
+ PDUSessionResourceReleasedListPSAck,
+ PDUSessionResourceReleasedListPSFail,
+ PDUSessionResourceReleasedListRelRes,
+ PDUSessionResourceSecondaryRATUsageList,
+ PDUSessionResourceSetupListCxtReq,
+ PDUSessionResourceSetupListCxtRes,
+ PDUSessionResourceSetupListHOReq,
+ PDUSessionResourceSetupListSUReq,
+ PDUSessionResourceSetupListSURes,
+ PDUSessionResourceSwitchedList,
+ PDUSessionResourceToBeSwitchedDLList,
+ PDUSessionResourceToReleaseListHOCmd,
+ PDUSessionResourceToReleaseListRelCmd,
+ PLMNIdentity,
+ PLMNSupportList,
+ PWSFailedCellIDList,
+ RANNodeName,
+ RANPagingPriority,
+ RANStatusTransfer-TransparentContainer,
+ RAN-UE-NGAP-ID,
+ RedirectionVoiceFallback,
+ RelativeAMFCapacity,
+ RepetitionPeriod,
+ ResetType,
+ RoutingID,
+ RRCEstablishmentCause,
+ RRCInactiveTransitionReportRequest,
+ RRCState,
+ SecurityContext,
+ SecurityKey,
+ SerialNumber,
+ ServedGUAMIList,
+ SliceSupportList,
+ S-NSSAI,
+ SONConfigurationTransfer,
+ SourceToTarget-TransparentContainer,
+ SourceToTarget-AMFInformationReroute,
+ SupportedTAList,
+ TAIListForPaging,
+ TAIListForRestart,
+ TargetID,
+ TargetToSource-TransparentContainer,
+ TimeToWait,
+ TNLAssociationList,
+ TraceActivation,
+ TrafficLoadReductionIndication,
+ TransportLayerAddress,
+ UEAggregateMaximumBitRate,
+ UE-associatedLogicalNG-connectionList,
+ UEContextRequest,
+ UE-NGAP-IDs,
+ UEPagingIdentity,
+ UEPresenceInAreaOfInterestList,
+ UERadioCapability,
+ UERadioCapabilityForPaging,
+ UERetentionInformation,
+ UESecurityCapabilities,
+ UnavailableGUAMIList,
+ UserLocationInformation,
+ WarningAreaCoordinates,
+ WarningAreaList,
+ WarningMessageContents,
+ WarningSecurityInfo,
+ WarningType
+
+FROM NGAP-IEs
+
+ PrivateIE-Container{},
+ ProtocolExtensionContainer{},
+ ProtocolIE-Container{},
+ ProtocolIE-ContainerList{},
+ ProtocolIE-ContainerPair{},
+ ProtocolIE-SingleContainer{},
+ NGAP-PRIVATE-IES,
+ NGAP-PROTOCOL-EXTENSION,
+ NGAP-PROTOCOL-IES,
+ NGAP-PROTOCOL-IES-PAIR
+FROM NGAP-Containers
+
+ id-AllowedNSSAI,
+ id-AMFName,
+ id-AMFOverloadResponse,
+ id-AMFSetID,
+ id-AMF-TNLAssociationFailedToSetupList,
+ id-AMF-TNLAssociationSetupList,
+ id-AMF-TNLAssociationToAddList,
+ id-AMF-TNLAssociationToRemoveList,
+ id-AMF-TNLAssociationToUpdateList,
+ id-AMFTrafficLoadReductionIndication,
+ id-AMF-UE-NGAP-ID,
+ id-AssistanceDataForPaging,
+ id-BroadcastCancelledAreaList,
+ id-BroadcastCompletedAreaList,
+ id-CancelAllWarningMessages,
+ id-Cause,
+ id-CellIDListForRestart,
+ id-CNAssistedRANTuning,
+ id-ConcurrentWarningMessageInd,
+ id-CoreNetworkAssistanceInformationForInactive,
+ id-CriticalityDiagnostics,
+ id-DataCodingScheme,
+ id-DefaultPagingDRX,
+ id-DirectForwardingPathAvailability,
+ id-EmergencyAreaIDListForRestart,
+ id-EmergencyFallbackIndicator,
+ id-ENDC-SONConfigurationTransferDL,
+ id-ENDC-SONConfigurationTransferUL,
+ id-EUTRA-CGI,
+ id-FiveG-S-TMSI,
+ id-GlobalRANNodeID,
+ id-GUAMI,
+ id-HandoverFlag,
+ id-HandoverType,
+ id-IMSVoiceSupportIndicator,
+ id-IndexToRFSP,
+ id-InfoOnRecommendedCellsAndRANNodesForPaging,
+ id-LocationReportingRequestType,
+ id-MaskedIMEISV,
+ id-MessageIdentifier,
+ id-MobilityRestrictionList,
+ id-NAS-PDU,
+ id-NASC,
+ id-NASSecurityParametersFromNGRAN,
+ id-NewAMF-UE-NGAP-ID,
+ id-NewGUAMI,
+ id-NewSecurityContextInd,
+ id-NGAP-Message,
+ id-NGRAN-CGI,
+ id-NGRAN-TNLAssociationToRemoveList,
+ id-NGRANTraceID,
+ id-NR-CGI,
+ id-NRPPa-PDU,
+ id-NumberOfBroadcastsRequested,
+ id-OldAMF,
+ id-OverloadStartNSSAIList,
+ id-PagingDRX,
+ id-PagingOrigin,
+ id-PagingPriority,
+ id-PDUSessionResourceAdmittedList,
+ id-PDUSessionResourceFailedToModifyListModCfm,
+ id-PDUSessionResourceFailedToModifyListModRes,
+ id-PDUSessionResourceFailedToSetupListCxtFail,
+ id-PDUSessionResourceFailedToSetupListCxtRes,
+ id-PDUSessionResourceFailedToSetupListHOAck,
+ id-PDUSessionResourceFailedToSetupListPSReq,
+ id-PDUSessionResourceFailedToSetupListSURes,
+ id-PDUSessionResourceHandoverList,
+ id-PDUSessionResourceListCxtRelCpl,
+ id-PDUSessionResourceListCxtRelReq,
+ id-PDUSessionResourceListHORqd,
+ id-PDUSessionResourceModifyListModCfm,
+ id-PDUSessionResourceModifyListModInd,
+ id-PDUSessionResourceModifyListModReq,
+ id-PDUSessionResourceModifyListModRes,
+ id-PDUSessionResourceNotifyList,
+ id-PDUSessionResourceReleasedListNot,
+ id-PDUSessionResourceReleasedListPSAck,
+ id-PDUSessionResourceReleasedListPSFail,
+ id-PDUSessionResourceReleasedListRelRes,
+ id-PDUSessionResourceSecondaryRATUsageList,
+ id-PDUSessionResourceSetupListCxtReq,
+ id-PDUSessionResourceSetupListCxtRes,
+ id-PDUSessionResourceSetupListHOReq,
+ id-PDUSessionResourceSetupListSUReq,
+ id-PDUSessionResourceSetupListSURes,
+ id-PDUSessionResourceSwitchedList,
+ id-PDUSessionResourceToBeSwitchedDLList,
+ id-PDUSessionResourceToReleaseListHOCmd,
+ id-PDUSessionResourceToReleaseListRelCmd,
+ id-PLMNSupportList,
+ id-PWSFailedCellIDList,
+ id-RANNodeName,
+ id-RANPagingPriority,
+ id-RANStatusTransfer-TransparentContainer,
+ id-RAN-UE-NGAP-ID,
+ id-RedirectionVoiceFallback,
+ id-RelativeAMFCapacity,
+ id-RepetitionPeriod,
+ id-ResetType,
+ id-RoutingID,
+ id-RRCEstablishmentCause,
+ id-RRCInactiveTransitionReportRequest,
+ id-RRCState,
+ id-SecurityContext,
+ id-SecurityKey,
+ id-SelectedPLMNIdentity,
+ id-SerialNumber,
+ id-ServedGUAMIList,
+ id-SliceSupportList,
+ id-SONConfigurationTransferDL,
+ id-SONConfigurationTransferUL,
+ id-SourceAMF-UE-NGAP-ID,
+ id-SourceToTarget-TransparentContainer,
+ id-SourceToTarget-AMFInformationReroute,
+ id-SupportedTAList,
+ id-TAIListForPaging,
+ id-TAIListForRestart,
+ id-TargetID,
+ id-TargetToSource-TransparentContainer,
+ id-TimeToWait,
+ id-TraceActivation,
+ id-TraceCollectionEntityIPAddress,
+ id-UEAggregateMaximumBitRate,
+ id-UE-associatedLogicalNG-connectionList,
+ id-UEContextRequest,
+ id-UE-NGAP-IDs,
+ id-UEPagingIdentity,
+ id-UEPresenceInAreaOfInterestList,
+ id-UERadioCapability,
+ id-UERadioCapabilityForPaging,
+ id-UERetentionInformation,
+ id-UESecurityCapabilities,
+ id-UnavailableGUAMIList,
+ id-UserLocationInformation,
+ id-WarningAreaCoordinates,
+ id-WarningAreaList,
+ id-WarningMessageContents,
+ id-WarningSecurityInfo,
+ id-WarningType
+
+FROM NGAP-Constants;
+
+-- **************************************************************
+--
+-- PDU SESSION MANAGEMENT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU Session Resource Setup Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE SETUP REQUEST
+--
+-- **************************************************************
+
+PDUSessionResourceSetupRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceSetupRequestIEs} },
+ ...
+}
+
+PDUSessionResourceSetupRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANPagingPriority CRITICALITY ignore TYPE RANPagingPriority PRESENCE optional }|
+ { ID id-NAS-PDU CRITICALITY reject TYPE NAS-PDU PRESENCE optional }|
+ { ID id-PDUSessionResourceSetupListSUReq CRITICALITY reject TYPE PDUSessionResourceSetupListSUReq PRESENCE mandatory }|
+ { ID id-UEAggregateMaximumBitRate CRITICALITY ignore TYPE UEAggregateMaximumBitRate PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE SETUP RESPONSE
+--
+-- **************************************************************
+
+PDUSessionResourceSetupResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceSetupResponseIEs} },
+ ...
+}
+
+PDUSessionResourceSetupResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceSetupListSURes CRITICALITY ignore TYPE PDUSessionResourceSetupListSURes PRESENCE optional }|
+ { ID id-PDUSessionResourceFailedToSetupListSURes CRITICALITY ignore TYPE PDUSessionResourceFailedToSetupListSURes PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- PDU Session Resource Release Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE RELEASE COMMAND
+--
+-- **************************************************************
+
+PDUSessionResourceReleaseCommand ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceReleaseCommandIEs} },
+ ...
+}
+
+PDUSessionResourceReleaseCommandIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANPagingPriority CRITICALITY ignore TYPE RANPagingPriority PRESENCE optional }|
+ { ID id-NAS-PDU CRITICALITY ignore TYPE NAS-PDU PRESENCE optional }|
+ { ID id-PDUSessionResourceToReleaseListRelCmd CRITICALITY reject TYPE PDUSessionResourceToReleaseListRelCmd PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE RELEASE RESPONSE
+--
+-- **************************************************************
+
+PDUSessionResourceReleaseResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceReleaseResponseIEs} },
+ ...
+}
+
+PDUSessionResourceReleaseResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceReleasedListRelRes CRITICALITY ignore TYPE PDUSessionResourceReleasedListRelRes PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PDU Session Resource Modify Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE MODIFY REQUEST
+--
+-- **************************************************************
+
+PDUSessionResourceModifyRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceModifyRequestIEs} },
+ ...
+}
+
+PDUSessionResourceModifyRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANPagingPriority CRITICALITY ignore TYPE RANPagingPriority PRESENCE optional }|
+ { ID id-PDUSessionResourceModifyListModReq CRITICALITY reject TYPE PDUSessionResourceModifyListModReq PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE MODIFY RESPONSE
+--
+-- **************************************************************
+
+PDUSessionResourceModifyResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceModifyResponseIEs} },
+ ...
+}
+
+PDUSessionResourceModifyResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceModifyListModRes CRITICALITY ignore TYPE PDUSessionResourceModifyListModRes PRESENCE optional }|
+ { ID id-PDUSessionResourceFailedToModifyListModRes CRITICALITY ignore TYPE PDUSessionResourceFailedToModifyListModRes PRESENCE optional }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- PDU Session Resource Notify Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE NOTIFY
+--
+-- **************************************************************
+
+PDUSessionResourceNotify ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceNotifyIEs} },
+ ...
+}
+
+PDUSessionResourceNotifyIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceNotifyList CRITICALITY reject TYPE PDUSessionResourceNotifyList PRESENCE optional }|
+ { ID id-PDUSessionResourceReleasedListNot CRITICALITY ignore TYPE PDUSessionResourceReleasedListNot PRESENCE optional }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- PDU Session Resource Modify Indication Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE MODIFY INDICATION
+--
+-- **************************************************************
+
+PDUSessionResourceModifyIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceModifyIndicationIEs} },
+ ...
+}
+
+PDUSessionResourceModifyIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceModifyListModInd CRITICALITY reject TYPE PDUSessionResourceModifyListModInd PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- PDU SESSION RESOURCE MODIFY CONFIRM
+--
+-- **************************************************************
+
+PDUSessionResourceModifyConfirm ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceModifyConfirmIEs} },
+ ...
+}
+
+PDUSessionResourceModifyConfirmIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceModifyListModCfm CRITICALITY ignore TYPE PDUSessionResourceModifyListModCfm PRESENCE optional }|
+ { ID id-PDUSessionResourceFailedToModifyListModCfm CRITICALITY ignore TYPE PDUSessionResourceFailedToModifyListModCfm PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT MANAGEMENT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Initial Context Setup Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- INITIAL CONTEXT SETUP REQUEST
+--
+-- **************************************************************
+
+InitialContextSetupRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {InitialContextSetupRequestIEs} },
+ ...
+}
+
+InitialContextSetupRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-OldAMF CRITICALITY reject TYPE AMFName PRESENCE optional }|
+ { ID id-UEAggregateMaximumBitRate CRITICALITY reject TYPE UEAggregateMaximumBitRate PRESENCE conditional }|
+ { ID id-CoreNetworkAssistanceInformationForInactive CRITICALITY ignore TYPE CoreNetworkAssistanceInformationForInactive PRESENCE optional }|
+ { ID id-GUAMI CRITICALITY reject TYPE GUAMI PRESENCE mandatory }|
+ { ID id-PDUSessionResourceSetupListCxtReq CRITICALITY reject TYPE PDUSessionResourceSetupListCxtReq PRESENCE optional }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE mandatory }|
+ { ID id-UESecurityCapabilities CRITICALITY reject TYPE UESecurityCapabilities PRESENCE mandatory }|
+ { ID id-SecurityKey CRITICALITY reject TYPE SecurityKey PRESENCE mandatory }|
+ { ID id-TraceActivation CRITICALITY ignore TYPE TraceActivation PRESENCE optional }|
+ { ID id-MobilityRestrictionList CRITICALITY ignore TYPE MobilityRestrictionList PRESENCE optional }|
+ { ID id-UERadioCapability CRITICALITY ignore TYPE UERadioCapability PRESENCE optional }|
+ { ID id-IndexToRFSP CRITICALITY ignore TYPE IndexToRFSP PRESENCE optional }|
+ { ID id-MaskedIMEISV CRITICALITY ignore TYPE MaskedIMEISV PRESENCE optional }|
+ { ID id-NAS-PDU CRITICALITY ignore TYPE NAS-PDU PRESENCE optional }|
+ { ID id-EmergencyFallbackIndicator CRITICALITY reject TYPE EmergencyFallbackIndicator PRESENCE optional }|
+ { ID id-RRCInactiveTransitionReportRequest CRITICALITY ignore TYPE RRCInactiveTransitionReportRequest PRESENCE optional }|
+ { ID id-UERadioCapabilityForPaging CRITICALITY ignore TYPE UERadioCapabilityForPaging PRESENCE optional }|
+ { ID id-RedirectionVoiceFallback CRITICALITY ignore TYPE RedirectionVoiceFallback PRESENCE optional }|
+ { ID id-LocationReportingRequestType CRITICALITY ignore TYPE LocationReportingRequestType PRESENCE optional }|
+ { ID id-CNAssistedRANTuning CRITICALITY ignore TYPE CNAssistedRANTuning PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- INITIAL CONTEXT SETUP RESPONSE
+--
+-- **************************************************************
+
+InitialContextSetupResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {InitialContextSetupResponseIEs} },
+ ...
+}
+
+InitialContextSetupResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceSetupListCxtRes CRITICALITY ignore TYPE PDUSessionResourceSetupListCxtRes PRESENCE optional }|
+ { ID id-PDUSessionResourceFailedToSetupListCxtRes CRITICALITY ignore TYPE PDUSessionResourceFailedToSetupListCxtRes PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- INITIAL CONTEXT SETUP FAILURE
+--
+-- **************************************************************
+
+InitialContextSetupFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {InitialContextSetupFailureIEs} },
+ ...
+}
+
+InitialContextSetupFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceFailedToSetupListCxtFail CRITICALITY ignore TYPE PDUSessionResourceFailedToSetupListCxtFail PRESENCE optional }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE Context Release Request Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE CONTEXT RELEASE REQUEST
+--
+-- **************************************************************
+
+UEContextReleaseRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextReleaseRequest-IEs} },
+ ...
+}
+
+UEContextReleaseRequest-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceListCxtRelReq CRITICALITY reject TYPE PDUSessionResourceListCxtRelReq PRESENCE optional }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE Context Release Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE CONTEXT RELEASE COMMAND
+--
+-- **************************************************************
+
+UEContextReleaseCommand ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextReleaseCommand-IEs} },
+ ...
+}
+
+UEContextReleaseCommand-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-UE-NGAP-IDs CRITICALITY reject TYPE UE-NGAP-IDs PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT RELEASE COMPLETE
+--
+-- **************************************************************
+
+UEContextReleaseComplete ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextReleaseComplete-IEs} },
+ ...
+}
+
+UEContextReleaseComplete-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional }|
+ { ID id-InfoOnRecommendedCellsAndRANNodesForPaging CRITICALITY ignore TYPE InfoOnRecommendedCellsAndRANNodesForPaging PRESENCE optional }|
+ { ID id-PDUSessionResourceListCxtRelCpl CRITICALITY reject TYPE PDUSessionResourceListCxtRelCpl PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE Context Modification Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE CONTEXT MODIFICATION REQUEST
+--
+-- **************************************************************
+
+UEContextModificationRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextModificationRequestIEs} },
+ ...
+}
+
+UEContextModificationRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANPagingPriority CRITICALITY ignore TYPE RANPagingPriority PRESENCE optional }|
+ { ID id-SecurityKey CRITICALITY reject TYPE SecurityKey PRESENCE optional }|
+ { ID id-IndexToRFSP CRITICALITY ignore TYPE IndexToRFSP PRESENCE optional }|
+ { ID id-UEAggregateMaximumBitRate CRITICALITY ignore TYPE UEAggregateMaximumBitRate PRESENCE optional }|
+ { ID id-UESecurityCapabilities CRITICALITY reject TYPE UESecurityCapabilities PRESENCE optional }|
+ { ID id-CoreNetworkAssistanceInformationForInactive CRITICALITY ignore TYPE CoreNetworkAssistanceInformationForInactive PRESENCE optional }|
+ { ID id-EmergencyFallbackIndicator CRITICALITY reject TYPE EmergencyFallbackIndicator PRESENCE optional }|
+ { ID id-NewAMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE optional }|
+ { ID id-RRCInactiveTransitionReportRequest CRITICALITY ignore TYPE RRCInactiveTransitionReportRequest PRESENCE optional }|
+ { ID id-NewGUAMI CRITICALITY reject TYPE GUAMI PRESENCE optional }|
+ { ID id-CNAssistedRANTuning CRITICALITY ignore TYPE CNAssistedRANTuning PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT MODIFICATION RESPONSE
+--
+-- **************************************************************
+
+UEContextModificationResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextModificationResponseIEs} },
+ ...
+}
+
+UEContextModificationResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RRCState CRITICALITY ignore TYPE RRCState PRESENCE optional }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT MODIFICATION FAILURE
+--
+-- **************************************************************
+
+UEContextModificationFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UEContextModificationFailureIEs} },
+ ...
+}
+
+UEContextModificationFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- RRC INACTIVE TRANSITION REPORT
+--
+-- **************************************************************
+
+RRCInactiveTransitionReport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {RRCInactiveTransitionReportIEs} },
+ ...
+}
+
+RRCInactiveTransitionReportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RRCState CRITICALITY ignore TYPE RRCState PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE MOBILITY MANAGEMENT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Handover Preparation Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- HANDOVER REQUIRED
+--
+-- **************************************************************
+
+HandoverRequired ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {HandoverRequiredIEs} },
+ ...
+}
+
+HandoverRequiredIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-HandoverType CRITICALITY reject TYPE HandoverType PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-TargetID CRITICALITY reject TYPE TargetID PRESENCE mandatory }|
+ { ID id-DirectForwardingPathAvailability CRITICALITY ignore TYPE DirectForwardingPathAvailability PRESENCE optional }|
+ { ID id-PDUSessionResourceListHORqd CRITICALITY reject TYPE PDUSessionResourceListHORqd PRESENCE mandatory }|
+ { ID id-SourceToTarget-TransparentContainer CRITICALITY reject TYPE SourceToTarget-TransparentContainer PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER COMMAND
+--
+-- **************************************************************
+
+HandoverCommand ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {HandoverCommandIEs} },
+ ...
+}
+
+HandoverCommandIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-HandoverType CRITICALITY reject TYPE HandoverType PRESENCE mandatory }|
+ { ID id-NASSecurityParametersFromNGRAN CRITICALITY reject TYPE NASSecurityParametersFromNGRAN PRESENCE conditional }|
+ -- This IE shall be present if HandoverType IE is set to value "5GStoEPPS" --
+ { ID id-PDUSessionResourceHandoverList CRITICALITY ignore TYPE PDUSessionResourceHandoverList PRESENCE optional }|
+ { ID id-PDUSessionResourceToReleaseListHOCmd CRITICALITY ignore TYPE PDUSessionResourceToReleaseListHOCmd PRESENCE optional }|
+ { ID id-TargetToSource-TransparentContainer CRITICALITY reject TYPE TargetToSource-TransparentContainer PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- HANDOVER PREPARATION FAILURE
+--
+-- **************************************************************
+
+HandoverPreparationFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {HandoverPreparationFailureIEs} },
+ ...
+}
+
+HandoverPreparationFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- Handover Resource Allocation Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- HANDOVER REQUEST
+--
+-- **************************************************************
+
+HandoverRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {HandoverRequestIEs} },
+ ...
+}
+
+HandoverRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-HandoverType CRITICALITY reject TYPE HandoverType PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-UEAggregateMaximumBitRate CRITICALITY reject TYPE UEAggregateMaximumBitRate PRESENCE mandatory }|
+ { ID id-CoreNetworkAssistanceInformationForInactive CRITICALITY ignore TYPE CoreNetworkAssistanceInformationForInactive PRESENCE optional }|
+ { ID id-UESecurityCapabilities CRITICALITY reject TYPE UESecurityCapabilities PRESENCE mandatory }|
+ { ID id-SecurityContext CRITICALITY reject TYPE SecurityContext PRESENCE mandatory }|
+ { ID id-NewSecurityContextInd CRITICALITY reject TYPE NewSecurityContextInd PRESENCE optional }|
+ { ID id-NASC CRITICALITY reject TYPE NAS-PDU PRESENCE optional }|
+ { ID id-PDUSessionResourceSetupListHOReq CRITICALITY reject TYPE PDUSessionResourceSetupListHOReq PRESENCE mandatory }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE mandatory }|
+ { ID id-TraceActivation CRITICALITY ignore TYPE TraceActivation PRESENCE optional }|
+ { ID id-MaskedIMEISV CRITICALITY ignore TYPE MaskedIMEISV PRESENCE optional }|
+ { ID id-SourceToTarget-TransparentContainer CRITICALITY reject TYPE SourceToTarget-TransparentContainer PRESENCE mandatory }|
+ { ID id-MobilityRestrictionList CRITICALITY ignore TYPE MobilityRestrictionList PRESENCE optional }|
+ { ID id-LocationReportingRequestType CRITICALITY ignore TYPE LocationReportingRequestType PRESENCE optional }|
+ { ID id-RRCInactiveTransitionReportRequest CRITICALITY ignore TYPE RRCInactiveTransitionReportRequest PRESENCE optional }|
+ { ID id-GUAMI CRITICALITY reject TYPE GUAMI PRESENCE mandatory }|
+ { ID id-RedirectionVoiceFallback CRITICALITY ignore TYPE RedirectionVoiceFallback PRESENCE optional }|
+ { ID id-CNAssistedRANTuning CRITICALITY ignore TYPE CNAssistedRANTuning PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER REQUEST ACKNOWLEDGE
+--
+-- **************************************************************
+
+HandoverRequestAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {HandoverRequestAcknowledgeIEs} },
+ ...
+}
+
+HandoverRequestAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceAdmittedList CRITICALITY ignore TYPE PDUSessionResourceAdmittedList PRESENCE mandatory }|
+ { ID id-PDUSessionResourceFailedToSetupListHOAck CRITICALITY ignore TYPE PDUSessionResourceFailedToSetupListHOAck PRESENCE optional }|
+ { ID id-TargetToSource-TransparentContainer CRITICALITY reject TYPE TargetToSource-TransparentContainer PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- HANDOVER FAILURE
+--
+-- **************************************************************
+
+HandoverFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { HandoverFailureIEs} },
+ ...
+}
+
+HandoverFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- Handover Notification Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- HANDOVER NOTIFY
+--
+-- **************************************************************
+
+HandoverNotify ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { HandoverNotifyIEs} },
+ ...
+}
+
+HandoverNotifyIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- Path Switch Request Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PATH SWITCH REQUEST
+--
+-- **************************************************************
+
+PathSwitchRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { PathSwitchRequestIEs} },
+ ...
+}
+
+PathSwitchRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-SourceAMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE mandatory }|
+ { ID id-UESecurityCapabilities CRITICALITY ignore TYPE UESecurityCapabilities PRESENCE mandatory }|
+ { ID id-PDUSessionResourceToBeSwitchedDLList CRITICALITY reject TYPE PDUSessionResourceToBeSwitchedDLList PRESENCE mandatory }|
+ { ID id-PDUSessionResourceFailedToSetupListPSReq CRITICALITY ignore TYPE PDUSessionResourceFailedToSetupListPSReq PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- PATH SWITCH REQUEST ACKNOWLEDGE
+--
+-- **************************************************************
+
+PathSwitchRequestAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { PathSwitchRequestAcknowledgeIEs} },
+ ...
+}
+
+PathSwitchRequestAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UESecurityCapabilities CRITICALITY reject TYPE UESecurityCapabilities PRESENCE optional }|
+ { ID id-SecurityContext CRITICALITY reject TYPE SecurityContext PRESENCE mandatory }|
+ { ID id-NewSecurityContextInd CRITICALITY reject TYPE NewSecurityContextInd PRESENCE optional }|
+ { ID id-PDUSessionResourceSwitchedList CRITICALITY ignore TYPE PDUSessionResourceSwitchedList PRESENCE mandatory }|
+ { ID id-PDUSessionResourceReleasedListPSAck CRITICALITY ignore TYPE PDUSessionResourceReleasedListPSAck PRESENCE optional }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE mandatory }|
+ { ID id-CoreNetworkAssistanceInformationForInactive CRITICALITY ignore TYPE CoreNetworkAssistanceInformationForInactive PRESENCE optional }|
+ { ID id-RRCInactiveTransitionReportRequest CRITICALITY ignore TYPE RRCInactiveTransitionReportRequest PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }|
+ { ID id-RedirectionVoiceFallback CRITICALITY ignore TYPE RedirectionVoiceFallback PRESENCE optional }|
+ { ID id-CNAssistedRANTuning CRITICALITY ignore TYPE CNAssistedRANTuning PRESENCE optional },
+ ...
+}
+
+
+-- **************************************************************
+--
+-- PATH SWITCH REQUEST FAILURE
+--
+-- **************************************************************
+
+PathSwitchRequestFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { PathSwitchRequestFailureIEs} },
+ ...
+}
+
+PathSwitchRequestFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceReleasedListPSFail CRITICALITY ignore TYPE PDUSessionResourceReleasedListPSFail PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- Handover Cancellation Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- HANDOVER CANCEL
+--
+-- **************************************************************
+
+HandoverCancel ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { HandoverCancelIEs} },
+ ...
+}
+
+HandoverCancelIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER CANCEL ACKNOWLEDGE
+--
+-- **************************************************************
+
+HandoverCancelAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { { HandoverCancelAcknowledgeIEs} },
+ ...
+}
+
+HandoverCancelAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- Uplink RAN Status Transfer Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UPLINK RAN STATUS TRANSFER
+--
+-- **************************************************************
+
+UplinkRANStatusTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UplinkRANStatusTransferIEs} },
+ ...
+}
+
+UplinkRANStatusTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANStatusTransfer-TransparentContainer CRITICALITY reject TYPE RANStatusTransfer-TransparentContainer PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- Downlink RAN Status Transfer Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- DOWNLINK RAN STATUS TRANSFER
+--
+-- **************************************************************
+
+DownlinkRANStatusTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DownlinkRANStatusTransferIEs} },
+ ...
+}
+
+DownlinkRANStatusTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RANStatusTransfer-TransparentContainer CRITICALITY reject TYPE RANStatusTransfer-TransparentContainer PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- PAGING ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PAGING
+--
+-- **************************************************************
+
+Paging ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PagingIEs} },
+ ...
+}
+
+PagingIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-UEPagingIdentity CRITICALITY ignore TYPE UEPagingIdentity PRESENCE mandatory }|
+ { ID id-PagingDRX CRITICALITY ignore TYPE PagingDRX PRESENCE optional }|
+ { ID id-TAIListForPaging CRITICALITY ignore TYPE TAIListForPaging PRESENCE mandatory }|
+ { ID id-PagingPriority CRITICALITY ignore TYPE PagingPriority PRESENCE optional }|
+ { ID id-UERadioCapabilityForPaging CRITICALITY ignore TYPE UERadioCapabilityForPaging PRESENCE optional }|
+ { ID id-PagingOrigin CRITICALITY ignore TYPE PagingOrigin PRESENCE optional }|
+ { ID id-AssistanceDataForPaging CRITICALITY ignore TYPE AssistanceDataForPaging PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- NAS TRANSPORT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- INITIAL UE MESSAGE
+--
+-- **************************************************************
+
+InitialUEMessage ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {InitialUEMessage-IEs} },
+ ...
+}
+
+InitialUEMessage-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-NAS-PDU CRITICALITY reject TYPE NAS-PDU PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY reject TYPE UserLocationInformation PRESENCE mandatory }|
+ { ID id-RRCEstablishmentCause CRITICALITY ignore TYPE RRCEstablishmentCause PRESENCE mandatory }|
+ { ID id-FiveG-S-TMSI CRITICALITY reject TYPE FiveG-S-TMSI PRESENCE optional }|
+ { ID id-AMFSetID CRITICALITY ignore TYPE AMFSetID PRESENCE optional }|
+ { ID id-UEContextRequest CRITICALITY ignore TYPE UEContextRequest PRESENCE optional }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE optional }|
+ { ID id-SourceToTarget-AMFInformationReroute CRITICALITY ignore TYPE SourceToTarget-AMFInformationReroute PRESENCE optional }|
+ { ID id-SelectedPLMNIdentity CRITICALITY ignore TYPE PLMNIdentity PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- DOWNLINK NAS TRANSPORT
+--
+-- **************************************************************
+
+DownlinkNASTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DownlinkNASTransport-IEs} },
+ ...
+}
+
+DownlinkNASTransport-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-OldAMF CRITICALITY reject TYPE AMFName PRESENCE optional }|
+ { ID id-RANPagingPriority CRITICALITY ignore TYPE RANPagingPriority PRESENCE optional }|
+ { ID id-NAS-PDU CRITICALITY reject TYPE NAS-PDU PRESENCE mandatory }|
+ { ID id-MobilityRestrictionList CRITICALITY ignore TYPE MobilityRestrictionList PRESENCE optional }|
+ { ID id-IndexToRFSP CRITICALITY ignore TYPE IndexToRFSP PRESENCE optional }|
+ { ID id-UEAggregateMaximumBitRate CRITICALITY ignore TYPE UEAggregateMaximumBitRate PRESENCE optional }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UPLINK NAS TRANSPORT
+--
+-- **************************************************************
+
+UplinkNASTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UplinkNASTransport-IEs} },
+ ...
+}
+
+UplinkNASTransport-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-NAS-PDU CRITICALITY reject TYPE NAS-PDU PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- NAS NON DELIVERY INDICATION
+--
+-- **************************************************************
+
+NASNonDeliveryIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NASNonDeliveryIndication-IEs} },
+ ...
+}
+
+NASNonDeliveryIndication-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-NAS-PDU CRITICALITY ignore TYPE NAS-PDU PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- REROUTE NAS REQUEST
+--
+-- **************************************************************
+
+RerouteNASRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {RerouteNASRequest-IEs} },
+ ...
+}
+
+RerouteNASRequest-IEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE optional }|
+ { ID id-NGAP-Message CRITICALITY reject TYPE OCTET STRING PRESENCE mandatory }|
+ { ID id-AMFSetID CRITICALITY reject TYPE AMFSetID PRESENCE mandatory }|
+ { ID id-AllowedNSSAI CRITICALITY reject TYPE AllowedNSSAI PRESENCE optional }|
+ { ID id-SourceToTarget-AMFInformationReroute CRITICALITY ignore TYPE SourceToTarget-AMFInformationReroute PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- INTERFACE MANAGEMENT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- NG Setup Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- NG SETUP REQUEST
+--
+-- **************************************************************
+
+NGSetupRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NGSetupRequestIEs} },
+ ...
+}
+
+NGSetupRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-GlobalRANNodeID CRITICALITY reject TYPE GlobalRANNodeID PRESENCE mandatory }|
+ { ID id-RANNodeName CRITICALITY ignore TYPE RANNodeName PRESENCE optional}|
+ { ID id-SupportedTAList CRITICALITY reject TYPE SupportedTAList PRESENCE mandatory }|
+ { ID id-DefaultPagingDRX CRITICALITY ignore TYPE PagingDRX PRESENCE mandatory }|
+ { ID id-UERetentionInformation CRITICALITY ignore TYPE UERetentionInformation PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- NG SETUP RESPONSE
+--
+-- **************************************************************
+
+NGSetupResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NGSetupResponseIEs} },
+ ...
+}
+
+NGSetupResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMFName CRITICALITY reject TYPE AMFName PRESENCE mandatory }|
+ { ID id-ServedGUAMIList CRITICALITY reject TYPE ServedGUAMIList PRESENCE mandatory }|
+ { ID id-RelativeAMFCapacity CRITICALITY ignore TYPE RelativeAMFCapacity PRESENCE mandatory }|
+ { ID id-PLMNSupportList CRITICALITY reject TYPE PLMNSupportList PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional }|
+ { ID id-UERetentionInformation CRITICALITY ignore TYPE UERetentionInformation PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- NG SETUP FAILURE
+--
+-- **************************************************************
+
+NGSetupFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NGSetupFailureIEs} },
+ ...
+}
+
+NGSetupFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- RAN Configuration Update Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- RAN CONFIGURATION UPDATE
+--
+-- **************************************************************
+
+RANConfigurationUpdate ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {RANConfigurationUpdateIEs} },
+ ...
+}
+
+RANConfigurationUpdateIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RANNodeName CRITICALITY ignore TYPE RANNodeName PRESENCE optional }|
+ { ID id-SupportedTAList CRITICALITY reject TYPE SupportedTAList PRESENCE optional }|
+ { ID id-DefaultPagingDRX CRITICALITY ignore TYPE PagingDRX PRESENCE optional }|
+ { ID id-GlobalRANNodeID CRITICALITY ignore TYPE GlobalRANNodeID PRESENCE optional }|
+ { ID id-NGRAN-TNLAssociationToRemoveList CRITICALITY reject TYPE NGRAN-TNLAssociationToRemoveList PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- RAN CONFIGURATION UPDATE ACKNOWLEDGE
+--
+-- **************************************************************
+
+RANConfigurationUpdateAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {RANConfigurationUpdateAcknowledgeIEs} },
+ ...
+}
+
+RANConfigurationUpdateAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- RAN CONFIGURATION UPDATE FAILURE
+--
+-- **************************************************************
+
+RANConfigurationUpdateFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {RANConfigurationUpdateFailureIEs} },
+ ...
+}
+
+RANConfigurationUpdateFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+...
+}
+
+-- **************************************************************
+--
+-- AMF Configuration Update Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- AMF CONFIGURATION UPDATE
+--
+-- **************************************************************
+
+AMFConfigurationUpdate ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {AMFConfigurationUpdateIEs} },
+ ...
+}
+
+AMFConfigurationUpdateIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMFName CRITICALITY reject TYPE AMFName PRESENCE optional }|
+ { ID id-ServedGUAMIList CRITICALITY reject TYPE ServedGUAMIList PRESENCE optional }|
+ { ID id-RelativeAMFCapacity CRITICALITY ignore TYPE RelativeAMFCapacity PRESENCE optional }|
+ { ID id-PLMNSupportList CRITICALITY reject TYPE PLMNSupportList PRESENCE optional }|
+ { ID id-AMF-TNLAssociationToAddList CRITICALITY ignore TYPE AMF-TNLAssociationToAddList PRESENCE optional }|
+ { ID id-AMF-TNLAssociationToRemoveList CRITICALITY ignore TYPE AMF-TNLAssociationToRemoveList PRESENCE optional }|
+ { ID id-AMF-TNLAssociationToUpdateList CRITICALITY ignore TYPE AMF-TNLAssociationToUpdateList PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- AMF CONFIGURATION UPDATE ACKNOWLEDGE
+--
+-- **************************************************************
+
+AMFConfigurationUpdateAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {AMFConfigurationUpdateAcknowledgeIEs} },
+ ...
+}
+
+AMFConfigurationUpdateAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-TNLAssociationSetupList CRITICALITY ignore TYPE AMF-TNLAssociationSetupList PRESENCE optional }|
+ { ID id-AMF-TNLAssociationFailedToSetupList CRITICALITY ignore TYPE TNLAssociationList PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- AMF CONFIGURATION UPDATE FAILURE
+--
+-- **************************************************************
+
+AMFConfigurationUpdateFailure ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {AMFConfigurationUpdateFailureIEs} },
+ ...
+}
+
+AMFConfigurationUpdateFailureIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-TimeToWait CRITICALITY ignore TYPE TimeToWait PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- AMF Status Indication Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- AMF STATUS INDICATION
+--
+-- **************************************************************
+
+AMFStatusIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {AMFStatusIndicationIEs} },
+ ...
+}
+
+AMFStatusIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-UnavailableGUAMIList CRITICALITY reject TYPE UnavailableGUAMIList PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- NG Reset Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- NG RESET
+--
+-- **************************************************************
+
+NGReset ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NGResetIEs} },
+ ...
+}
+
+NGResetIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory }|
+ { ID id-ResetType CRITICALITY reject TYPE ResetType PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- NG RESET ACKNOWLEDGE
+--
+-- **************************************************************
+
+NGResetAcknowledge ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {NGResetAcknowledgeIEs} },
+ ...
+}
+
+NGResetAcknowledgeIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-UE-associatedLogicalNG-connectionList CRITICALITY ignore TYPE UE-associatedLogicalNG-connectionList PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- Error Indication Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- ERROR INDICATION
+--
+-- **************************************************************
+
+ErrorIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {ErrorIndicationIEs} },
+ ...
+}
+
+ErrorIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE optional }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE optional }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- OVERLOAD START
+--
+-- **************************************************************
+
+OverloadStart ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {OverloadStartIEs} },
+ ...
+}
+
+OverloadStartIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMFOverloadResponse CRITICALITY reject TYPE OverloadResponse PRESENCE optional }|
+ { ID id-AMFTrafficLoadReductionIndication CRITICALITY ignore TYPE TrafficLoadReductionIndication PRESENCE optional }|
+ { ID id-OverloadStartNSSAIList CRITICALITY ignore TYPE OverloadStartNSSAIList PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- OVERLOAD STOP
+--
+-- **************************************************************
+
+OverloadStop ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {OverloadStopIEs} },
+ ...
+}
+
+OverloadStopIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+-- **************************************************************
+--
+-- CONFIGURATION TRANSFER ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UPLINK RAN CONFIGURATION TRANSFER
+--
+-- **************************************************************
+
+UplinkRANConfigurationTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UplinkRANConfigurationTransferIEs} },
+ ...
+}
+
+UplinkRANConfigurationTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-SONConfigurationTransferUL CRITICALITY ignore TYPE SONConfigurationTransfer PRESENCE optional }|
+ { ID id-ENDC-SONConfigurationTransferUL CRITICALITY ignore TYPE EN-DCSONConfigurationTransfer PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- DOWNLINK RAN CONFIGURATION TRANSFER
+--
+-- **************************************************************
+
+DownlinkRANConfigurationTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DownlinkRANConfigurationTransferIEs} },
+ ...
+}
+
+DownlinkRANConfigurationTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-SONConfigurationTransferDL CRITICALITY ignore TYPE SONConfigurationTransfer PRESENCE optional }|
+ { ID id-ENDC-SONConfigurationTransferDL CRITICALITY ignore TYPE EN-DCSONConfigurationTransfer PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- WARNING MESSAGE TRANSMISSION ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Write-Replace Warning Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- WRITE-REPLACE WARNING REQUEST
+--
+-- **************************************************************
+
+WriteReplaceWarningRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {WriteReplaceWarningRequestIEs} },
+ ...
+}
+
+WriteReplaceWarningRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-MessageIdentifier CRITICALITY reject TYPE MessageIdentifier PRESENCE mandatory }|
+ { ID id-SerialNumber CRITICALITY reject TYPE SerialNumber PRESENCE mandatory }|
+ { ID id-WarningAreaList CRITICALITY ignore TYPE WarningAreaList PRESENCE optional }|
+ { ID id-RepetitionPeriod CRITICALITY reject TYPE RepetitionPeriod PRESENCE mandatory }|
+ { ID id-NumberOfBroadcastsRequested CRITICALITY reject TYPE NumberOfBroadcastsRequested PRESENCE mandatory }|
+ { ID id-WarningType CRITICALITY ignore TYPE WarningType PRESENCE optional }|
+ { ID id-WarningSecurityInfo CRITICALITY ignore TYPE WarningSecurityInfo PRESENCE optional }|
+ { ID id-DataCodingScheme CRITICALITY ignore TYPE DataCodingScheme PRESENCE optional }|
+ { ID id-WarningMessageContents CRITICALITY ignore TYPE WarningMessageContents PRESENCE optional }|
+ { ID id-ConcurrentWarningMessageInd CRITICALITY reject TYPE ConcurrentWarningMessageInd PRESENCE optional }|
+ { ID id-WarningAreaCoordinates CRITICALITY ignore TYPE WarningAreaCoordinates PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- WRITE-REPLACE WARNING RESPONSE
+--
+-- **************************************************************
+
+WriteReplaceWarningResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {WriteReplaceWarningResponseIEs} },
+ ...
+}
+
+WriteReplaceWarningResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-MessageIdentifier CRITICALITY reject TYPE MessageIdentifier PRESENCE mandatory }|
+ { ID id-SerialNumber CRITICALITY reject TYPE SerialNumber PRESENCE mandatory }|
+ { ID id-BroadcastCompletedAreaList CRITICALITY ignore TYPE BroadcastCompletedAreaList PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PWS Cancel Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PWS CANCEL REQUEST
+--
+-- **************************************************************
+
+PWSCancelRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PWSCancelRequestIEs} },
+ ...
+}
+
+PWSCancelRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-MessageIdentifier CRITICALITY reject TYPE MessageIdentifier PRESENCE mandatory }|
+ { ID id-SerialNumber CRITICALITY reject TYPE SerialNumber PRESENCE mandatory }|
+ { ID id-WarningAreaList CRITICALITY ignore TYPE WarningAreaList PRESENCE optional }|
+ { ID id-CancelAllWarningMessages CRITICALITY reject TYPE CancelAllWarningMessages PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PWS CANCEL RESPONSE
+--
+-- **************************************************************
+
+PWSCancelResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PWSCancelResponseIEs} },
+ ...
+}
+
+PWSCancelResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-MessageIdentifier CRITICALITY reject TYPE MessageIdentifier PRESENCE mandatory }|
+ { ID id-SerialNumber CRITICALITY reject TYPE SerialNumber PRESENCE mandatory }|
+ { ID id-BroadcastCancelledAreaList CRITICALITY ignore TYPE BroadcastCancelledAreaList PRESENCE optional }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PWS Restart Indication Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PWS RESTART INDICATION
+--
+-- **************************************************************
+
+PWSRestartIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PWSRestartIndicationIEs} },
+ ...
+}
+
+PWSRestartIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-CellIDListForRestart CRITICALITY reject TYPE CellIDListForRestart PRESENCE mandatory }|
+ { ID id-GlobalRANNodeID CRITICALITY reject TYPE GlobalRANNodeID PRESENCE mandatory }|
+ { ID id-TAIListForRestart CRITICALITY reject TYPE TAIListForRestart PRESENCE mandatory }|
+ { ID id-EmergencyAreaIDListForRestart CRITICALITY reject TYPE EmergencyAreaIDListForRestart PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PWS Failure Indication Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PWS FAILURE INDICATION
+--
+-- **************************************************************
+
+PWSFailureIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PWSFailureIndicationIEs} },
+ ...
+}
+
+PWSFailureIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-PWSFailedCellIDList CRITICALITY reject TYPE PWSFailedCellIDList PRESENCE mandatory }|
+ { ID id-GlobalRANNodeID CRITICALITY reject TYPE GlobalRANNodeID PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- NRPPA TRANSPORT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- DOWNLINK UE ASSOCIATED NRPPA TRANSPORT
+--
+-- **************************************************************
+
+DownlinkUEAssociatedNRPPaTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DownlinkUEAssociatedNRPPaTransportIEs} },
+ ...
+}
+
+DownlinkUEAssociatedNRPPaTransportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RoutingID CRITICALITY reject TYPE RoutingID PRESENCE mandatory }|
+ { ID id-NRPPa-PDU CRITICALITY reject TYPE NRPPa-PDU PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UPLINK UE ASSOCIATED NRPPA TRANSPORT
+--
+-- **************************************************************
+
+UplinkUEAssociatedNRPPaTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UplinkUEAssociatedNRPPaTransportIEs} },
+ ...
+}
+
+UplinkUEAssociatedNRPPaTransportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RoutingID CRITICALITY reject TYPE RoutingID PRESENCE mandatory }|
+ { ID id-NRPPa-PDU CRITICALITY reject TYPE NRPPa-PDU PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT
+--
+-- **************************************************************
+
+DownlinkNonUEAssociatedNRPPaTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DownlinkNonUEAssociatedNRPPaTransportIEs} },
+ ...
+}
+
+DownlinkNonUEAssociatedNRPPaTransportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RoutingID CRITICALITY reject TYPE RoutingID PRESENCE mandatory }|
+ { ID id-NRPPa-PDU CRITICALITY reject TYPE NRPPa-PDU PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UPLINK NON UE ASSOCIATED NRPPA TRANSPORT
+--
+-- **************************************************************
+
+UplinkNonUEAssociatedNRPPaTransport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UplinkNonUEAssociatedNRPPaTransportIEs} },
+ ...
+}
+
+UplinkNonUEAssociatedNRPPaTransportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-RoutingID CRITICALITY reject TYPE RoutingID PRESENCE mandatory }|
+ { ID id-NRPPa-PDU CRITICALITY reject TYPE NRPPa-PDU PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- TRACE ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- TRACE START
+--
+-- **************************************************************
+
+TraceStart ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {TraceStartIEs} },
+ ...
+}
+
+TraceStartIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-TraceActivation CRITICALITY ignore TYPE TraceActivation PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- TRACE FAILURE INDICATION
+--
+-- **************************************************************
+
+TraceFailureIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {TraceFailureIndicationIEs} },
+ ...
+}
+
+TraceFailureIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-NGRANTraceID CRITICALITY ignore TYPE NGRANTraceID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- DEACTIVATE TRACE
+--
+-- **************************************************************
+
+DeactivateTrace ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {DeactivateTraceIEs} },
+ ...
+}
+
+DeactivateTraceIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-NGRANTraceID CRITICALITY ignore TYPE NGRANTraceID PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- CELL TRAFFIC TRACE
+--
+-- **************************************************************
+
+CellTrafficTrace ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {CellTrafficTraceIEs} },
+ ...
+}
+
+CellTrafficTraceIEs NGAP-PROTOCOL-IES ::= {
+ {ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ {ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ {ID id-NGRANTraceID CRITICALITY ignore TYPE NGRANTraceID PRESENCE mandatory }|
+ {ID id-NGRAN-CGI CRITICALITY ignore TYPE NGRAN-CGI PRESENCE mandatory }|
+ {ID id-TraceCollectionEntityIPAddress CRITICALITY ignore TYPE TransportLayerAddress PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- LOCATION REPORTING ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- LOCATION REPORTING CONTROL
+--
+-- **************************************************************
+
+LocationReportingControl ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {LocationReportingControlIEs} },
+ ...
+}
+
+LocationReportingControlIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-LocationReportingRequestType CRITICALITY ignore TYPE LocationReportingRequestType PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- LOCATION REPORTING FAILURE INDICATION
+--
+-- **************************************************************
+
+LocationReportingFailureIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {LocationReportingFailureIndicationIEs} },
+ ...
+}
+
+LocationReportingFailureIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-Cause CRITICALITY ignore TYPE Cause PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- LOCATION REPORT
+--
+-- **************************************************************
+
+LocationReport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {LocationReportIEs} },
+ ...
+}
+
+LocationReportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE mandatory }|
+ { ID id-UEPresenceInAreaOfInterestList CRITICALITY ignore TYPE UEPresenceInAreaOfInterestList PRESENCE optional }|
+ { ID id-LocationReportingRequestType CRITICALITY ignore TYPE LocationReportingRequestType PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE TNLA BINDING ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE TNLA BINDING RELEASE REQUEST
+--
+-- **************************************************************
+
+UETNLABindingReleaseRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UETNLABindingReleaseRequestIEs} },
+ ...
+}
+
+UETNLABindingReleaseRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE RADIO CAPABILITY MANAGEMENT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE RADIO CAPABILITY INFO INDICATION
+--
+-- **************************************************************
+
+UERadioCapabilityInfoIndication ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UERadioCapabilityInfoIndicationIEs} },
+ ...
+}
+
+UERadioCapabilityInfoIndicationIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UERadioCapability CRITICALITY ignore TYPE UERadioCapability PRESENCE mandatory }|
+ { ID id-UERadioCapabilityForPaging CRITICALITY ignore TYPE UERadioCapabilityForPaging PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE Radio Capability Check Elementary Procedure
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE RADIO CAPABILITY CHECK REQUEST
+--
+-- **************************************************************
+
+UERadioCapabilityCheckRequest ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UERadioCapabilityCheckRequestIEs} },
+ ...
+}
+
+UERadioCapabilityCheckRequestIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY reject TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY reject TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-UERadioCapability CRITICALITY ignore TYPE UERadioCapability PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- UE RADIO CAPABILITY CHECK RESPONSE
+--
+-- **************************************************************
+
+UERadioCapabilityCheckResponse ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {UERadioCapabilityCheckResponseIEs} },
+ ...
+}
+
+UERadioCapabilityCheckResponseIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-IMSVoiceSupportIndicator CRITICALITY reject TYPE IMSVoiceSupportIndicator PRESENCE mandatory }|
+ { ID id-CriticalityDiagnostics CRITICALITY ignore TYPE CriticalityDiagnostics PRESENCE optional },
+ ...
+}
+
+-- **************************************************************
+--
+-- PRIVATE MESSAGE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PRIVATE MESSAGE
+--
+-- **************************************************************
+
+PrivateMessage ::= SEQUENCE {
+ privateIEs PrivateIE-Container { { PrivateMessageIEs } },
+ ...
+}
+
+PrivateMessageIEs NGAP-PRIVATE-IES ::= {
+ ...
+}
+
+
+-- **************************************************************
+--
+-- DATA USAGE REPORTING ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- SECONDARY RAT DATA USAGE REPORT
+--
+-- **************************************************************
+
+SecondaryRATDataUsageReport ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {SecondaryRATDataUsageReportIEs} },
+ ...
+}
+
+SecondaryRATDataUsageReportIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-AMF-UE-NGAP-ID CRITICALITY ignore TYPE AMF-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-RAN-UE-NGAP-ID CRITICALITY ignore TYPE RAN-UE-NGAP-ID PRESENCE mandatory }|
+ { ID id-PDUSessionResourceSecondaryRATUsageList CRITICALITY ignore TYPE PDUSessionResourceSecondaryRATUsageList PRESENCE mandatory }|
+ { ID id-HandoverFlag CRITICALITY ignore TYPE HandoverFlag PRESENCE optional }|
+ { ID id-UserLocationInformation CRITICALITY ignore TYPE UserLocationInformation PRESENCE optional },
+ ...
+}
+
+
+END
+-- ASN1STOP
+
+-- ASN1START
+-- **************************************************************
+--
+-- Information Element Definitions
+--
+-- **************************************************************
+
+NGAP-IEs {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-IEs (2) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+IMPORTS
+
+ id-AdditionalDLForwardingUPTNLInformation,
+ id-AdditionalULForwardingUPTNLInformation,
+ id-AdditionalDLQosFlowPerTNLInformation,
+ id-AdditionalDLUPTNLInformationForHOList,
+ id-AdditionalNGU-UP-TNLInformation,
+ id-AdditionalUL-NGU-UP-TNLInformation,
+ id-Cause,
+ id-CNTypeRestrictionsForEquivalent,
+ id-CNTypeRestrictionsForServing,
+ id-CommonNetworkInstance,
+ id-DataForwardingNotPossible,
+ id-DL-NGU-UP-TNLInformation,
+ id-EndpointIPAddressAndPort,
+ id-LastEUTRAN-PLMNIdentity,
+ id-LocationReportingAdditionalInfo,
+ id-MaximumIntegrityProtectedDataRate-DL,
+ id-NetworkInstance,
+ id-OldAssociatedQosFlowList-ULendmarkerexpected,
+ id-PDUSessionAggregateMaximumBitRate,
+ id-PDUSessionResourceFailedToSetupListCxtFail,
+ id-PDUSessionResourceReleaseResponseTransfer,
+ id-PDUSessionType,
+ id-PSCellInformation,
+ id-QosFlowAddOrModifyRequestList,
+ id-QosFlowSetupRequestList,
+ id-QosFlowToReleaseList,
+ id-SCTP-TLAs,
+ id-SecondaryRATUsageInformation,
+ id-SecurityIndication,
+ id-SecurityResult,
+ id-S-NSSAI,
+ id-TNLAssociationTransportLayerAddressNGRAN,
+ id-UL-NGU-UP-TNLInformation,
+ id-UL-NGU-UP-TNLModifyList,
+ id-ULForwarding,
+ id-ULForwardingUP-TNLInformation,
+ maxnoofAllowedAreas,
+ maxnoofAllowedS-NSSAIs,
+ maxnoofBPLMNs,
+ maxnoofCellIDforWarning,
+ maxnoofCellinAoI,
+ maxnoofCellinEAI,
+ maxnoofCellsingNB,
+ maxnoofCellsinngeNB,
+ maxnoofCellinTAI,
+ maxnoofCellsinUEHistoryInfo,
+ maxnoofCellsUEMovingTrajectory,
+ maxnoofDRBs,
+ maxnoofEmergencyAreaID,
+ maxnoofEAIforRestart,
+ maxnoofEPLMNs,
+ maxnoofEPLMNsPlusOne,
+ maxnoofE-RABs,
+ maxnoofErrors,
+ maxnoofForbTACs,
+ maxnoofMultiConnectivity,
+ maxnoofMultiConnectivityMinusOne,
+ maxnoofNGConnectionsToReset,
+ maxnoofPDUSessions,
+ maxnoofPLMNs,
+ maxnoofQosFlows,
+ maxnoofRANNodeinAoI,
+ maxnoofRecommendedCells,
+ maxnoofRecommendedRANNodes,
+ maxnoofAoI,
+ maxnoofServedGUAMIs,
+ maxnoofSliceItems,
+ maxnoofTACs,
+ maxnoofTAIforInactive,
+ maxnoofTAIforPaging,
+ maxnoofTAIforRestart,
+ maxnoofTAIforWarning,
+ maxnoofTAIinAoI,
+ maxnoofTimePeriods,
+ maxnoofTNLAssociations,
+ maxnoofXnExtTLAs,
+ maxnoofXnGTP-TLAs,
+ maxnoofXnTLAs
+
+FROM NGAP-Constants
+
+ Criticality,
+ ProcedureCode,
+ ProtocolIE-ID,
+ TriggeringMessage
+FROM NGAP-CommonDataTypes
+
+ ProtocolExtensionContainer{},
+ ProtocolIE-Container{},
+ NGAP-PROTOCOL-EXTENSION,
+ ProtocolIE-SingleContainer{},
+ NGAP-PROTOCOL-IES
+FROM NGAP-Containers;
+
+-- A
+
+AdditionalDLUPTNLInformationForHOList ::= SEQUENCE (SIZE(1..maxnoofMultiConnectivityMinusOne)) OF AdditionalDLUPTNLInformationForHOItem
+
+AdditionalDLUPTNLInformationForHOItem ::= SEQUENCE {
+ additionalDL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ additionalQosFlowSetupResponseList QosFlowListWithDataForwarding,
+ additionalDLForwardingUPTNLInformation UPTransportLayerInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { { AdditionalDLUPTNLInformationForHOItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AdditionalDLUPTNLInformationForHOItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AdditionalQosFlowInformation ::= ENUMERATED {
+ more-likely,
+ ...
+}
+
+AllocationAndRetentionPriority ::= SEQUENCE {
+ priorityLevelARP PriorityLevelARP,
+ pre-emptionCapability Pre-emptionCapability,
+ pre-emptionVulnerability Pre-emptionVulnerability,
+ iE-Extensions ProtocolExtensionContainer { {AllocationAndRetentionPriority-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AllocationAndRetentionPriority-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AllowedNSSAI ::= SEQUENCE (SIZE(1..maxnoofAllowedS-NSSAIs)) OF AllowedNSSAI-Item
+
+AllowedNSSAI-Item ::= SEQUENCE {
+ s-NSSAI S-NSSAI,
+ iE-Extensions ProtocolExtensionContainer { {AllowedNSSAI-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AllowedNSSAI-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AllowedTACs ::= SEQUENCE (SIZE(1..maxnoofAllowedAreas)) OF TAC
+
+AMFName ::= PrintableString (SIZE(1..150, ...))
+
+AMFPagingTarget ::= CHOICE {
+ globalRANNodeID GlobalRANNodeID,
+ tAI TAI,
+ choice-Extensions ProtocolIE-SingleContainer { {AMFPagingTarget-ExtIEs} }
+}
+
+AMFPagingTarget-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+AMFPointer ::= BIT STRING (SIZE(6))
+
+AMFRegionID ::= BIT STRING (SIZE(8))
+
+AMFSetID ::= BIT STRING (SIZE(10))
+
+AMF-TNLAssociationSetupList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF AMF-TNLAssociationSetupItem
+
+AMF-TNLAssociationSetupItem ::= SEQUENCE {
+ aMF-TNLAssociationAddress CPTransportLayerInformation,
+ iE-Extensions ProtocolExtensionContainer { {AMF-TNLAssociationSetupItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AMF-TNLAssociationSetupItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AMF-TNLAssociationToAddList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF AMF-TNLAssociationToAddItem
+
+AMF-TNLAssociationToAddItem ::= SEQUENCE {
+ aMF-TNLAssociationAddress CPTransportLayerInformation,
+ tNLAssociationUsage TNLAssociationUsage OPTIONAL,
+ tNLAddressWeightFactor TNLAddressWeightFactor,
+ iE-Extensions ProtocolExtensionContainer { {AMF-TNLAssociationToAddItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AMF-TNLAssociationToAddItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AMF-TNLAssociationToRemoveList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF AMF-TNLAssociationToRemoveItem
+
+AMF-TNLAssociationToRemoveItem ::= SEQUENCE {
+ aMF-TNLAssociationAddress CPTransportLayerInformation,
+ iE-Extensions ProtocolExtensionContainer { {AMF-TNLAssociationToRemoveItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AMF-TNLAssociationToRemoveItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ {ID id-TNLAssociationTransportLayerAddressNGRAN CRITICALITY reject EXTENSION CPTransportLayerInformation PRESENCE optional},
+ ...
+}
+
+AMF-TNLAssociationToUpdateList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF AMF-TNLAssociationToUpdateItem
+
+AMF-TNLAssociationToUpdateItem ::= SEQUENCE {
+ aMF-TNLAssociationAddress CPTransportLayerInformation,
+ tNLAssociationUsage TNLAssociationUsage OPTIONAL,
+ tNLAddressWeightFactor TNLAddressWeightFactor OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {AMF-TNLAssociationToUpdateItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AMF-TNLAssociationToUpdateItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AMF-UE-NGAP-ID ::= INTEGER (0..1099511627775)
+
+AreaOfInterest ::= SEQUENCE {
+ areaOfInterestTAIList AreaOfInterestTAIList OPTIONAL,
+ areaOfInterestCellList AreaOfInterestCellList OPTIONAL,
+ areaOfInterestRANNodeList AreaOfInterestRANNodeList OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {AreaOfInterest-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AreaOfInterest-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AreaOfInterestCellList ::= SEQUENCE (SIZE(1..maxnoofCellinAoI)) OF AreaOfInterestCellItem
+
+AreaOfInterestCellItem ::= SEQUENCE {
+ nGRAN-CGI NGRAN-CGI,
+ iE-Extensions ProtocolExtensionContainer { {AreaOfInterestCellItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AreaOfInterestCellItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AreaOfInterestList ::= SEQUENCE (SIZE(1..maxnoofAoI)) OF AreaOfInterestItem
+
+AreaOfInterestItem ::= SEQUENCE {
+ areaOfInterest AreaOfInterest,
+ locationReportingReferenceID LocationReportingReferenceID,
+ iE-Extensions ProtocolExtensionContainer { {AreaOfInterestItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AreaOfInterestItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AreaOfInterestRANNodeList ::= SEQUENCE (SIZE(1..maxnoofRANNodeinAoI)) OF AreaOfInterestRANNodeItem
+
+AreaOfInterestRANNodeItem ::= SEQUENCE {
+ globalRANNodeID GlobalRANNodeID,
+ iE-Extensions ProtocolExtensionContainer { {AreaOfInterestRANNodeItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AreaOfInterestRANNodeItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AreaOfInterestTAIList ::= SEQUENCE (SIZE(1..maxnoofTAIinAoI)) OF AreaOfInterestTAIItem
+
+AreaOfInterestTAIItem ::= SEQUENCE {
+ tAI TAI,
+ iE-Extensions ProtocolExtensionContainer { {AreaOfInterestTAIItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AreaOfInterestTAIItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AssistanceDataForPaging ::= SEQUENCE {
+ assistanceDataForRecommendedCells AssistanceDataForRecommendedCells OPTIONAL,
+ pagingAttemptInformation PagingAttemptInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {AssistanceDataForPaging-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AssistanceDataForPaging-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AssistanceDataForRecommendedCells ::= SEQUENCE {
+ recommendedCellsForPaging RecommendedCellsForPaging,
+ iE-Extensions ProtocolExtensionContainer { {AssistanceDataForRecommendedCells-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AssistanceDataForRecommendedCells-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AssociatedQosFlowList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF AssociatedQosFlowItem
+
+AssociatedQosFlowItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ qosFlowMappingIndication ENUMERATED {ul, dl, ...} OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {AssociatedQosFlowItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+AssociatedQosFlowItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+AveragingWindow ::= INTEGER (0..4095, ...)
+
+-- B
+
+BitRate ::= INTEGER (0..4000000000000, ...)
+
+BroadcastCancelledAreaList ::= CHOICE {
+ cellIDCancelledEUTRA CellIDCancelledEUTRA,
+ tAICancelledEUTRA TAICancelledEUTRA,
+ emergencyAreaIDCancelledEUTRA EmergencyAreaIDCancelledEUTRA,
+ cellIDCancelledNR CellIDCancelledNR,
+ tAICancelledNR TAICancelledNR,
+ emergencyAreaIDCancelledNR EmergencyAreaIDCancelledNR,
+ choice-Extensions ProtocolIE-SingleContainer { {BroadcastCancelledAreaList-ExtIEs} }
+}
+
+BroadcastCancelledAreaList-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+BroadcastCompletedAreaList ::= CHOICE {
+ cellIDBroadcastEUTRA CellIDBroadcastEUTRA,
+ tAIBroadcastEUTRA TAIBroadcastEUTRA,
+ emergencyAreaIDBroadcastEUTRA EmergencyAreaIDBroadcastEUTRA,
+ cellIDBroadcastNR CellIDBroadcastNR,
+ tAIBroadcastNR TAIBroadcastNR,
+ emergencyAreaIDBroadcastNR EmergencyAreaIDBroadcastNR,
+ choice-Extensions ProtocolIE-SingleContainer { {BroadcastCompletedAreaList-ExtIEs} }
+}
+
+BroadcastCompletedAreaList-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+BroadcastPLMNList ::= SEQUENCE (SIZE(1..maxnoofBPLMNs)) OF BroadcastPLMNItem
+
+BroadcastPLMNItem ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ tAISliceSupportList SliceSupportList,
+ iE-Extensions ProtocolExtensionContainer { {BroadcastPLMNItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+BroadcastPLMNItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- C
+
+CancelAllWarningMessages ::= ENUMERATED {
+ true,
+ ...
+}
+
+CancelledCellsInEAI-EUTRA ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CancelledCellsInEAI-EUTRA-Item
+
+CancelledCellsInEAI-EUTRA-Item ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CancelledCellsInEAI-EUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CancelledCellsInEAI-EUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CancelledCellsInEAI-NR ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CancelledCellsInEAI-NR-Item
+
+CancelledCellsInEAI-NR-Item ::= SEQUENCE {
+ nR-CGI NR-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CancelledCellsInEAI-NR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CancelledCellsInEAI-NR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CancelledCellsInTAI-EUTRA ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CancelledCellsInTAI-EUTRA-Item
+
+CancelledCellsInTAI-EUTRA-Item ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CancelledCellsInTAI-EUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CancelledCellsInTAI-EUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CancelledCellsInTAI-NR ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CancelledCellsInTAI-NR-Item
+
+CancelledCellsInTAI-NR-Item ::= SEQUENCE{
+ nR-CGI NR-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CancelledCellsInTAI-NR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CancelledCellsInTAI-NR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+Cause ::= CHOICE {
+ radioNetwork CauseRadioNetwork,
+ transport CauseTransport,
+ nas CauseNas,
+ protocol CauseProtocol,
+ misc CauseMisc,
+ choice-Extensions ProtocolIE-SingleContainer { {Cause-ExtIEs} }
+}
+
+Cause-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+CauseMisc ::= ENUMERATED {
+ control-processing-overload,
+ not-enough-user-plane-processing-resources,
+ hardware-failure,
+ om-intervention,
+ unknown-PLMN,
+ unspecified,
+ ...
+}
+
+CauseNas ::= ENUMERATED {
+ normal-release,
+ authentication-failure,
+ deregister,
+ unspecified,
+ ...
+}
+
+CauseProtocol ::= ENUMERATED {
+ transfer-syntax-error,
+ abstract-syntax-error-reject,
+ abstract-syntax-error-ignore-and-notify,
+ message-not-compatible-with-receiver-state,
+ semantic-error,
+ abstract-syntax-error-falsely-constructed-message,
+ unspecified,
+ ...
+}
+
+CauseRadioNetwork ::= ENUMERATED {
+ unspecified,
+ txnrelocoverall-expiry,
+ successful-handover,
+ release-due-to-ngran-generated-reason,
+ release-due-to-5gc-generated-reason,
+ handover-cancelled,
+ partial-handover,
+ ho-failure-in-target-5GC-ngran-node-or-target-system,
+ ho-target-not-allowed,
+ tngrelocoverall-expiry,
+ tngrelocprep-expiry,
+ cell-not-available,
+ unknown-targetID,
+ no-radio-resources-available-in-target-cell,
+ unknown-local-UE-NGAP-ID,
+ inconsistent-remote-UE-NGAP-ID,
+ handover-desirable-for-radio-reason,
+ time-critical-handover,
+ resource-optimisation-handover,
+ reduce-load-in-serving-cell,
+ user-inactivity,
+ radio-connection-with-ue-lost,
+ radio-resources-not-available,
+ invalid-qos-combination,
+ failure-in-radio-interface-procedure,
+ interaction-with-other-procedure,
+ unknown-PDU-session-ID,
+ unkown-qos-flow-ID,
+ multiple-PDU-session-ID-instances,
+ multiple-qos-flow-ID-instances,
+ encryption-and-or-integrity-protection-algorithms-not-supported,
+ ng-intra-system-handover-triggered,
+ ng-inter-system-handover-triggered,
+ xn-handover-triggered,
+ not-supported-5QI-value,
+ ue-context-transfer,
+ ims-voice-eps-fallback-or-rat-fallback-triggered,
+ up-integrity-protection-not-possible,
+ up-confidentiality-protection-not-possible,
+ slice-not-supported,
+ ue-in-rrc-inactive-state-not-reachable,
+ redirection,
+ resources-not-available-for-the-slice,
+ ue-max-integrity-protected-data-rate-reason,
+ release-due-to-cn-detected-mobility,
+ ...,
+ n26-interface-not-available,
+ release-due-to-pre-emption,
+ multiple-location-reporting-reference-ID-instances
+}
+
+CauseTransport ::= ENUMERATED {
+ transport-resource-unavailable,
+ unspecified,
+ ...
+}
+
+CellIDBroadcastEUTRA ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF CellIDBroadcastEUTRA-Item
+
+CellIDBroadcastEUTRA-Item ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CellIDBroadcastEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CellIDBroadcastEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CellIDBroadcastNR ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF CellIDBroadcastNR-Item
+
+CellIDBroadcastNR-Item ::= SEQUENCE {
+ nR-CGI NR-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CellIDBroadcastNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CellIDBroadcastNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CellIDCancelledEUTRA ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF CellIDCancelledEUTRA-Item
+
+CellIDCancelledEUTRA-Item ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CellIDCancelledEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CellIDCancelledEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CellIDCancelledNR ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF CellIDCancelledNR-Item
+
+CellIDCancelledNR-Item ::= SEQUENCE {
+ nR-CGI NR-CGI,
+ numberOfBroadcasts NumberOfBroadcasts,
+ iE-Extensions ProtocolExtensionContainer { {CellIDCancelledNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CellIDCancelledNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CellIDListForRestart ::= CHOICE {
+ eUTRA-CGIListforRestart EUTRA-CGIList,
+ nR-CGIListforRestart NR-CGIList,
+ choice-Extensions ProtocolIE-SingleContainer { {CellIDListForRestart-ExtIEs} }
+}
+
+CellIDListForRestart-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+CellSize ::= ENUMERATED {verysmall, small, medium, large, ...}
+
+
+CellType ::= SEQUENCE {
+ cellSize CellSize,
+ iE-Extensions ProtocolExtensionContainer { {CellType-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CellType-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CNAssistedRANTuning ::= SEQUENCE {
+ expectedUEBehaviour ExpectedUEBehaviour OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {CNAssistedRANTuning-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CNAssistedRANTuning-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CNTypeRestrictionsForEquivalent ::= SEQUENCE (SIZE(1..maxnoofEPLMNs)) OF CNTypeRestrictionsForEquivalentItem
+
+CNTypeRestrictionsForEquivalentItem ::= SEQUENCE {
+ plmnIdentity PLMNIdentity,
+ cn-Type ENUMERATED {epc-forbidden, fiveGC-forbidden, ...},
+ iE-Extensions ProtocolExtensionContainer { {CNTypeRestrictionsForEquivalentItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CNTypeRestrictionsForEquivalentItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::={
+ ...
+}
+
+CNTypeRestrictionsForServing ::= ENUMERATED {
+ epc-forbidden,
+ ...
+}
+
+CommonNetworkInstance ::= OCTET STRING
+
+CompletedCellsInEAI-EUTRA ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CompletedCellsInEAI-EUTRA-Item
+
+CompletedCellsInEAI-EUTRA-Item ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CompletedCellsInEAI-EUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CompletedCellsInEAI-EUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CompletedCellsInEAI-NR ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CompletedCellsInEAI-NR-Item
+
+CompletedCellsInEAI-NR-Item ::= SEQUENCE {
+ nR-CGI NR-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CompletedCellsInEAI-NR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CompletedCellsInEAI-NR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CompletedCellsInTAI-EUTRA ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CompletedCellsInTAI-EUTRA-Item
+
+CompletedCellsInTAI-EUTRA-Item ::= SEQUENCE{
+ eUTRA-CGI EUTRA-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CompletedCellsInTAI-EUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CompletedCellsInTAI-EUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CompletedCellsInTAI-NR ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CompletedCellsInTAI-NR-Item
+
+CompletedCellsInTAI-NR-Item ::= SEQUENCE{
+ nR-CGI NR-CGI,
+ iE-Extensions ProtocolExtensionContainer { {CompletedCellsInTAI-NR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CompletedCellsInTAI-NR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ConcurrentWarningMessageInd ::= ENUMERATED {
+ true,
+ ...
+}
+
+ConfidentialityProtectionIndication ::= ENUMERATED {
+ required,
+ preferred,
+ not-needed,
+ ...
+}
+
+ConfidentialityProtectionResult ::= ENUMERATED {
+ performed,
+ not-performed,
+ ...
+}
+
+CoreNetworkAssistanceInformationForInactive ::= SEQUENCE {
+ uEIdentityIndexValue UEIdentityIndexValue,
+ uESpecificDRX PagingDRX OPTIONAL,
+ periodicRegistrationUpdateTimer PeriodicRegistrationUpdateTimer,
+ mICOModeIndication MICOModeIndication OPTIONAL,
+ tAIListForInactive TAIListForInactive,
+ expectedUEBehaviour ExpectedUEBehaviour OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {CoreNetworkAssistanceInformationForInactive-ExtIEs} } OPTIONAL,
+ ...
+}
+
+CoreNetworkAssistanceInformationForInactive-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+COUNTValueForPDCP-SN12 ::= SEQUENCE {
+ pDCP-SN12 INTEGER (0..4095),
+ hFN-PDCP-SN12 INTEGER (0..1048575),
+ iE-Extensions ProtocolExtensionContainer { {COUNTValueForPDCP-SN12-ExtIEs} } OPTIONAL,
+ ...
+}
+
+COUNTValueForPDCP-SN12-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+COUNTValueForPDCP-SN18 ::= SEQUENCE {
+ pDCP-SN18 INTEGER (0..262143),
+ hFN-PDCP-SN18 INTEGER (0..16383),
+ iE-Extensions ProtocolExtensionContainer { {COUNTValueForPDCP-SN18-ExtIEs} } OPTIONAL,
+ ...
+}
+
+COUNTValueForPDCP-SN18-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CPTransportLayerInformation ::= CHOICE {
+ endpointIPAddress TransportLayerAddress,
+ choice-Extensions ProtocolIE-SingleContainer { {CPTransportLayerInformation-ExtIEs} }
+}
+
+CPTransportLayerInformation-ExtIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-EndpointIPAddressAndPort CRITICALITY reject TYPE EndpointIPAddressAndPort PRESENCE mandatory},
+ ...
+}
+
+CriticalityDiagnostics ::= SEQUENCE {
+ procedureCode ProcedureCode OPTIONAL,
+ triggeringMessage TriggeringMessage OPTIONAL,
+ procedureCriticality Criticality OPTIONAL,
+ iEsCriticalityDiagnostics CriticalityDiagnostics-IE-List OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer {{CriticalityDiagnostics-ExtIEs}} OPTIONAL,
+ ...
+}
+
+CriticalityDiagnostics-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE(1..maxnoofErrors)) OF CriticalityDiagnostics-IE-Item
+
+CriticalityDiagnostics-IE-Item ::= SEQUENCE {
+ iECriticality Criticality,
+ iE-ID ProtocolIE-ID,
+ typeOfError TypeOfError,
+ iE-Extensions ProtocolExtensionContainer {{CriticalityDiagnostics-IE-Item-ExtIEs}} OPTIONAL,
+ ...
+}
+
+CriticalityDiagnostics-IE-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- D
+
+DataCodingScheme ::= BIT STRING (SIZE(8))
+
+DataForwardingAccepted ::= ENUMERATED {
+ data-forwarding-accepted,
+ ...
+}
+
+DataForwardingNotPossible ::= ENUMERATED {
+ data-forwarding-not-possible,
+ ...
+}
+
+DataForwardingResponseDRBList ::= SEQUENCE (SIZE(1..maxnoofDRBs)) OF DataForwardingResponseDRBItem
+
+DataForwardingResponseDRBItem ::= SEQUENCE {
+ dRB-ID DRB-ID,
+ dLForwardingUP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ uLForwardingUP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer {{DataForwardingResponseDRBItem-ExtIEs}} OPTIONAL,
+ ...
+}
+
+DataForwardingResponseDRBItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+DelayCritical ::= ENUMERATED {
+ delay-critical,
+ non-delay-critical,
+ ...
+}
+
+DLForwarding ::= ENUMERATED {
+ dl-forwarding-proposed,
+ ...
+}
+
+DL-NGU-TNLInformationReused ::= ENUMERATED {
+ true,
+ ...
+}
+
+DirectForwardingPathAvailability ::= ENUMERATED {
+ direct-path-available,
+ ...
+}
+
+DRB-ID ::= INTEGER (1..32, ...)
+
+DRBsSubjectToStatusTransferList ::= SEQUENCE (SIZE(1..maxnoofDRBs)) OF DRBsSubjectToStatusTransferItem
+
+DRBsSubjectToStatusTransferItem ::= SEQUENCE {
+ dRB-ID DRB-ID,
+ dRBStatusUL DRBStatusUL,
+ dRBStatusDL DRBStatusDL,
+ iE-Extension ProtocolExtensionContainer { {DRBsSubjectToStatusTransferItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBsSubjectToStatusTransferItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-OldAssociatedQosFlowList-ULendmarkerexpected CRITICALITY reject EXTENSION AssociatedQosFlowList PRESENCE optional },
+ ...
+}
+
+DRBStatusDL ::= CHOICE {
+ dRBStatusDL12 DRBStatusDL12,
+ dRBStatusDL18 DRBStatusDL18,
+ choice-Extensions ProtocolIE-SingleContainer { {DRBStatusDL-ExtIEs} }
+}
+
+DRBStatusDL-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+DRBStatusDL12 ::= SEQUENCE {
+ dL-COUNTValue COUNTValueForPDCP-SN12,
+ iE-Extension ProtocolExtensionContainer { {DRBStatusDL12-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBStatusDL12-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+DRBStatusDL18 ::= SEQUENCE {
+ dL-COUNTValue COUNTValueForPDCP-SN18,
+ iE-Extension ProtocolExtensionContainer { {DRBStatusDL18-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBStatusDL18-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+DRBStatusUL ::= CHOICE {
+ dRBStatusUL12 DRBStatusUL12,
+ dRBStatusUL18 DRBStatusUL18,
+ choice-Extensions ProtocolIE-SingleContainer { {DRBStatusUL-ExtIEs} }
+}
+
+DRBStatusUL-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+DRBStatusUL12 ::= SEQUENCE {
+ uL-COUNTValue COUNTValueForPDCP-SN12,
+ receiveStatusOfUL-PDCP-SDUs BIT STRING (SIZE(1..2048)) OPTIONAL,
+ iE-Extension ProtocolExtensionContainer { {DRBStatusUL12-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBStatusUL12-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+DRBStatusUL18 ::= SEQUENCE {
+ uL-COUNTValue COUNTValueForPDCP-SN18,
+ receiveStatusOfUL-PDCP-SDUs BIT STRING (SIZE(1..131072)) OPTIONAL,
+ iE-Extension ProtocolExtensionContainer { {DRBStatusUL18-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBStatusUL18-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+DRBsToQosFlowsMappingList ::= SEQUENCE (SIZE(1..maxnoofDRBs)) OF DRBsToQosFlowsMappingItem
+
+DRBsToQosFlowsMappingItem ::= SEQUENCE {
+ dRB-ID DRB-ID,
+ associatedQosFlowList AssociatedQosFlowList,
+ iE-Extensions ProtocolExtensionContainer { {DRBsToQosFlowsMappingItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+DRBsToQosFlowsMappingItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+Dynamic5QIDescriptor ::= SEQUENCE {
+ priorityLevelQos PriorityLevelQos,
+ packetDelayBudget PacketDelayBudget,
+ packetErrorRate PacketErrorRate,
+ fiveQI FiveQI OPTIONAL,
+ delayCritical DelayCritical OPTIONAL,
+-- The above IE shall be present in case of GBR QoS flow
+ averagingWindow AveragingWindow OPTIONAL,
+-- The above IE shall be present in case of GBR QoS flow
+ maximumDataBurstVolume MaximumDataBurstVolume OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {Dynamic5QIDescriptor-ExtIEs} } OPTIONAL,
+ ...
+}
+
+Dynamic5QIDescriptor-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- E
+
+EmergencyAreaID ::= OCTET STRING (SIZE(3))
+
+EmergencyAreaIDBroadcastEUTRA ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaIDBroadcastEUTRA-Item
+
+EmergencyAreaIDBroadcastEUTRA-Item ::= SEQUENCE {
+ emergencyAreaID EmergencyAreaID,
+ completedCellsInEAI-EUTRA CompletedCellsInEAI-EUTRA,
+ iE-Extensions ProtocolExtensionContainer { {EmergencyAreaIDBroadcastEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EmergencyAreaIDBroadcastEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EmergencyAreaIDBroadcastNR ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaIDBroadcastNR-Item
+
+EmergencyAreaIDBroadcastNR-Item ::= SEQUENCE {
+ emergencyAreaID EmergencyAreaID,
+ completedCellsInEAI-NR CompletedCellsInEAI-NR,
+ iE-Extensions ProtocolExtensionContainer { {EmergencyAreaIDBroadcastNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EmergencyAreaIDBroadcastNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EmergencyAreaIDCancelledEUTRA ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaIDCancelledEUTRA-Item
+
+EmergencyAreaIDCancelledEUTRA-Item ::= SEQUENCE {
+ emergencyAreaID EmergencyAreaID,
+ cancelledCellsInEAI-EUTRA CancelledCellsInEAI-EUTRA,
+ iE-Extensions ProtocolExtensionContainer { {EmergencyAreaIDCancelledEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EmergencyAreaIDCancelledEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EmergencyAreaIDCancelledNR ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaIDCancelledNR-Item
+
+EmergencyAreaIDCancelledNR-Item ::= SEQUENCE {
+ emergencyAreaID EmergencyAreaID,
+ cancelledCellsInEAI-NR CancelledCellsInEAI-NR,
+ iE-Extensions ProtocolExtensionContainer { {EmergencyAreaIDCancelledNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EmergencyAreaIDCancelledNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EmergencyAreaIDList ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID
+
+EmergencyAreaIDListForRestart ::= SEQUENCE (SIZE(1..maxnoofEAIforRestart)) OF EmergencyAreaID
+
+EmergencyFallbackIndicator ::= SEQUENCE {
+ emergencyFallbackRequestIndicator EmergencyFallbackRequestIndicator,
+ emergencyServiceTargetCN EmergencyServiceTargetCN OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {EmergencyFallbackIndicator-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EmergencyFallbackIndicator-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EmergencyFallbackRequestIndicator ::= ENUMERATED {
+ emergency-fallback-requested,
+ ...
+}
+
+EmergencyServiceTargetCN ::= ENUMERATED {
+ fiveGC,
+ epc,
+ ...
+}
+
+EN-DCSONConfigurationTransfer ::= OCTET STRING
+
+EndpointIPAddressAndPort ::=SEQUENCE {
+ endpointIPAddress TransportLayerAddress,
+ portNumber PortNumber,
+ iE-Extensions ProtocolExtensionContainer { { EndpointIPAddressAndPort-ExtIEs} } OPTIONAL
+}
+
+EndpointIPAddressAndPort-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EquivalentPLMNs ::= SEQUENCE (SIZE(1..maxnoofEPLMNs)) OF PLMNIdentity
+
+EPS-TAC ::= OCTET STRING (SIZE(2))
+
+EPS-TAI ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ ePS-TAC EPS-TAC,
+ iE-Extensions ProtocolExtensionContainer { {EPS-TAI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EPS-TAI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+E-RAB-ID ::= INTEGER (0..15, ...)
+
+E-RABInformationList ::= SEQUENCE (SIZE(1..maxnoofE-RABs)) OF E-RABInformationItem
+
+E-RABInformationItem ::= SEQUENCE {
+ e-RAB-ID E-RAB-ID,
+ dLForwarding DLForwarding OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {E-RABInformationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+E-RABInformationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EUTRACellIdentity ::= BIT STRING (SIZE(28))
+
+EUTRA-CGI ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ eUTRACellIdentity EUTRACellIdentity,
+ iE-Extensions ProtocolExtensionContainer { {EUTRA-CGI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+EUTRA-CGI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+EUTRA-CGIList ::= SEQUENCE (SIZE(1..maxnoofCellsinngeNB)) OF EUTRA-CGI
+
+EUTRA-CGIListForWarning ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF EUTRA-CGI
+
+EUTRAencryptionAlgorithms ::= BIT STRING (SIZE(16, ...))
+
+EUTRAintegrityProtectionAlgorithms ::= BIT STRING (SIZE(16, ...))
+
+EventType ::= ENUMERATED {
+ direct,
+ change-of-serve-cell,
+ ue-presence-in-area-of-interest,
+ stop-change-of-serve-cell,
+ stop-ue-presence-in-area-of-interest,
+ cancel-location-reporting-for-the-ue,
+ ...
+}
+
+ExpectedActivityPeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181, ...)
+
+ExpectedHOInterval ::= ENUMERATED {
+ sec15, sec30, sec60, sec90, sec120, sec180, long-time,
+ ...
+}
+
+ExpectedIdlePeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181, ...)
+
+ExpectedUEActivityBehaviour ::= SEQUENCE {
+ expectedActivityPeriod ExpectedActivityPeriod OPTIONAL,
+ expectedIdlePeriod ExpectedIdlePeriod OPTIONAL,
+ sourceOfUEActivityBehaviourInformation SourceOfUEActivityBehaviourInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {ExpectedUEActivityBehaviour-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ExpectedUEActivityBehaviour-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ExpectedUEBehaviour ::= SEQUENCE {
+ expectedUEActivityBehaviour ExpectedUEActivityBehaviour OPTIONAL,
+ expectedHOInterval ExpectedHOInterval OPTIONAL,
+ expectedUEMobility ExpectedUEMobility OPTIONAL,
+ expectedUEMovingTrajectory ExpectedUEMovingTrajectory OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {ExpectedUEBehaviour-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ExpectedUEBehaviour-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ExpectedUEMobility ::= ENUMERATED {
+ stationary,
+ mobile,
+ ...
+}
+
+ExpectedUEMovingTrajectory ::= SEQUENCE (SIZE(1..maxnoofCellsUEMovingTrajectory)) OF ExpectedUEMovingTrajectoryItem
+
+ExpectedUEMovingTrajectoryItem ::= SEQUENCE {
+ nGRAN-CGI NGRAN-CGI,
+ timeStayedInCell INTEGER (0..4095) OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {ExpectedUEMovingTrajectoryItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ExpectedUEMovingTrajectoryItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- F
+
+FiveG-S-TMSI ::= SEQUENCE {
+ aMFSetID AMFSetID,
+ aMFPointer AMFPointer,
+ fiveG-TMSI FiveG-TMSI,
+ iE-Extensions ProtocolExtensionContainer { {FiveG-S-TMSI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+FiveG-S-TMSI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+FiveG-TMSI ::= OCTET STRING (SIZE(4))
+
+FiveQI ::= INTEGER (0..255, ...)
+
+ForbiddenAreaInformation ::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF ForbiddenAreaInformation-Item
+
+ForbiddenAreaInformation-Item ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ forbiddenTACs ForbiddenTACs,
+ iE-Extensions ProtocolExtensionContainer { {ForbiddenAreaInformation-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ForbiddenAreaInformation-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ForbiddenTACs ::= SEQUENCE (SIZE(1..maxnoofForbTACs)) OF TAC
+
+-- G
+
+GBR-QosInformation ::= SEQUENCE {
+ maximumFlowBitRateDL BitRate,
+ maximumFlowBitRateUL BitRate,
+ guaranteedFlowBitRateDL BitRate,
+ guaranteedFlowBitRateUL BitRate,
+ notificationControl NotificationControl OPTIONAL,
+ maximumPacketLossRateDL PacketLossRate OPTIONAL,
+ maximumPacketLossRateUL PacketLossRate OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {GBR-QosInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GBR-QosInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...}
+
+GlobalGNB-ID ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ gNB-ID GNB-ID,
+ iE-Extensions ProtocolExtensionContainer { {GlobalGNB-ID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GlobalGNB-ID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+GlobalN3IWF-ID ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ n3IWF-ID N3IWF-ID,
+ iE-Extensions ProtocolExtensionContainer { {GlobalN3IWF-ID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GlobalN3IWF-ID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+GlobalNgENB-ID ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ ngENB-ID NgENB-ID,
+ iE-Extensions ProtocolExtensionContainer { {GlobalNgENB-ID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GlobalNgENB-ID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+GlobalRANNodeID ::= CHOICE {
+ globalGNB-ID GlobalGNB-ID,
+ globalNgENB-ID GlobalNgENB-ID,
+ globalN3IWF-ID GlobalN3IWF-ID,
+ choice-Extensions ProtocolIE-SingleContainer { {GlobalRANNodeID-ExtIEs} }
+}
+
+GlobalRANNodeID-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+GNB-ID ::= CHOICE {
+ gNB-ID BIT STRING (SIZE(22..32)),
+ choice-Extensions ProtocolIE-SingleContainer { {GNB-ID-ExtIEs} }
+}
+
+GNB-ID-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+GTP-TEID ::= OCTET STRING (SIZE(4))
+
+GTPTunnel ::= SEQUENCE {
+ transportLayerAddress TransportLayerAddress,
+ gTP-TEID GTP-TEID,
+ iE-Extensions ProtocolExtensionContainer { {GTPTunnel-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GTPTunnel-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+GUAMI ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ aMFRegionID AMFRegionID,
+ aMFSetID AMFSetID,
+ aMFPointer AMFPointer,
+ iE-Extensions ProtocolExtensionContainer { {GUAMI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+GUAMI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+
+-- H
+
+HandoverCommandTransfer ::= SEQUENCE {
+ dLForwardingUP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ qosFlowToBeForwardedList QosFlowToBeForwardedList OPTIONAL,
+ dataForwardingResponseDRBList DataForwardingResponseDRBList OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {HandoverCommandTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+HandoverCommandTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-AdditionalDLForwardingUPTNLInformation CRITICALITY ignore EXTENSION QosFlowPerTNLInformationList PRESENCE optional}|
+ { ID id-ULForwardingUP-TNLInformation CRITICALITY reject EXTENSION UPTransportLayerInformation PRESENCE optional}|
+ { ID id-AdditionalULForwardingUPTNLInformation CRITICALITY reject EXTENSION UPTransportLayerInformationList PRESENCE optional},
+ ...
+}
+
+HandoverFlag ::= ENUMERATED {
+ handover-preparation,
+ ...
+}
+
+HandoverPreparationUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {HandoverPreparationUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+HandoverPreparationUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+HandoverRequestAcknowledgeTransfer ::= SEQUENCE {
+ dL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ dLForwardingUP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ securityResult SecurityResult OPTIONAL,
+ qosFlowSetupResponseList QosFlowListWithDataForwarding,
+ qosFlowFailedToSetupList QosFlowListWithCause OPTIONAL,
+ dataForwardingResponseDRBList DataForwardingResponseDRBList OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {HandoverRequestAcknowledgeTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+HandoverRequestAcknowledgeTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-AdditionalDLUPTNLInformationForHOList CRITICALITY ignore EXTENSION AdditionalDLUPTNLInformationForHOList PRESENCE optional }|
+ { ID id-ULForwardingUP-TNLInformation CRITICALITY reject EXTENSION UPTransportLayerInformation PRESENCE optional}|
+ { ID id-AdditionalULForwardingUPTNLInformation CRITICALITY reject EXTENSION UPTransportLayerInformationList PRESENCE optional},
+ ...
+}
+
+HandoverRequiredTransfer ::= SEQUENCE {
+ directForwardingPathAvailability DirectForwardingPathAvailability OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {HandoverRequiredTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+HandoverRequiredTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+HandoverResourceAllocationUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ criticalityDiagnostics CriticalityDiagnostics OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {HandoverResourceAllocationUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+HandoverResourceAllocationUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+HandoverType ::= ENUMERATED {
+ intra5gs,
+ fivegs-to-eps,
+ eps-to-5gs,
+ ...
+}
+
+-- I
+
+IMSVoiceSupportIndicator ::= ENUMERATED {
+ supported,
+ not-supported,
+ ...
+}
+
+IndexToRFSP ::= INTEGER (1..256, ...)
+
+InfoOnRecommendedCellsAndRANNodesForPaging ::= SEQUENCE {
+ recommendedCellsForPaging RecommendedCellsForPaging,
+ recommendRANNodesForPaging RecommendedRANNodesForPaging,
+ iE-Extensions ProtocolExtensionContainer { {InfoOnRecommendedCellsAndRANNodesForPaging-ExtIEs} } OPTIONAL,
+ ...
+}
+
+InfoOnRecommendedCellsAndRANNodesForPaging-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+
+IntegrityProtectionIndication ::= ENUMERATED {
+ required,
+ preferred,
+ not-needed,
+ ...
+}
+
+IntegrityProtectionResult ::= ENUMERATED {
+ performed,
+ not-performed,
+ ...
+}
+
+IntendedNumberOfPagingAttempts ::= INTEGER (1..16, ...)
+
+InterfacesToTrace ::= BIT STRING (SIZE(8))
+
+-- J
+-- K
+-- L
+
+LastVisitedCellInformation ::= CHOICE {
+ nGRANCell LastVisitedNGRANCellInformation,
+ eUTRANCell LastVisitedEUTRANCellInformation,
+ uTRANCell LastVisitedUTRANCellInformation,
+ gERANCell LastVisitedGERANCellInformation,
+ choice-Extensions ProtocolIE-SingleContainer { {LastVisitedCellInformation-ExtIEs} }
+}
+
+LastVisitedCellInformation-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+LastVisitedCellItem ::= SEQUENCE {
+ lastVisitedCellInformation LastVisitedCellInformation,
+ iE-Extensions ProtocolExtensionContainer { {LastVisitedCellItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+LastVisitedCellItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+LastVisitedEUTRANCellInformation ::= OCTET STRING
+
+LastVisitedGERANCellInformation ::= OCTET STRING
+
+LastVisitedNGRANCellInformation::= SEQUENCE {
+ globalCellID NGRAN-CGI,
+ cellType CellType,
+ timeUEStayedInCell TimeUEStayedInCell,
+ timeUEStayedInCellEnhancedGranularity TimeUEStayedInCellEnhancedGranularity OPTIONAL,
+ hOCauseValue Cause OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {LastVisitedNGRANCellInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+LastVisitedNGRANCellInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+LastVisitedUTRANCellInformation ::= OCTET STRING
+
+LocationReportingAdditionalInfo ::= ENUMERATED {
+ includePSCell,
+ ...
+}
+
+LocationReportingReferenceID ::= INTEGER (1..64, ...)
+
+LocationReportingRequestType ::= SEQUENCE {
+ eventType EventType,
+ reportArea ReportArea,
+ areaOfInterestList AreaOfInterestList OPTIONAL,
+ locationReportingReferenceIDToBeCancelled LocationReportingReferenceID OPTIONAL,
+-- The above IE shall be present if the event type is set to ¡°stop reporting UE presence in the area of interest¡±
+ iE-Extensions ProtocolExtensionContainer { {LocationReportingRequestType-ExtIEs} } OPTIONAL,
+ ...
+}
+
+LocationReportingRequestType-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-LocationReportingAdditionalInfo CRITICALITY ignore EXTENSION LocationReportingAdditionalInfo PRESENCE optional },
+ ...
+}
+
+-- M
+
+MaskedIMEISV ::= BIT STRING (SIZE(64))
+
+MaximumDataBurstVolume ::= INTEGER (0..4095, ...)
+
+MessageIdentifier ::= BIT STRING (SIZE(16))
+
+MaximumIntegrityProtectedDataRate ::= ENUMERATED {
+ bitrate64kbs,
+ maximum-UE-rate,
+ ...
+}
+
+MICOModeIndication ::= ENUMERATED {
+ true,
+ ...
+}
+
+MobilityRestrictionList ::= SEQUENCE {
+ servingPLMN PLMNIdentity,
+ equivalentPLMNs EquivalentPLMNs OPTIONAL,
+ rATRestrictions RATRestrictions OPTIONAL,
+ forbiddenAreaInformation ForbiddenAreaInformation OPTIONAL,
+ serviceAreaInformation ServiceAreaInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {MobilityRestrictionList-ExtIEs} } OPTIONAL,
+ ...
+}
+
+MobilityRestrictionList-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-LastEUTRAN-PLMNIdentity CRITICALITY ignore EXTENSION PLMNIdentity PRESENCE optional }|
+ { ID id-CNTypeRestrictionsForServing CRITICALITY ignore EXTENSION CNTypeRestrictionsForServing PRESENCE optional}|
+ { ID id-CNTypeRestrictionsForEquivalent CRITICALITY ignore EXTENSION CNTypeRestrictionsForEquivalent PRESENCE optional},
+ ...
+}
+
+
+-- N
+
+N3IWF-ID ::= CHOICE {
+ n3IWF-ID BIT STRING (SIZE(16)),
+ choice-Extensions ProtocolIE-SingleContainer { {N3IWF-ID-ExtIEs} }
+}
+
+N3IWF-ID-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+NAS-PDU ::= OCTET STRING
+
+NASSecurityParametersFromNGRAN ::= OCTET STRING
+
+NetworkInstance ::= INTEGER (1..256, ...)
+
+NewSecurityContextInd ::= ENUMERATED {
+ true,
+ ...
+}
+
+NextHopChainingCount ::= INTEGER (0..7)
+
+NextPagingAreaScope ::= ENUMERATED {
+ same,
+ changed,
+ ...
+}
+
+NgENB-ID ::= CHOICE {
+ macroNgENB-ID BIT STRING (SIZE(20)),
+ shortMacroNgENB-ID BIT STRING (SIZE(18)),
+ longMacroNgENB-ID BIT STRING (SIZE(21)),
+ choice-Extensions ProtocolIE-SingleContainer { {NgENB-ID-ExtIEs} }
+}
+
+NgENB-ID-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+NGRAN-CGI ::= CHOICE {
+ nR-CGI NR-CGI,
+ eUTRA-CGI EUTRA-CGI,
+ choice-Extensions ProtocolIE-SingleContainer { {NGRAN-CGI-ExtIEs} }
+}
+
+NGRAN-CGI-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+NGRAN-TNLAssociationToRemoveList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF NGRAN-TNLAssociationToRemoveItem
+
+NGRAN-TNLAssociationToRemoveItem::= SEQUENCE {
+ tNLAssociationTransportLayerAddress CPTransportLayerInformation,
+ tNLAssociationTransportLayerAddressAMF CPTransportLayerInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { { NGRAN-TNLAssociationToRemoveItem-ExtIEs} } OPTIONAL
+}
+
+NGRAN-TNLAssociationToRemoveItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+NGRANTraceID ::= OCTET STRING (SIZE(8))
+
+NonDynamic5QIDescriptor ::= SEQUENCE {
+ fiveQI FiveQI,
+ priorityLevelQos PriorityLevelQos OPTIONAL,
+ averagingWindow AveragingWindow OPTIONAL,
+ maximumDataBurstVolume MaximumDataBurstVolume OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {NonDynamic5QIDescriptor-ExtIEs} } OPTIONAL,
+ ...
+}
+
+NonDynamic5QIDescriptor-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+NotAllowedTACs ::= SEQUENCE (SIZE(1..maxnoofAllowedAreas)) OF TAC
+
+NotificationCause ::= ENUMERATED {
+ fulfilled,
+ not-fulfilled,
+ ...
+}
+
+NotificationControl ::= ENUMERATED {
+ notification-requested,
+ ...
+}
+
+NRCellIdentity ::= BIT STRING (SIZE(36))
+
+NR-CGI ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ nRCellIdentity NRCellIdentity,
+ iE-Extensions ProtocolExtensionContainer { {NR-CGI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+NR-CGI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+NR-CGIList ::= SEQUENCE (SIZE(1..maxnoofCellsingNB)) OF NR-CGI
+
+NR-CGIListForWarning ::= SEQUENCE (SIZE(1..maxnoofCellIDforWarning)) OF NR-CGI
+
+NRencryptionAlgorithms ::= BIT STRING (SIZE(16, ...))
+
+NRintegrityProtectionAlgorithms ::= BIT STRING (SIZE(16, ...))
+
+NRPPa-PDU ::= OCTET STRING
+
+NumberOfBroadcasts ::= INTEGER (0..65535)
+
+NumberOfBroadcastsRequested ::= INTEGER (0..65535)
+
+-- O
+
+OverloadAction ::= ENUMERATED {
+ reject-non-emergency-mo-dt,
+ reject-rrc-cr-signalling,
+ permit-emergency-sessions-and-mobile-terminated-services-only,
+ permit-high-priority-sessions-and-mobile-terminated-services-only,
+ ...
+}
+
+OverloadResponse ::= CHOICE {
+ overloadAction OverloadAction,
+ choice-Extensions ProtocolIE-SingleContainer { {OverloadResponse-ExtIEs} }
+}
+
+OverloadResponse-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+OverloadStartNSSAIList ::= SEQUENCE (SIZE (1..maxnoofSliceItems)) OF OverloadStartNSSAIItem
+
+OverloadStartNSSAIItem ::= SEQUENCE {
+ sliceOverloadList SliceOverloadList,
+ sliceOverloadResponse OverloadResponse OPTIONAL,
+ sliceTrafficLoadReductionIndication TrafficLoadReductionIndication OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {OverloadStartNSSAIItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+OverloadStartNSSAIItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- P
+
+PacketDelayBudget ::= INTEGER (0..1023, ...)
+
+PacketErrorRate ::= SEQUENCE {
+ pERScalar INTEGER (0..9, ...),
+ pERExponent INTEGER (0..9, ...),
+ iE-Extensions ProtocolExtensionContainer { {PacketErrorRate-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PacketErrorRate-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PacketLossRate ::= INTEGER (0..1000, ...)
+
+PagingAttemptInformation ::= SEQUENCE {
+ pagingAttemptCount PagingAttemptCount,
+ intendedNumberOfPagingAttempts IntendedNumberOfPagingAttempts,
+ nextPagingAreaScope NextPagingAreaScope OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PagingAttemptInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PagingAttemptInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PagingAttemptCount ::= INTEGER (1..16, ...)
+
+PagingDRX ::= ENUMERATED {
+ v32,
+ v64,
+ v128,
+ v256,
+ ...
+}
+
+PagingOrigin ::= ENUMERATED {
+ non-3gpp,
+ ...
+}
+
+PagingPriority ::= ENUMERATED {
+ priolevel1,
+ priolevel2,
+ priolevel3,
+ priolevel4,
+ priolevel5,
+ priolevel6,
+ priolevel7,
+ priolevel8,
+ ...
+}
+
+PathSwitchRequestAcknowledgeTransfer ::= SEQUENCE {
+ uL-NGU-UP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ securityIndication SecurityIndication OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PathSwitchRequestAcknowledgeTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PathSwitchRequestAcknowledgeTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-AdditionalNGU-UP-TNLInformation CRITICALITY ignore EXTENSION UPTransportLayerInformationPairList PRESENCE optional },
+ ...
+}
+
+PathSwitchRequestSetupFailedTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {PathSwitchRequestSetupFailedTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PathSwitchRequestSetupFailedTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PathSwitchRequestTransfer ::= SEQUENCE {
+ dL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ dL-NGU-TNLInformationReused DL-NGU-TNLInformationReused OPTIONAL,
+ userPlaneSecurityInformation UserPlaneSecurityInformation OPTIONAL,
+ qosFlowAcceptedList QosFlowAcceptedList,
+ iE-Extensions ProtocolExtensionContainer { {PathSwitchRequestTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PathSwitchRequestTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-AdditionalDLQosFlowPerTNLInformation CRITICALITY ignore EXTENSION QosFlowPerTNLInformationList PRESENCE optional },
+ ...
+}
+
+PathSwitchRequestUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {PathSwitchRequestUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PathSwitchRequestUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionAggregateMaximumBitRate ::= SEQUENCE {
+ pDUSessionAggregateMaximumBitRateDL BitRate,
+ pDUSessionAggregateMaximumBitRateUL BitRate,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionAggregateMaximumBitRate-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionAggregateMaximumBitRate-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionID ::= INTEGER (0..255)
+
+PDUSessionResourceAdmittedList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceAdmittedItem
+
+PDUSessionResourceAdmittedItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ handoverRequestAcknowledgeTransfer OCTET STRING (CONTAINING HandoverRequestAcknowledgeTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceAdmittedItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceAdmittedItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToModifyListModCfm ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToModifyItemModCfm
+
+PDUSessionResourceFailedToModifyItemModCfm ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceModifyIndicationUnsuccessfulTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyIndicationUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToModifyItemModCfm-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToModifyItemModCfm-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToModifyListModRes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToModifyItemModRes
+
+PDUSessionResourceFailedToModifyItemModRes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceModifyUnsuccessfulTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToModifyItemModRes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToModifyItemModRes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToSetupListCxtFail ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToSetupItemCxtFail
+
+PDUSessionResourceFailedToSetupItemCxtFail ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceSetupUnsuccessfulTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToSetupItemCxtFail-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToSetupItemCxtFail-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToSetupListCxtRes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToSetupItemCxtRes
+
+PDUSessionResourceFailedToSetupItemCxtRes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceSetupUnsuccessfulTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToSetupItemCxtRes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToSetupItemCxtRes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToSetupListHOAck ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToSetupItemHOAck
+
+PDUSessionResourceFailedToSetupItemHOAck ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ handoverResourceAllocationUnsuccessfulTransfer OCTET STRING (CONTAINING HandoverResourceAllocationUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToSetupItemHOAck-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToSetupItemHOAck-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToSetupListPSReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToSetupItemPSReq
+
+PDUSessionResourceFailedToSetupItemPSReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pathSwitchRequestSetupFailedTransfer OCTET STRING (CONTAINING PathSwitchRequestSetupFailedTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToSetupItemPSReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToSetupItemPSReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceFailedToSetupListSURes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceFailedToSetupItemSURes
+
+PDUSessionResourceFailedToSetupItemSURes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceSetupUnsuccessfulTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceFailedToSetupItemSURes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceFailedToSetupItemSURes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceHandoverList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceHandoverItem
+
+PDUSessionResourceHandoverItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ handoverCommandTransfer OCTET STRING (CONTAINING HandoverCommandTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceHandoverItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceHandoverItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceInformationList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceInformationItem
+
+PDUSessionResourceInformationItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ qosFlowInformationList QosFlowInformationList,
+ dRBsToQosFlowsMappingList DRBsToQosFlowsMappingList OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceInformationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceInformationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceListCxtRelCpl ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceItemCxtRelCpl
+
+PDUSessionResourceItemCxtRelCpl ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceItemCxtRelCpl-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceItemCxtRelCpl-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-PDUSessionResourceReleaseResponseTransfer CRITICALITY ignore EXTENSION OCTET STRING (CONTAINING PDUSessionResourceReleaseResponseTransfer) PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceListCxtRelReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceItemCxtRelReq
+
+PDUSessionResourceItemCxtRelReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceItemCxtRelReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceItemCxtRelReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceListHORqd ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceItemHORqd
+
+PDUSessionResourceItemHORqd ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ handoverRequiredTransfer OCTET STRING (CONTAINING HandoverRequiredTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceItemHORqd-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceItemHORqd-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyConfirmTransfer ::= SEQUENCE {
+ qosFlowModifyConfirmList QosFlowModifyConfirmList,
+ uLNGU-UP-TNLInformation UPTransportLayerInformation,
+ additionalNG-UUPTNLInformation UPTransportLayerInformationPairList OPTIONAL,
+ qosFlowFailedToModifyList QosFlowListWithCause OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyConfirmTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyConfirmTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyIndicationUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyIndicationUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyIndicationUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyRequestTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceModifyRequestTransferIEs} },
+ ...
+}
+
+PDUSessionResourceModifyRequestTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-PDUSessionAggregateMaximumBitRate CRITICALITY reject TYPE PDUSessionAggregateMaximumBitRate PRESENCE optional }|
+ { ID id-UL-NGU-UP-TNLModifyList CRITICALITY reject TYPE UL-NGU-UP-TNLModifyList PRESENCE optional }|
+ { ID id-NetworkInstance CRITICALITY reject TYPE NetworkInstance PRESENCE optional }|
+ { ID id-QosFlowAddOrModifyRequestList CRITICALITY reject TYPE QosFlowAddOrModifyRequestList PRESENCE optional }|
+ { ID id-QosFlowToReleaseList CRITICALITY reject TYPE QosFlowListWithCause PRESENCE optional }|
+ { ID id-AdditionalUL-NGU-UP-TNLInformation CRITICALITY reject TYPE UPTransportLayerInformationList PRESENCE optional }|
+ { ID id-CommonNetworkInstance CRITICALITY ignore TYPE CommonNetworkInstance PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceModifyResponseTransfer ::= SEQUENCE {
+ dL-NGU-UP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ uL-NGU-UP-TNLInformation UPTransportLayerInformation OPTIONAL,
+ qosFlowAddOrModifyResponseList QosFlowAddOrModifyResponseList OPTIONAL,
+ additionalDLQosFlowPerTNLInformation QosFlowPerTNLInformationList OPTIONAL,
+ qosFlowFailedToAddOrModifyList QosFlowListWithCause OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyResponseTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyResponseTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-AdditionalNGU-UP-TNLInformation CRITICALITY ignore EXTENSION UPTransportLayerInformationPairList PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceModifyIndicationTransfer ::= SEQUENCE {
+ dLQosFlowPerTNLInformation QosFlowPerTNLInformation,
+ additionalDLQosFlowPerTNLInformation QosFlowPerTNLInformationList OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyIndicationTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyIndicationTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-SecondaryRATUsageInformation CRITICALITY ignore EXTENSION SecondaryRATUsageInformation PRESENCE optional }|
+ { ID id-SecurityResult CRITICALITY ignore EXTENSION SecurityResult PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceModifyListModCfm ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceModifyItemModCfm
+
+PDUSessionResourceModifyItemModCfm ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceModifyConfirmTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyConfirmTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyItemModCfm-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyItemModCfm-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyListModInd ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceModifyItemModInd
+
+PDUSessionResourceModifyItemModInd ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceModifyIndicationTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyIndicationTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyItemModInd-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyItemModInd-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyListModReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceModifyItemModReq
+
+PDUSessionResourceModifyItemModReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ nAS-PDU NAS-PDU OPTIONAL,
+ pDUSessionResourceModifyRequestTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyRequestTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyItemModReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyItemModReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ {ID id-S-NSSAI CRITICALITY reject EXTENSION S-NSSAI PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceModifyListModRes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceModifyItemModRes
+
+PDUSessionResourceModifyItemModRes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceModifyResponseTransfer OCTET STRING (CONTAINING PDUSessionResourceModifyResponseTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyItemModRes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyItemModRes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceModifyUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ criticalityDiagnostics CriticalityDiagnostics OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceModifyUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceModifyUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceNotifyList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceNotifyItem
+
+PDUSessionResourceNotifyItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceNotifyTransfer OCTET STRING (CONTAINING PDUSessionResourceNotifyTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceNotifyItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceNotifyItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceNotifyReleasedTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceNotifyReleasedTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceNotifyReleasedTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-SecondaryRATUsageInformation CRITICALITY ignore EXTENSION SecondaryRATUsageInformation PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceNotifyTransfer ::= SEQUENCE {
+ qosFlowNotifyList QosFlowNotifyList OPTIONAL,
+ qosFlowReleasedList QosFlowListWithCause OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceNotifyTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceNotifyTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-SecondaryRATUsageInformation CRITICALITY ignore EXTENSION SecondaryRATUsageInformation PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceReleaseCommandTransfer ::= SEQUENCE {
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleaseCommandTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleaseCommandTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceReleasedListNot ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceReleasedItemNot
+
+PDUSessionResourceReleasedItemNot ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceNotifyReleasedTransfer OCTET STRING (CONTAINING PDUSessionResourceNotifyReleasedTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleasedItemNot-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleasedItemNot-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceReleasedListPSAck ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceReleasedItemPSAck
+
+PDUSessionResourceReleasedItemPSAck ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pathSwitchRequestUnsuccessfulTransfer OCTET STRING (CONTAINING PathSwitchRequestUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleasedItemPSAck-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleasedItemPSAck-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceReleasedListPSFail ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceReleasedItemPSFail
+
+PDUSessionResourceReleasedItemPSFail ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pathSwitchRequestUnsuccessfulTransfer OCTET STRING (CONTAINING PathSwitchRequestUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleasedItemPSFail-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleasedItemPSFail-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceReleasedListRelRes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceReleasedItemRelRes
+
+PDUSessionResourceReleasedItemRelRes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceReleaseResponseTransfer OCTET STRING (CONTAINING PDUSessionResourceReleaseResponseTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleasedItemRelRes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleasedItemRelRes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceReleaseResponseTransfer ::= SEQUENCE {
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceReleaseResponseTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceReleaseResponseTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-SecondaryRATUsageInformation CRITICALITY ignore EXTENSION SecondaryRATUsageInformation PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceSecondaryRATUsageList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSecondaryRATUsageItem
+
+PDUSessionResourceSecondaryRATUsageItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ secondaryRATDataUsageReportTransfer OCTET STRING (CONTAINING SecondaryRATDataUsageReportTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSecondaryRATUsageItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSecondaryRATUsageItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupListCxtReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSetupItemCxtReq
+
+PDUSessionResourceSetupItemCxtReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ nAS-PDU NAS-PDU OPTIONAL,
+ s-NSSAI S-NSSAI,
+ pDUSessionResourceSetupRequestTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupRequestTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupItemCxtReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupItemCxtReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupListCxtRes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSetupItemCxtRes
+
+PDUSessionResourceSetupItemCxtRes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceSetupResponseTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupResponseTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupItemCxtRes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupItemCxtRes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupListHOReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSetupItemHOReq
+
+PDUSessionResourceSetupItemHOReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ s-NSSAI S-NSSAI,
+ handoverRequestTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupRequestTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupItemHOReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupItemHOReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupListSUReq ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSetupItemSUReq
+
+PDUSessionResourceSetupItemSUReq ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionNAS-PDU NAS-PDU OPTIONAL,
+ s-NSSAI S-NSSAI,
+ pDUSessionResourceSetupRequestTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupRequestTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupItemSUReq-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupItemSUReq-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupListSURes ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSetupItemSURes
+
+PDUSessionResourceSetupItemSURes ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceSetupResponseTransfer OCTET STRING (CONTAINING PDUSessionResourceSetupResponseTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupItemSURes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupItemSURes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupRequestTransfer ::= SEQUENCE {
+ protocolIEs ProtocolIE-Container { {PDUSessionResourceSetupRequestTransferIEs} },
+ ...
+}
+
+PDUSessionResourceSetupRequestTransferIEs NGAP-PROTOCOL-IES ::= {
+ { ID id-PDUSessionAggregateMaximumBitRate CRITICALITY reject TYPE PDUSessionAggregateMaximumBitRate PRESENCE optional }|
+ { ID id-UL-NGU-UP-TNLInformation CRITICALITY reject TYPE UPTransportLayerInformation PRESENCE mandatory }|
+ { ID id-AdditionalUL-NGU-UP-TNLInformation CRITICALITY reject TYPE UPTransportLayerInformationList PRESENCE optional }|
+ { ID id-DataForwardingNotPossible CRITICALITY reject TYPE DataForwardingNotPossible PRESENCE optional }|
+ { ID id-PDUSessionType CRITICALITY reject TYPE PDUSessionType PRESENCE mandatory }|
+ { ID id-SecurityIndication CRITICALITY reject TYPE SecurityIndication PRESENCE optional }|
+ { ID id-NetworkInstance CRITICALITY reject TYPE NetworkInstance PRESENCE optional }|
+ { ID id-QosFlowSetupRequestList CRITICALITY reject TYPE QosFlowSetupRequestList PRESENCE mandatory }|
+ { ID id-CommonNetworkInstance CRITICALITY ignore TYPE CommonNetworkInstance PRESENCE optional },
+ ...
+}
+
+PDUSessionResourceSetupResponseTransfer ::= SEQUENCE {
+ dLQosFlowPerTNLInformation QosFlowPerTNLInformation,
+ additionalDLQosFlowPerTNLInformation QosFlowPerTNLInformationList OPTIONAL,
+ securityResult SecurityResult OPTIONAL,
+ qosFlowFailedToSetupList QosFlowListWithCause OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupResponseTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupResponseTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSetupUnsuccessfulTransfer ::= SEQUENCE {
+ cause Cause,
+ criticalityDiagnostics CriticalityDiagnostics OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceSetupUnsuccessfulTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSetupUnsuccessfulTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceSwitchedList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceSwitchedItem
+
+PDUSessionResourceSwitchedItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pathSwitchRequestAcknowledgeTransfer OCTET STRING (CONTAINING PathSwitchRequestAcknowledgeTransfer),
+ iE-Extensions ProtocolExtensionContainer { { PDUSessionResourceSwitchedItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceSwitchedItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceToBeSwitchedDLList ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceToBeSwitchedDLItem
+
+PDUSessionResourceToBeSwitchedDLItem ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pathSwitchRequestTransfer OCTET STRING (CONTAINING PathSwitchRequestTransfer),
+ iE-Extensions ProtocolExtensionContainer { { PDUSessionResourceToBeSwitchedDLItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceToBeSwitchedDLItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceToReleaseListHOCmd ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceToReleaseItemHOCmd
+
+PDUSessionResourceToReleaseItemHOCmd ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ handoverPreparationUnsuccessfulTransfer OCTET STRING (CONTAINING HandoverPreparationUnsuccessfulTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceToReleaseItemHOCmd-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceToReleaseItemHOCmd-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PDUSessionResourceToReleaseListRelCmd ::= SEQUENCE (SIZE(1..maxnoofPDUSessions)) OF PDUSessionResourceToReleaseItemRelCmd
+
+PDUSessionResourceToReleaseItemRelCmd ::= SEQUENCE {
+ pDUSessionID PDUSessionID,
+ pDUSessionResourceReleaseCommandTransfer OCTET STRING (CONTAINING PDUSessionResourceReleaseCommandTransfer),
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionResourceToReleaseItemRelCmd-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PDUSessionResourceToReleaseItemRelCmd-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+PDUSessionType ::= ENUMERATED {
+ ipv4,
+ ipv6,
+ ipv4v6,
+ ethernet,
+ unstructured,
+ ...
+}
+
+PDUSessionUsageReport ::= SEQUENCE {
+ rATType ENUMERATED {nr, eutra, ...},
+ pDUSessionTimedReportList VolumeTimedReportList,
+ iE-Extensions ProtocolExtensionContainer { {PDUSessionUsageReport-ExtIEs} } OPTIONAL,
+...
+}
+
+PDUSessionUsageReport-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PeriodicRegistrationUpdateTimer ::= BIT STRING (SIZE(8))
+
+PLMNIdentity ::= OCTET STRING (SIZE(3))
+
+PLMNSupportList ::= SEQUENCE (SIZE(1..maxnoofPLMNs)) OF PLMNSupportItem
+
+PLMNSupportItem ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ sliceSupportList SliceSupportList,
+ iE-Extensions ProtocolExtensionContainer { {PLMNSupportItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+PLMNSupportItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+PortNumber ::= OCTET STRING (SIZE(2))
+
+Pre-emptionCapability ::= ENUMERATED {
+ shall-not-trigger-pre-emption,
+ may-trigger-pre-emption,
+ ...
+}
+
+Pre-emptionVulnerability ::= ENUMERATED {
+ not-pre-emptable,
+ pre-emptable,
+ ...
+}
+
+PriorityLevelARP ::= INTEGER (1..15)
+
+PriorityLevelQos ::= INTEGER (1..127, ...)
+
+PWSFailedCellIDList ::= CHOICE {
+ eUTRA-CGI-PWSFailedList EUTRA-CGIList,
+ nR-CGI-PWSFailedList NR-CGIList,
+ choice-Extensions ProtocolIE-SingleContainer { {PWSFailedCellIDList-ExtIEs} }
+}
+
+PWSFailedCellIDList-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+-- Q
+
+QosCharacteristics ::= CHOICE {
+ nonDynamic5QI NonDynamic5QIDescriptor,
+ dynamic5QI Dynamic5QIDescriptor,
+ choice-Extensions ProtocolIE-SingleContainer { {QosCharacteristics-ExtIEs} }
+}
+
+QosCharacteristics-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+QosFlowAcceptedList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowAcceptedItem
+
+QosFlowAcceptedItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowAcceptedItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowAcceptedItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowAddOrModifyRequestList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowAddOrModifyRequestItem
+
+QosFlowAddOrModifyRequestItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ qosFlowLevelQosParameters QosFlowLevelQosParameters OPTIONAL,
+ e-RAB-ID E-RAB-ID OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowAddOrModifyRequestItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowAddOrModifyRequestItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowAddOrModifyResponseList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowAddOrModifyResponseItem
+
+QosFlowAddOrModifyResponseItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowAddOrModifyResponseItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowAddOrModifyResponseItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowIdentifier ::= INTEGER (0..63, ...)
+
+QosFlowInformationList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowInformationItem
+
+QosFlowInformationItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ dLForwarding DLForwarding OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowInformationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowInformationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ {ID id-ULForwarding CRITICALITY reject EXTENSION ULForwarding PRESENCE optional},
+ ...
+}
+
+QosFlowLevelQosParameters ::= SEQUENCE {
+ qosCharacteristics QosCharacteristics,
+ allocationAndRetentionPriority AllocationAndRetentionPriority,
+ gBR-QosInformation GBR-QosInformation OPTIONAL,
+ reflectiveQosAttribute ReflectiveQosAttribute OPTIONAL,
+ additionalQosFlowInformation AdditionalQosFlowInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowLevelQosParameters-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowLevelQosParameters-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowListWithCause ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowWithCauseItem
+
+QosFlowWithCauseItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowWithCauseItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowWithCauseItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowModifyConfirmList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowModifyConfirmItem
+
+QosFlowModifyConfirmItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowModifyConfirmItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowModifyConfirmItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowNotifyList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowNotifyItem
+
+QosFlowNotifyItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ notificationCause NotificationCause,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowNotifyItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowNotifyItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowPerTNLInformation ::= SEQUENCE {
+ uPTransportLayerInformation UPTransportLayerInformation,
+ associatedQosFlowList AssociatedQosFlowList,
+ iE-Extensions ProtocolExtensionContainer { { QosFlowPerTNLInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowPerTNLInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowPerTNLInformationList ::= SEQUENCE (SIZE(1..maxnoofMultiConnectivityMinusOne)) OF QosFlowPerTNLInformationItem
+
+QosFlowPerTNLInformationItem ::= SEQUENCE {
+ qosFlowPerTNLInformation QosFlowPerTNLInformation,
+ iE-Extensions ProtocolExtensionContainer { { QosFlowPerTNLInformationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowPerTNLInformationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowSetupRequestList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowSetupRequestItem
+
+QosFlowSetupRequestItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ qosFlowLevelQosParameters QosFlowLevelQosParameters,
+ e-RAB-ID E-RAB-ID OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowSetupRequestItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowSetupRequestItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowListWithDataForwarding ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowItemWithDataForwarding
+
+QosFlowItemWithDataForwarding ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ dataForwardingAccepted DataForwardingAccepted OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowItemWithDataForwarding-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowItemWithDataForwarding-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowSetupResponseListSURes ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowSetupResponseItemSURes
+
+QosFlowSetupResponseItemSURes ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowSetupResponseItemSURes-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowSetupResponseItemSURes-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QosFlowToBeForwardedList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QosFlowToBeForwardedItem
+
+QosFlowToBeForwardedItem ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ iE-Extensions ProtocolExtensionContainer { {QosFlowToBeForwardedItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+QosFlowToBeForwardedItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+QoSFlowsUsageReportList ::= SEQUENCE (SIZE(1..maxnoofQosFlows)) OF QoSFlowsUsageReport-Item
+
+QoSFlowsUsageReport-Item ::= SEQUENCE {
+ qosFlowIdentifier QosFlowIdentifier,
+ rATType ENUMERATED {nr, eutra, ...},
+ qoSFlowsTimedReportList VolumeTimedReportList,
+ iE-Extensions ProtocolExtensionContainer { {QoSFlowsUsageReport-Item-ExtIEs} } OPTIONAL,
+...
+}
+
+QoSFlowsUsageReport-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- R
+
+RANNodeName ::= PrintableString (SIZE(1..150, ...))
+
+RANPagingPriority ::= INTEGER (1..256)
+
+RANStatusTransfer-TransparentContainer ::= SEQUENCE {
+ dRBsSubjectToStatusTransferList DRBsSubjectToStatusTransferList,
+ iE-Extensions ProtocolExtensionContainer { {RANStatusTransfer-TransparentContainer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RANStatusTransfer-TransparentContainer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RAN-UE-NGAP-ID ::= INTEGER (0..4294967295)
+
+RATRestrictions ::= SEQUENCE (SIZE(1..maxnoofEPLMNsPlusOne)) OF RATRestrictions-Item
+
+RATRestrictions-Item ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ rATRestrictionInformation RATRestrictionInformation,
+ iE-Extensions ProtocolExtensionContainer { {RATRestrictions-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RATRestrictions-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RATRestrictionInformation ::= BIT STRING (SIZE(8, ...))
+
+RecommendedCellsForPaging ::= SEQUENCE {
+ recommendedCellList RecommendedCellList,
+ iE-Extensions ProtocolExtensionContainer { {RecommendedCellsForPaging-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RecommendedCellsForPaging-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RecommendedCellList ::= SEQUENCE (SIZE(1..maxnoofRecommendedCells)) OF RecommendedCellItem
+
+RecommendedCellItem ::= SEQUENCE {
+ nGRAN-CGI NGRAN-CGI,
+ timeStayedInCell INTEGER (0..4095) OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {RecommendedCellItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RecommendedCellItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RecommendedRANNodesForPaging ::= SEQUENCE {
+ recommendedRANNodeList RecommendedRANNodeList,
+ iE-Extensions ProtocolExtensionContainer { {RecommendedRANNodesForPaging-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RecommendedRANNodesForPaging-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RecommendedRANNodeList::= SEQUENCE (SIZE(1..maxnoofRecommendedRANNodes)) OF RecommendedRANNodeItem
+
+RecommendedRANNodeItem ::= SEQUENCE {
+ aMFPagingTarget AMFPagingTarget,
+ iE-Extensions ProtocolExtensionContainer { {RecommendedRANNodeItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+RecommendedRANNodeItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+RedirectionVoiceFallback ::= ENUMERATED {
+ possible,
+ not-possible,
+ ...
+}
+
+ReflectiveQosAttribute ::= ENUMERATED {
+ subject-to,
+ ...
+}
+
+ReferenceID ::= INTEGER (1..64, ...)
+
+RelativeAMFCapacity ::= INTEGER (0..255)
+
+ReportArea ::= ENUMERATED {
+ cell,
+ ...
+}
+
+RepetitionPeriod ::= INTEGER (0..131071)
+
+ResetAll ::= ENUMERATED {
+ reset-all,
+ ...
+}
+
+ResetType ::= CHOICE {
+ nG-Interface ResetAll,
+ partOfNG-Interface UE-associatedLogicalNG-connectionList,
+ choice-Extensions ProtocolIE-SingleContainer { {ResetType-ExtIEs} }
+}
+
+ResetType-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+RoutingID ::= OCTET STRING
+
+RRCContainer ::= OCTET STRING
+
+RRCEstablishmentCause ::= ENUMERATED {
+ emergency,
+ highPriorityAccess,
+ mt-Access,
+ mo-Signalling,
+ mo-Data,
+ mo-VoiceCall,
+ mo-VideoCall,
+ mo-SMS,
+ mps-PriorityAccess,
+ mcs-PriorityAccess,
+ ...,
+ notAvailable
+}
+
+RRCInactiveTransitionReportRequest ::= ENUMERATED {
+ subsequent-state-transition-report,
+ single-rrc-connected-state-report,
+ cancel-report,
+ ...
+}
+
+RRCState ::= ENUMERATED {
+ inactive,
+ connected,
+ ...
+}
+
+-- S
+
+SCTP-TLAs ::= SEQUENCE (SIZE(1..maxnoofXnTLAs)) OF TransportLayerAddress
+
+SD ::= OCTET STRING (SIZE(3))
+
+SecondaryRATUsageInformation ::= SEQUENCE {
+ pDUSessionUsageReport PDUSessionUsageReport OPTIONAL,
+ qosFlowsUsageReportList QoSFlowsUsageReportList OPTIONAL,
+ iE-Extension ProtocolExtensionContainer { {SecondaryRATUsageInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SecondaryRATUsageInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SecondaryRATDataUsageReportTransfer ::= SEQUENCE {
+ secondaryRATUsageInformation SecondaryRATUsageInformation OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {SecondaryRATDataUsageReportTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SecondaryRATDataUsageReportTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SecurityContext ::= SEQUENCE {
+ nextHopChainingCount NextHopChainingCount,
+ nextHopNH SecurityKey,
+ iE-Extensions ProtocolExtensionContainer { {SecurityContext-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SecurityContext-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SecurityIndication ::= SEQUENCE {
+ integrityProtectionIndication IntegrityProtectionIndication,
+ confidentialityProtectionIndication ConfidentialityProtectionIndication,
+ maximumIntegrityProtectedDataRate-UL MaximumIntegrityProtectedDataRate OPTIONAL,
+-- The above IE shall be present if integrity protection is required or preferred
+ iE-Extensions ProtocolExtensionContainer { {SecurityIndication-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SecurityIndication-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-MaximumIntegrityProtectedDataRate-DL CRITICALITY ignore EXTENSION MaximumIntegrityProtectedDataRate PRESENCE optional },
+ ...
+}
+
+SecurityKey ::= BIT STRING (SIZE(256))
+
+SecurityResult ::= SEQUENCE {
+ integrityProtectionResult IntegrityProtectionResult,
+ confidentialityProtectionResult ConfidentialityProtectionResult,
+ iE-Extensions ProtocolExtensionContainer { {SecurityResult-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SecurityResult-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SerialNumber ::= BIT STRING (SIZE(16))
+
+ServedGUAMIList ::= SEQUENCE (SIZE(1..maxnoofServedGUAMIs)) OF ServedGUAMIItem
+
+ServedGUAMIItem ::= SEQUENCE {
+ gUAMI GUAMI,
+ backupAMFName AMFName OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {ServedGUAMIItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ServedGUAMIItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ServiceAreaInformation ::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF ServiceAreaInformation-Item
+
+ServiceAreaInformation-Item ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ allowedTACs AllowedTACs OPTIONAL,
+ notAllowedTACs NotAllowedTACs OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {ServiceAreaInformation-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+ServiceAreaInformation-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+
+SliceOverloadList ::= SEQUENCE (SIZE(1..maxnoofSliceItems)) OF SliceOverloadItem
+
+SliceOverloadItem ::= SEQUENCE {
+ s-NSSAI S-NSSAI,
+ iE-Extensions ProtocolExtensionContainer { {SliceOverloadItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SliceOverloadItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SliceSupportList ::= SEQUENCE (SIZE(1..maxnoofSliceItems)) OF SliceSupportItem
+
+SliceSupportItem ::= SEQUENCE {
+ s-NSSAI S-NSSAI,
+ iE-Extensions ProtocolExtensionContainer { {SliceSupportItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SliceSupportItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+S-NSSAI ::= SEQUENCE {
+ sST SST,
+ sD SD OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { { S-NSSAI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+S-NSSAI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SONConfigurationTransfer ::= SEQUENCE {
+ targetRANNodeID TargetRANNodeID,
+ sourceRANNodeID SourceRANNodeID,
+ sONInformation SONInformation,
+ xnTNLConfigurationInfo XnTNLConfigurationInfo OPTIONAL,
+-- The above IE shall be present if the SON Information IE contains the SON Information Request IE set to ¡°Xn TNL Configuration Info¡±
+ iE-Extensions ProtocolExtensionContainer { {SONConfigurationTransfer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SONConfigurationTransfer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SONInformation ::= CHOICE {
+ sONInformationRequest SONInformationRequest,
+ sONInformationReply SONInformationReply,
+ choice-Extensions ProtocolIE-SingleContainer { {SONInformation-ExtIEs} }
+}
+
+SONInformation-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+SONInformationReply ::= SEQUENCE {
+ xnTNLConfigurationInfo XnTNLConfigurationInfo OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {SONInformationReply-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SONInformationReply-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SONInformationRequest ::= ENUMERATED {
+ xn-TNL-configuration-info,
+ ...
+}
+
+SourceNGRANNode-ToTargetNGRANNode-TransparentContainer ::= SEQUENCE {
+ rRCContainer RRCContainer,
+ pDUSessionResourceInformationList PDUSessionResourceInformationList OPTIONAL,
+ e-RABInformationList E-RABInformationList OPTIONAL,
+ targetCell-ID NGRAN-CGI,
+ indexToRFSP IndexToRFSP OPTIONAL,
+ uEHistoryInformation UEHistoryInformation,
+ iE-Extensions ProtocolExtensionContainer { {SourceNGRANNode-ToTargetNGRANNode-TransparentContainer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SourceNGRANNode-ToTargetNGRANNode-TransparentContainer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SourceOfUEActivityBehaviourInformation ::= ENUMERATED {
+ subscription-information,
+ statistics,
+ ...
+}
+
+SourceRANNodeID ::= SEQUENCE {
+ globalRANNodeID GlobalRANNodeID,
+ selectedTAI TAI,
+ iE-Extensions ProtocolExtensionContainer { {SourceRANNodeID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SourceRANNodeID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+SourceToTarget-TransparentContainer ::= OCTET STRING
+-- This IE includes a transparent container from the source RAN node to the target RAN node.
+-- The octets of the OCTET STRING are encoded according to the specifications of the target system.
+
+SourceToTarget-AMFInformationReroute ::= SEQUENCE {
+configuredNSSAI ConfiguredNSSAI OPTIONAL,
+rejectedNSSAIinPLMN RejectedNSSAIinPLMN OPTIONAL,
+rejectedNSSAIinTA RejectedNSSAIinTA OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {SourceToTarget-AMFInformationReroute-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SourceToTarget-AMFInformationReroute-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- This IE includes information from the source Core node to the target Core node for reroute information provide by NSSF.
+-- The octets of the OCTET STRING are encoded according to the specifications of the Core network.
+
+
+ConfiguredNSSAI ::= OCTET STRING (SIZE(128))
+
+RejectedNSSAIinPLMN ::= OCTET STRING (SIZE(32))
+
+RejectedNSSAIinTA ::= OCTET STRING (SIZE(32))
+
+SST ::= OCTET STRING (SIZE(1))
+
+SupportedTAList ::= SEQUENCE (SIZE(1..maxnoofTACs)) OF SupportedTAItem
+
+SupportedTAItem ::= SEQUENCE {
+ tAC TAC,
+ broadcastPLMNList BroadcastPLMNList,
+ iE-Extensions ProtocolExtensionContainer { {SupportedTAItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+SupportedTAItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- T
+
+TAC ::= OCTET STRING (SIZE(3))
+
+TAI ::= SEQUENCE {
+ pLMNIdentity PLMNIdentity,
+ tAC TAC,
+ iE-Extensions ProtocolExtensionContainer { {TAI-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAI-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAIBroadcastEUTRA ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAIBroadcastEUTRA-Item
+
+TAIBroadcastEUTRA-Item ::= SEQUENCE {
+ tAI TAI,
+ completedCellsInTAI-EUTRA CompletedCellsInTAI-EUTRA,
+ iE-Extensions ProtocolExtensionContainer { {TAIBroadcastEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAIBroadcastEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAIBroadcastNR ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAIBroadcastNR-Item
+
+TAIBroadcastNR-Item ::= SEQUENCE {
+ tAI TAI,
+ completedCellsInTAI-NR CompletedCellsInTAI-NR,
+ iE-Extensions ProtocolExtensionContainer { {TAIBroadcastNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAIBroadcastNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAICancelledEUTRA ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAICancelledEUTRA-Item
+
+TAICancelledEUTRA-Item ::= SEQUENCE {
+ tAI TAI,
+ cancelledCellsInTAI-EUTRA CancelledCellsInTAI-EUTRA,
+ iE-Extensions ProtocolExtensionContainer { {TAICancelledEUTRA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAICancelledEUTRA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAICancelledNR ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAICancelledNR-Item
+
+TAICancelledNR-Item ::= SEQUENCE {
+ tAI TAI,
+ cancelledCellsInTAI-NR CancelledCellsInTAI-NR,
+ iE-Extensions ProtocolExtensionContainer { {TAICancelledNR-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAICancelledNR-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAIListForInactive ::= SEQUENCE (SIZE(1..maxnoofTAIforInactive)) OF TAIListForInactiveItem
+
+TAIListForInactiveItem ::= SEQUENCE {
+ tAI TAI,
+ iE-Extensions ProtocolExtensionContainer { {TAIListForInactiveItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAIListForInactiveItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAIListForPaging ::= SEQUENCE (SIZE(1..maxnoofTAIforPaging)) OF TAIListForPagingItem
+
+TAIListForPagingItem ::= SEQUENCE {
+ tAI TAI,
+ iE-Extensions ProtocolExtensionContainer { {TAIListForPagingItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TAIListForPagingItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TAIListForRestart ::= SEQUENCE (SIZE(1..maxnoofTAIforRestart)) OF TAI
+
+TAIListForWarning ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI
+
+TargeteNB-ID ::= SEQUENCE {
+ globalENB-ID GlobalNgENB-ID,
+ selected-EPS-TAI EPS-TAI,
+ iE-Extensions ProtocolExtensionContainer { {TargeteNB-ID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TargeteNB-ID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TargetID ::= CHOICE {
+ targetRANNodeID TargetRANNodeID,
+ targeteNB-ID TargeteNB-ID,
+ choice-Extensions ProtocolIE-SingleContainer { {TargetID-ExtIEs} }
+}
+
+TargetID-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+TargetNGRANNode-ToSourceNGRANNode-TransparentContainer ::= SEQUENCE {
+ rRCContainer RRCContainer,
+ iE-Extensions ProtocolExtensionContainer { {TargetNGRANNode-ToSourceNGRANNode-TransparentContainer-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TargetNGRANNode-ToSourceNGRANNode-TransparentContainer-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TargetRANNodeID ::= SEQUENCE {
+ globalRANNodeID GlobalRANNodeID,
+ selectedTAI TAI,
+ iE-Extensions ProtocolExtensionContainer { {TargetRANNodeID-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TargetRANNodeID-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TargetToSource-TransparentContainer ::= OCTET STRING
+-- This IE includes a transparent container from the target RAN node to the source RAN node.
+-- The octets of the OCTET STRING are encoded according to the specifications of the target system.
+
+TimerApproachForGUAMIRemoval ::= ENUMERATED {
+ apply-timer,
+ ...
+}
+
+TimeStamp ::= OCTET STRING (SIZE(4))
+
+TimeToWait ::= ENUMERATED {v1s, v2s, v5s, v10s, v20s, v60s, ...}
+
+TimeUEStayedInCell ::= INTEGER (0..4095)
+
+TimeUEStayedInCellEnhancedGranularity ::= INTEGER (0..40950)
+
+TNLAddressWeightFactor ::= INTEGER (0..255)
+
+TNLAssociationList ::= SEQUENCE (SIZE(1..maxnoofTNLAssociations)) OF TNLAssociationItem
+
+TNLAssociationItem ::= SEQUENCE {
+ tNLAssociationAddress CPTransportLayerInformation,
+ cause Cause,
+ iE-Extensions ProtocolExtensionContainer { {TNLAssociationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TNLAssociationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TNLAssociationUsage ::= ENUMERATED {
+ ue,
+ non-ue,
+ both,
+ ...
+}
+
+TraceActivation ::= SEQUENCE {
+ nGRANTraceID NGRANTraceID,
+ interfacesToTrace InterfacesToTrace,
+ traceDepth TraceDepth,
+ traceCollectionEntityIPAddress TransportLayerAddress,
+ iE-Extensions ProtocolExtensionContainer { {TraceActivation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+TraceActivation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+TraceDepth ::= ENUMERATED {
+ minimum,
+ medium,
+ maximum,
+ minimumWithoutVendorSpecificExtension,
+ mediumWithoutVendorSpecificExtension,
+ maximumWithoutVendorSpecificExtension,
+ ...
+}
+
+TrafficLoadReductionIndication ::= INTEGER (1..99)
+
+TransportLayerAddress ::= BIT STRING (SIZE(1..160, ...))
+
+TypeOfError ::= ENUMERATED {
+ not-understood,
+ missing,
+ ...
+}
+
+-- U
+
+UEAggregateMaximumBitRate ::= SEQUENCE {
+ uEAggregateMaximumBitRateDL BitRate,
+ uEAggregateMaximumBitRateUL BitRate,
+ iE-Extensions ProtocolExtensionContainer { {UEAggregateMaximumBitRate-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UEAggregateMaximumBitRate-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UE-associatedLogicalNG-connectionList ::= SEQUENCE (SIZE(1..maxnoofNGConnectionsToReset)) OF UE-associatedLogicalNG-connectionItem
+
+UE-associatedLogicalNG-connectionItem ::= SEQUENCE {
+ aMF-UE-NGAP-ID AMF-UE-NGAP-ID OPTIONAL,
+ rAN-UE-NGAP-ID RAN-UE-NGAP-ID OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {UE-associatedLogicalNG-connectionItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UE-associatedLogicalNG-connectionItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...}
+
+UEContextRequest ::= ENUMERATED {requested, ...}
+
+UEHistoryInformation ::= SEQUENCE (SIZE(1..maxnoofCellsinUEHistoryInfo)) OF LastVisitedCellItem
+
+UEIdentityIndexValue ::= CHOICE {
+ indexLength10 BIT STRING (SIZE(10)),
+ choice-Extensions ProtocolIE-SingleContainer { {UEIdentityIndexValue-ExtIEs} }
+}
+
+UEIdentityIndexValue-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+UE-NGAP-IDs ::= CHOICE {
+ uE-NGAP-ID-pair UE-NGAP-ID-pair,
+ aMF-UE-NGAP-ID AMF-UE-NGAP-ID,
+ choice-Extensions ProtocolIE-SingleContainer { {UE-NGAP-IDs-ExtIEs} }
+}
+
+UE-NGAP-IDs-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+UE-NGAP-ID-pair ::= SEQUENCE{
+ aMF-UE-NGAP-ID AMF-UE-NGAP-ID,
+ rAN-UE-NGAP-ID RAN-UE-NGAP-ID,
+ iE-Extensions ProtocolExtensionContainer { {UE-NGAP-ID-pair-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UE-NGAP-ID-pair-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UEPagingIdentity ::= CHOICE {
+ fiveG-S-TMSI FiveG-S-TMSI,
+ choice-Extensions ProtocolIE-SingleContainer { {UEPagingIdentity-ExtIEs} }
+ }
+
+UEPagingIdentity-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+UEPresence ::= ENUMERATED {in, out, unknown, ...}
+
+UEPresenceInAreaOfInterestList ::= SEQUENCE (SIZE(1..maxnoofAoI)) OF UEPresenceInAreaOfInterestItem
+
+UEPresenceInAreaOfInterestItem ::= SEQUENCE {
+ locationReportingReferenceID LocationReportingReferenceID,
+ uEPresence UEPresence,
+ iE-Extensions ProtocolExtensionContainer { {UEPresenceInAreaOfInterestItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UEPresenceInAreaOfInterestItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UERadioCapability ::= OCTET STRING
+
+UERadioCapabilityForPaging ::= SEQUENCE {
+ uERadioCapabilityForPagingOfNR UERadioCapabilityForPagingOfNR OPTIONAL,
+ uERadioCapabilityForPagingOfEUTRA UERadioCapabilityForPagingOfEUTRA OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {UERadioCapabilityForPaging-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UERadioCapabilityForPaging-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UERadioCapabilityForPagingOfNR ::= OCTET STRING
+
+UERadioCapabilityForPagingOfEUTRA ::= OCTET STRING
+
+UERetentionInformation ::= ENUMERATED {
+ ues-retained,
+ ...
+}
+
+UESecurityCapabilities ::= SEQUENCE {
+ nRencryptionAlgorithms NRencryptionAlgorithms,
+ nRintegrityProtectionAlgorithms NRintegrityProtectionAlgorithms,
+ eUTRAencryptionAlgorithms EUTRAencryptionAlgorithms,
+ eUTRAintegrityProtectionAlgorithms EUTRAintegrityProtectionAlgorithms,
+
+ iE-Extensions ProtocolExtensionContainer { {UESecurityCapabilities-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UESecurityCapabilities-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UL-NGU-UP-TNLModifyList ::= SEQUENCE (SIZE(1..maxnoofMultiConnectivity)) OF UL-NGU-UP-TNLModifyItem
+
+UL-NGU-UP-TNLModifyItem ::= SEQUENCE {
+ uL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ dL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ iE-Extensions ProtocolExtensionContainer { {UL-NGU-UP-TNLModifyItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UL-NGU-UP-TNLModifyItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UnavailableGUAMIList ::= SEQUENCE (SIZE(1..maxnoofServedGUAMIs)) OF UnavailableGUAMIItem
+
+UnavailableGUAMIItem ::= SEQUENCE {
+ gUAMI GUAMI,
+ timerApproachForGUAMIRemoval TimerApproachForGUAMIRemoval OPTIONAL,
+ backupAMFName AMFName OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {UnavailableGUAMIItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UnavailableGUAMIItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+ULForwarding ::= ENUMERATED {
+ ul-forwarding-proposed,
+ ...
+}
+
+UPTransportLayerInformation ::= CHOICE {
+ gTPTunnel GTPTunnel,
+ choice-Extensions ProtocolIE-SingleContainer { {UPTransportLayerInformation-ExtIEs} }
+}
+
+UPTransportLayerInformation-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+UPTransportLayerInformationList ::= SEQUENCE (SIZE(1..maxnoofMultiConnectivityMinusOne)) OF UPTransportLayerInformationItem
+
+UPTransportLayerInformationItem ::= SEQUENCE {
+ nGU-UP-TNLInformation UPTransportLayerInformation,
+ iE-Extensions ProtocolExtensionContainer { {UPTransportLayerInformationItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UPTransportLayerInformationItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+
+UPTransportLayerInformationPairList ::= SEQUENCE (SIZE(1..maxnoofMultiConnectivityMinusOne)) OF UPTransportLayerInformationPairItem
+
+UPTransportLayerInformationPairItem ::= SEQUENCE {
+ uL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ dL-NGU-UP-TNLInformation UPTransportLayerInformation,
+ iE-Extensions ProtocolExtensionContainer { {UPTransportLayerInformationPairItem-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UPTransportLayerInformationPairItem-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UserLocationInformation ::= CHOICE {
+ userLocationInformationEUTRA UserLocationInformationEUTRA,
+ userLocationInformationNR UserLocationInformationNR,
+ userLocationInformationN3IWF UserLocationInformationN3IWF,
+ choice-Extensions ProtocolIE-SingleContainer { {UserLocationInformation-ExtIEs} }
+}
+
+UserLocationInformation-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+UserLocationInformationEUTRA ::= SEQUENCE {
+ eUTRA-CGI EUTRA-CGI,
+ tAI TAI,
+ timeStamp TimeStamp OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {UserLocationInformationEUTRA-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UserLocationInformationEUTRA-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-PSCellInformation CRITICALITY ignore EXTENSION NGRAN-CGI PRESENCE optional},
+ ...
+}
+
+UserLocationInformationN3IWF ::= SEQUENCE {
+ iPAddress TransportLayerAddress,
+ portNumber PortNumber,
+ iE-Extensions ProtocolExtensionContainer { {UserLocationInformationN3IWF-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UserLocationInformationN3IWF-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+UserLocationInformationNR ::= SEQUENCE {
+ nR-CGI NR-CGI,
+ tAI TAI,
+ timeStamp TimeStamp OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {UserLocationInformationNR-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UserLocationInformationNR-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-PSCellInformation CRITICALITY ignore EXTENSION NGRAN-CGI PRESENCE optional},
+ ...
+}
+
+UserPlaneSecurityInformation ::= SEQUENCE {
+ securityResult SecurityResult,
+ securityIndication SecurityIndication,
+ iE-Extensions ProtocolExtensionContainer { {UserPlaneSecurityInformation-ExtIEs} } OPTIONAL,
+ ...
+}
+
+UserPlaneSecurityInformation-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- V
+
+VolumeTimedReportList ::= SEQUENCE (SIZE(1..maxnoofTimePeriods)) OF VolumeTimedReport-Item
+
+VolumeTimedReport-Item ::= SEQUENCE {
+ startTimeStamp OCTET STRING (SIZE(4)),
+ endTimeStamp OCTET STRING (SIZE(4)),
+ usageCountUL INTEGER (0..18446744073709551615),
+ usageCountDL INTEGER (0..18446744073709551615),
+ iE-Extensions ProtocolExtensionContainer { {VolumeTimedReport-Item-ExtIEs} } OPTIONAL,
+...
+}
+
+VolumeTimedReport-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- W
+
+WarningAreaCoordinates ::= OCTET STRING (SIZE(1..1024))
+
+WarningAreaList ::= CHOICE {
+ eUTRA-CGIListForWarning EUTRA-CGIListForWarning,
+ nR-CGIListForWarning NR-CGIListForWarning,
+ tAIListForWarning TAIListForWarning,
+ emergencyAreaIDList EmergencyAreaIDList,
+ choice-Extensions ProtocolIE-SingleContainer { {WarningAreaList-ExtIEs} }
+}
+
+WarningAreaList-ExtIEs NGAP-PROTOCOL-IES ::= {
+ ...
+}
+
+WarningMessageContents ::= OCTET STRING (SIZE(1..9600))
+
+WarningSecurityInfo ::= OCTET STRING (SIZE(50))
+
+WarningType ::= OCTET STRING (SIZE(2))
+
+-- X
+
+XnExtTLAs ::= SEQUENCE (SIZE(1..maxnoofXnExtTLAs)) OF XnExtTLA-Item
+
+XnExtTLA-Item ::= SEQUENCE {
+ iPsecTLA TransportLayerAddress OPTIONAL,
+ gTP-TLAs XnGTP-TLAs OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {XnExtTLA-Item-ExtIEs} } OPTIONAL,
+ ...
+}
+
+XnExtTLA-Item-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ { ID id-SCTP-TLAs CRITICALITY ignore EXTENSION SCTP-TLAs PRESENCE optional },
+ ...
+}
+
+XnGTP-TLAs ::= SEQUENCE (SIZE(1..maxnoofXnGTP-TLAs)) OF TransportLayerAddress
+
+XnTLAs ::= SEQUENCE (SIZE(1..maxnoofXnTLAs)) OF TransportLayerAddress
+
+XnTNLConfigurationInfo ::= SEQUENCE {
+ xnTransportLayerAddresses XnTLAs,
+ xnExtendedTransportLayerAddresses XnExtTLAs OPTIONAL,
+ iE-Extensions ProtocolExtensionContainer { {XnTNLConfigurationInfo-ExtIEs} } OPTIONAL,
+ ...
+}
+
+XnTNLConfigurationInfo-ExtIEs NGAP-PROTOCOL-EXTENSION ::= {
+ ...
+}
+
+-- Y
+-- Z
+
+END
+-- ASN1STOP
+
+-- ASN1START
+-- **************************************************************
+--
+-- Common definitions
+--
+-- **************************************************************
+
+NGAP-CommonDataTypes {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-CommonDataTypes (3) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+Criticality ::= ENUMERATED { reject, ignore, notify }
+
+Presence ::= ENUMERATED { optional, conditional, mandatory }
+
+PrivateIE-ID ::= CHOICE {
+ local INTEGER (0..65535),
+ global OBJECT IDENTIFIER
+}
+
+ProcedureCode ::= INTEGER (0..255)
+
+ProtocolExtensionID ::= INTEGER (0..65535)
+
+ProtocolIE-ID ::= INTEGER (0..65535)
+
+TriggeringMessage ::= ENUMERATED { initiating-message, successful-outcome, unsuccessfull-outcome }
+
+END
+-- ASN1STOP
+
+-- ASN1START
+-- **************************************************************
+--
+-- Constant definitions
+--
+-- **************************************************************
+
+NGAP-Constants {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-Constants (4) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+
+ ProcedureCode,
+ ProtocolIE-ID
+FROM NGAP-CommonDataTypes;
+
+
+-- **************************************************************
+--
+-- Elementary Procedures
+--
+-- **************************************************************
+
+id-AMFConfigurationUpdate ProcedureCode ::= 0
+id-AMFStatusIndication ProcedureCode ::= 1
+id-CellTrafficTrace ProcedureCode ::= 2
+id-DeactivateTrace ProcedureCode ::= 3
+id-DownlinkNASTransport ProcedureCode ::= 4
+id-DownlinkNonUEAssociatedNRPPaTransport ProcedureCode ::= 5
+id-DownlinkRANConfigurationTransfer ProcedureCode ::= 6
+id-DownlinkRANStatusTransfer ProcedureCode ::= 7
+id-DownlinkUEAssociatedNRPPaTransport ProcedureCode ::= 8
+id-ErrorIndication ProcedureCode ::= 9
+id-HandoverCancel ProcedureCode ::= 10
+id-HandoverNotification ProcedureCode ::= 11
+id-HandoverPreparation ProcedureCode ::= 12
+id-HandoverResourceAllocation ProcedureCode ::= 13
+id-InitialContextSetup ProcedureCode ::= 14
+id-InitialUEMessage ProcedureCode ::= 15
+id-LocationReportingControl ProcedureCode ::= 16
+id-LocationReportingFailureIndication ProcedureCode ::= 17
+id-LocationReport ProcedureCode ::= 18
+id-NASNonDeliveryIndication ProcedureCode ::= 19
+id-NGReset ProcedureCode ::= 20
+id-NGSetup ProcedureCode ::= 21
+id-OverloadStart ProcedureCode ::= 22
+id-OverloadStop ProcedureCode ::= 23
+id-Paging ProcedureCode ::= 24
+id-PathSwitchRequest ProcedureCode ::= 25
+id-PDUSessionResourceModify ProcedureCode ::= 26
+id-PDUSessionResourceModifyIndication ProcedureCode ::= 27
+id-PDUSessionResourceRelease ProcedureCode ::= 28
+id-PDUSessionResourceSetup ProcedureCode ::= 29
+id-PDUSessionResourceNotify ProcedureCode ::= 30
+id-PrivateMessage ProcedureCode ::= 31
+id-PWSCancel ProcedureCode ::= 32
+id-PWSFailureIndication ProcedureCode ::= 33
+id-PWSRestartIndication ProcedureCode ::= 34
+id-RANConfigurationUpdate ProcedureCode ::= 35
+id-RerouteNASRequest ProcedureCode ::= 36
+id-RRCInactiveTransitionReport ProcedureCode ::= 37
+id-TraceFailureIndication ProcedureCode ::= 38
+id-TraceStart ProcedureCode ::= 39
+id-UEContextModification ProcedureCode ::= 40
+id-UEContextRelease ProcedureCode ::= 41
+id-UEContextReleaseRequest ProcedureCode ::= 42
+id-UERadioCapabilityCheck ProcedureCode ::= 43
+id-UERadioCapabilityInfoIndication ProcedureCode ::= 44
+id-UETNLABindingRelease ProcedureCode ::= 45
+id-UplinkNASTransport ProcedureCode ::= 46
+id-UplinkNonUEAssociatedNRPPaTransport ProcedureCode ::= 47
+id-UplinkRANConfigurationTransfer ProcedureCode ::= 48
+id-UplinkRANStatusTransfer ProcedureCode ::= 49
+id-UplinkUEAssociatedNRPPaTransport ProcedureCode ::= 50
+id-WriteReplaceWarning ProcedureCode ::= 51
+id-SecondaryRATDataUsageReport ProcedureCode ::= 52
+
+-- **************************************************************
+--
+-- Extension constants
+--
+-- **************************************************************
+
+maxPrivateIEs INTEGER ::= 65535
+maxProtocolExtensions INTEGER ::= 65535
+maxProtocolIEs INTEGER ::= 65535
+
+-- **************************************************************
+--
+-- Lists
+--
+-- **************************************************************
+
+ maxnoofAllowedAreas INTEGER ::= 16
+ maxnoofAllowedS-NSSAIs INTEGER ::= 8
+ maxnoofBPLMNs INTEGER ::= 12
+ maxnoofCellIDforWarning INTEGER ::= 65535
+ maxnoofCellinAoI INTEGER ::= 256
+ maxnoofCellinEAI INTEGER ::= 65535
+ maxnoofCellinTAI INTEGER ::= 65535
+ maxnoofCellsingNB INTEGER ::= 16384
+ maxnoofCellsinngeNB INTEGER ::= 256
+ maxnoofCellsinUEHistoryInfo INTEGER ::= 16
+ maxnoofCellsUEMovingTrajectory INTEGER ::= 16
+ maxnoofDRBs INTEGER ::= 32
+ maxnoofEmergencyAreaID INTEGER ::= 65535
+ maxnoofEAIforRestart INTEGER ::= 256
+ maxnoofEPLMNs INTEGER ::= 15
+ maxnoofEPLMNsPlusOne INTEGER ::= 16
+ maxnoofE-RABs INTEGER ::= 256
+ maxnoofErrors INTEGER ::= 256
+ maxnoofForbTACs INTEGER ::= 4096
+ maxnoofMultiConnectivity INTEGER ::= 4
+ maxnoofMultiConnectivityMinusOne INTEGER ::= 3
+ maxnoofNGConnectionsToReset INTEGER ::= 65536
+ maxnoofPDUSessions INTEGER ::= 256
+ maxnoofPLMNs INTEGER ::= 12
+ maxnoofQosFlows INTEGER ::= 64
+ maxnoofRANNodeinAoI INTEGER ::= 64
+ maxnoofRecommendedCells INTEGER ::= 16
+ maxnoofRecommendedRANNodes INTEGER ::= 16
+ maxnoofAoI INTEGER ::= 64
+ maxnoofServedGUAMIs INTEGER ::= 256
+ maxnoofSliceItems INTEGER ::= 1024
+ maxnoofTACs INTEGER ::= 256
+ maxnoofTAIforInactive INTEGER ::= 16
+ maxnoofTAIforPaging INTEGER ::= 16
+ maxnoofTAIforRestart INTEGER ::= 2048
+ maxnoofTAIforWarning INTEGER ::= 65535
+ maxnoofTAIinAoI INTEGER ::= 16
+ maxnoofTimePeriods INTEGER ::= 2
+ maxnoofTNLAssociations INTEGER ::= 32
+ maxnoofXnExtTLAs INTEGER ::= 16
+ maxnoofXnGTP-TLAs INTEGER ::= 16
+ maxnoofXnTLAs INTEGER ::= 2
+
+-- **************************************************************
+--
+-- IEs
+--
+-- **************************************************************
+
+ id-AllowedNSSAI ProtocolIE-ID ::= 0
+ id-AMFName ProtocolIE-ID ::= 1
+ id-AMFOverloadResponse ProtocolIE-ID ::= 2
+ id-AMFSetID ProtocolIE-ID ::= 3
+ id-AMF-TNLAssociationFailedToSetupList ProtocolIE-ID ::= 4
+ id-AMF-TNLAssociationSetupList ProtocolIE-ID ::= 5
+ id-AMF-TNLAssociationToAddList ProtocolIE-ID ::= 6
+ id-AMF-TNLAssociationToRemoveList ProtocolIE-ID ::= 7
+ id-AMF-TNLAssociationToUpdateList ProtocolIE-ID ::= 8
+ id-AMFTrafficLoadReductionIndication ProtocolIE-ID ::= 9
+ id-AMF-UE-NGAP-ID ProtocolIE-ID ::= 10
+ id-AssistanceDataForPaging ProtocolIE-ID ::= 11
+ id-BroadcastCancelledAreaList ProtocolIE-ID ::= 12
+ id-BroadcastCompletedAreaList ProtocolIE-ID ::= 13
+ id-CancelAllWarningMessages ProtocolIE-ID ::= 14
+ id-Cause ProtocolIE-ID ::= 15
+ id-CellIDListForRestart ProtocolIE-ID ::= 16
+ id-ConcurrentWarningMessageInd ProtocolIE-ID ::= 17
+ id-CoreNetworkAssistanceInformationForInactive ProtocolIE-ID ::= 18
+ id-CriticalityDiagnostics ProtocolIE-ID ::= 19
+ id-DataCodingScheme ProtocolIE-ID ::= 20
+ id-DefaultPagingDRX ProtocolIE-ID ::= 21
+ id-DirectForwardingPathAvailability ProtocolIE-ID ::= 22
+ id-EmergencyAreaIDListForRestart ProtocolIE-ID ::= 23
+ id-EmergencyFallbackIndicator ProtocolIE-ID ::= 24
+ id-EUTRA-CGI ProtocolIE-ID ::= 25
+ id-FiveG-S-TMSI ProtocolIE-ID ::= 26
+ id-GlobalRANNodeID ProtocolIE-ID ::= 27
+ id-GUAMI ProtocolIE-ID ::= 28
+ id-HandoverType ProtocolIE-ID ::= 29
+ id-IMSVoiceSupportIndicator ProtocolIE-ID ::= 30
+ id-IndexToRFSP ProtocolIE-ID ::= 31
+ id-InfoOnRecommendedCellsAndRANNodesForPaging ProtocolIE-ID ::= 32
+ id-LocationReportingRequestType ProtocolIE-ID ::= 33
+ id-MaskedIMEISV ProtocolIE-ID ::= 34
+ id-MessageIdentifier ProtocolIE-ID ::= 35
+ id-MobilityRestrictionList ProtocolIE-ID ::= 36
+ id-NASC ProtocolIE-ID ::= 37
+ id-NAS-PDU ProtocolIE-ID ::= 38
+ id-NASSecurityParametersFromNGRAN ProtocolIE-ID ::= 39
+ id-NewAMF-UE-NGAP-ID ProtocolIE-ID ::= 40
+ id-NewSecurityContextInd ProtocolIE-ID ::= 41
+ id-NGAP-Message ProtocolIE-ID ::= 42
+ id-NGRAN-CGI ProtocolIE-ID ::= 43
+ id-NGRANTraceID ProtocolIE-ID ::= 44
+ id-NR-CGI ProtocolIE-ID ::= 45
+ id-NRPPa-PDU ProtocolIE-ID ::= 46
+ id-NumberOfBroadcastsRequested ProtocolIE-ID ::= 47
+ id-OldAMF ProtocolIE-ID ::= 48
+ id-OverloadStartNSSAIList ProtocolIE-ID ::= 49
+ id-PagingDRX ProtocolIE-ID ::= 50
+ id-PagingOrigin ProtocolIE-ID ::= 51
+ id-PagingPriority ProtocolIE-ID ::= 52
+ id-PDUSessionResourceAdmittedList ProtocolIE-ID ::= 53
+ id-PDUSessionResourceFailedToModifyListModRes ProtocolIE-ID ::= 54
+ id-PDUSessionResourceFailedToSetupListCxtRes ProtocolIE-ID ::= 55
+ id-PDUSessionResourceFailedToSetupListHOAck ProtocolIE-ID ::= 56
+ id-PDUSessionResourceFailedToSetupListPSReq ProtocolIE-ID ::= 57
+ id-PDUSessionResourceFailedToSetupListSURes ProtocolIE-ID ::= 58
+ id-PDUSessionResourceHandoverList ProtocolIE-ID ::= 59
+ id-PDUSessionResourceListCxtRelCpl ProtocolIE-ID ::= 60
+ id-PDUSessionResourceListHORqd ProtocolIE-ID ::= 61
+ id-PDUSessionResourceModifyListModCfm ProtocolIE-ID ::= 62
+ id-PDUSessionResourceModifyListModInd ProtocolIE-ID ::= 63
+ id-PDUSessionResourceModifyListModReq ProtocolIE-ID ::= 64
+ id-PDUSessionResourceModifyListModRes ProtocolIE-ID ::= 65
+ id-PDUSessionResourceNotifyList ProtocolIE-ID ::= 66
+ id-PDUSessionResourceReleasedListNot ProtocolIE-ID ::= 67
+ id-PDUSessionResourceReleasedListPSAck ProtocolIE-ID ::= 68
+ id-PDUSessionResourceReleasedListPSFail ProtocolIE-ID ::= 69
+ id-PDUSessionResourceReleasedListRelRes ProtocolIE-ID ::= 70
+ id-PDUSessionResourceSetupListCxtReq ProtocolIE-ID ::= 71
+ id-PDUSessionResourceSetupListCxtRes ProtocolIE-ID ::= 72
+ id-PDUSessionResourceSetupListHOReq ProtocolIE-ID ::= 73
+ id-PDUSessionResourceSetupListSUReq ProtocolIE-ID ::= 74
+ id-PDUSessionResourceSetupListSURes ProtocolIE-ID ::= 75
+ id-PDUSessionResourceToBeSwitchedDLList ProtocolIE-ID ::= 76
+ id-PDUSessionResourceSwitchedList ProtocolIE-ID ::= 77
+ id-PDUSessionResourceToReleaseListHOCmd ProtocolIE-ID ::= 78
+ id-PDUSessionResourceToReleaseListRelCmd ProtocolIE-ID ::= 79
+ id-PLMNSupportList ProtocolIE-ID ::= 80
+ id-PWSFailedCellIDList ProtocolIE-ID ::= 81
+ id-RANNodeName ProtocolIE-ID ::= 82
+ id-RANPagingPriority ProtocolIE-ID ::= 83
+ id-RANStatusTransfer-TransparentContainer ProtocolIE-ID ::= 84
+ id-RAN-UE-NGAP-ID ProtocolIE-ID ::= 85
+ id-RelativeAMFCapacity ProtocolIE-ID ::= 86
+ id-RepetitionPeriod ProtocolIE-ID ::= 87
+ id-ResetType ProtocolIE-ID ::= 88
+ id-RoutingID ProtocolIE-ID ::= 89
+ id-RRCEstablishmentCause ProtocolIE-ID ::= 90
+ id-RRCInactiveTransitionReportRequest ProtocolIE-ID ::= 91
+ id-RRCState ProtocolIE-ID ::= 92
+ id-SecurityContext ProtocolIE-ID ::= 93
+ id-SecurityKey ProtocolIE-ID ::= 94
+ id-SerialNumber ProtocolIE-ID ::= 95
+ id-ServedGUAMIList ProtocolIE-ID ::= 96
+ id-SliceSupportList ProtocolIE-ID ::= 97
+ id-SONConfigurationTransferDL ProtocolIE-ID ::= 98
+ id-SONConfigurationTransferUL ProtocolIE-ID ::= 99
+ id-SourceAMF-UE-NGAP-ID ProtocolIE-ID ::= 100
+ id-SourceToTarget-TransparentContainer ProtocolIE-ID ::= 101
+ id-SupportedTAList ProtocolIE-ID ::= 102
+ id-TAIListForPaging ProtocolIE-ID ::= 103
+ id-TAIListForRestart ProtocolIE-ID ::= 104
+ id-TargetID ProtocolIE-ID ::= 105
+ id-TargetToSource-TransparentContainer ProtocolIE-ID ::= 106
+ id-TimeToWait ProtocolIE-ID ::= 107
+ id-TraceActivation ProtocolIE-ID ::= 108
+ id-TraceCollectionEntityIPAddress ProtocolIE-ID ::= 109
+ id-UEAggregateMaximumBitRate ProtocolIE-ID ::= 110
+ id-UE-associatedLogicalNG-connectionList ProtocolIE-ID ::= 111
+ id-UEContextRequest ProtocolIE-ID ::= 112
+ id-UE-NGAP-IDs ProtocolIE-ID ::= 114
+ id-UEPagingIdentity ProtocolIE-ID ::= 115
+ id-UEPresenceInAreaOfInterestList ProtocolIE-ID ::= 116
+ id-UERadioCapability ProtocolIE-ID ::= 117
+ id-UERadioCapabilityForPaging ProtocolIE-ID ::= 118
+ id-UESecurityCapabilities ProtocolIE-ID ::= 119
+ id-UnavailableGUAMIList ProtocolIE-ID ::= 120
+ id-UserLocationInformation ProtocolIE-ID ::= 121
+ id-WarningAreaList ProtocolIE-ID ::= 122
+ id-WarningMessageContents ProtocolIE-ID ::= 123
+ id-WarningSecurityInfo ProtocolIE-ID ::= 124
+ id-WarningType ProtocolIE-ID ::= 125
+ id-AdditionalUL-NGU-UP-TNLInformation ProtocolIE-ID ::= 126
+ id-DataForwardingNotPossible ProtocolIE-ID ::= 127
+ id-DL-NGU-UP-TNLInformation ProtocolIE-ID ::= 128
+ id-NetworkInstance ProtocolIE-ID ::= 129
+ id-PDUSessionAggregateMaximumBitRate ProtocolIE-ID ::= 130
+ id-PDUSessionResourceFailedToModifyListModCfm ProtocolIE-ID ::= 131
+ id-PDUSessionResourceFailedToSetupListCxtFail ProtocolIE-ID ::= 132
+ id-PDUSessionResourceListCxtRelReq ProtocolIE-ID ::= 133
+ id-PDUSessionType ProtocolIE-ID ::= 134
+ id-QosFlowAddOrModifyRequestList ProtocolIE-ID ::= 135
+ id-QosFlowSetupRequestList ProtocolIE-ID ::= 136
+ id-QosFlowToReleaseList ProtocolIE-ID ::= 137
+ id-SecurityIndication ProtocolIE-ID ::= 138
+ id-UL-NGU-UP-TNLInformation ProtocolIE-ID ::= 139
+ id-UL-NGU-UP-TNLModifyList ProtocolIE-ID ::= 140
+ id-WarningAreaCoordinates ProtocolIE-ID ::= 141
+ id-PDUSessionResourceSecondaryRATUsageList ProtocolIE-ID ::= 142
+ id-HandoverFlag ProtocolIE-ID ::= 143
+ id-SecondaryRATUsageInformation ProtocolIE-ID ::= 144
+ id-PDUSessionResourceReleaseResponseTransfer ProtocolIE-ID ::= 145
+ id-RedirectionVoiceFallback ProtocolIE-ID ::= 146
+ id-UERetentionInformation ProtocolIE-ID ::= 147
+ id-S-NSSAI ProtocolIE-ID ::= 148
+ id-PSCellInformation ProtocolIE-ID ::= 149
+ id-LastEUTRAN-PLMNIdentity ProtocolIE-ID ::= 150
+ id-MaximumIntegrityProtectedDataRate-DL ProtocolIE-ID ::= 151
+ id-AdditionalDLForwardingUPTNLInformation ProtocolIE-ID ::= 152
+ id-AdditionalDLUPTNLInformationForHOList ProtocolIE-ID ::= 153
+ id-AdditionalNGU-UP-TNLInformation ProtocolIE-ID ::= 154
+ id-AdditionalDLQosFlowPerTNLInformation ProtocolIE-ID ::= 155
+ id-SecurityResult ProtocolIE-ID ::= 156
+ id-ENDC-SONConfigurationTransferDL ProtocolIE-ID ::= 157
+ id-ENDC-SONConfigurationTransferUL ProtocolIE-ID ::= 158
+ id-OldAssociatedQosFlowList-ULendmarkerexpected ProtocolIE-ID ::= 159
+ id-CNTypeRestrictionsForEquivalent ProtocolIE-ID ::= 160
+ id-CNTypeRestrictionsForServing ProtocolIE-ID ::= 161
+ id-NewGUAMI ProtocolIE-ID ::= 162
+ id-ULForwarding ProtocolIE-ID ::= 163
+ id-ULForwardingUP-TNLInformation ProtocolIE-ID ::= 164
+ id-CNAssistedRANTuning ProtocolIE-ID ::= 165
+ id-CommonNetworkInstance ProtocolIE-ID ::= 166
+ id-NGRAN-TNLAssociationToRemoveList ProtocolIE-ID ::= 167
+ id-TNLAssociationTransportLayerAddressNGRAN ProtocolIE-ID ::= 168
+ id-EndpointIPAddressAndPort ProtocolIE-ID ::= 169
+ id-LocationReportingAdditionalInfo ProtocolIE-ID ::= 170
+ id-SourceToTarget-AMFInformationReroute ProtocolIE-ID ::= 171
+ id-AdditionalULForwardingUPTNLInformation ProtocolIE-ID ::= 172
+ id-SCTP-TLAs ProtocolIE-ID ::= 173
+ id-SelectedPLMNIdentity ProtocolIE-ID ::= 174
+
+
+END
+-- ASN1STOP
+
+-- ASN1START
+-- **************************************************************
+--
+-- Container definitions
+--
+-- **************************************************************
+
+NGAP-Containers {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0)
+ngran-Access (22) modules (3) ngap (1) version1 (1) ngap-Containers (5) }
+
+DEFINITIONS AUTOMATIC TAGS ::=
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+
+ Criticality,
+ Presence,
+ PrivateIE-ID,
+ ProtocolExtensionID,
+ ProtocolIE-ID
+FROM NGAP-CommonDataTypes
+
+ maxPrivateIEs,
+ maxProtocolExtensions,
+ maxProtocolIEs
+FROM NGAP-Constants;
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+NGAP-PROTOCOL-IES ::= CLASS {
+ &id ProtocolIE-ID UNIQUE,
+ &criticality Criticality,
+ &Value,
+ &presence Presence
+}
+WITH SYNTAX {
+ ID &id
+ CRITICALITY &criticality
+ TYPE &Value
+ PRESENCE &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+NGAP-PROTOCOL-IES-PAIR ::= CLASS {
+ &id ProtocolIE-ID UNIQUE,
+ &firstCriticality Criticality,
+ &FirstValue,
+ &secondCriticality Criticality,
+ &SecondValue,
+ &presence Presence
+}
+WITH SYNTAX {
+ ID &id
+ FIRST CRITICALITY &firstCriticality
+ FIRST TYPE &FirstValue
+ SECOND CRITICALITY &secondCriticality
+ SECOND TYPE &SecondValue
+ PRESENCE &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol Extensions
+--
+-- **************************************************************
+
+NGAP-PROTOCOL-EXTENSION ::= CLASS {
+ &id ProtocolExtensionID UNIQUE,
+ &criticality Criticality,
+ &Extension,
+ &presence Presence
+}
+WITH SYNTAX {
+ ID &id
+ CRITICALITY &criticality
+ EXTENSION &Extension
+ PRESENCE &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Private IEs
+--
+-- **************************************************************
+
+NGAP-PRIVATE-IES ::= CLASS {
+ &id PrivateIE-ID,
+ &criticality Criticality,
+ &Value,
+ &presence Presence
+}
+WITH SYNTAX {
+ ID &id
+ CRITICALITY &criticality
+ TYPE &Value
+ PRESENCE &presence
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IEs
+--
+-- **************************************************************
+
+ProtocolIE-Container {NGAP-PROTOCOL-IES : IEsSetParam} ::=
+ SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+ ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-SingleContainer {NGAP-PROTOCOL-IES : IEsSetParam} ::=
+ ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-Field {NGAP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE {
+ id NGAP-PROTOCOL-IES.&id ({IEsSetParam}),
+ criticality NGAP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}),
+ value NGAP-PROTOCOL-IES.&Value ({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IE Pairs
+--
+-- **************************************************************
+
+ProtocolIE-ContainerPair {NGAP-PROTOCOL-IES-PAIR : IEsSetParam} ::=
+ SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+ ProtocolIE-FieldPair {{IEsSetParam}}
+
+ProtocolIE-FieldPair {NGAP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE {
+ id NGAP-PROTOCOL-IES-PAIR.&id ({IEsSetParam}),
+ firstCriticality NGAP-PROTOCOL-IES-PAIR.&firstCriticality ({IEsSetParam}{@id}),
+ firstValue NGAP-PROTOCOL-IES-PAIR.&FirstValue ({IEsSetParam}{@id}),
+ secondCriticality NGAP-PROTOCOL-IES-PAIR.&secondCriticality ({IEsSetParam}{@id}),
+ secondValue NGAP-PROTOCOL-IES-PAIR.&SecondValue ({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container Lists for Protocol IE Containers
+--
+-- **************************************************************
+
+ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, NGAP-PROTOCOL-IES : IEsSetParam} ::=
+ SEQUENCE (SIZE (lowerBound..upperBound)) OF
+ ProtocolIE-SingleContainer {{IEsSetParam}}
+
+ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, NGAP-PROTOCOL-IES-PAIR : IEsSetParam} ::=
+ SEQUENCE (SIZE (lowerBound..upperBound)) OF
+ ProtocolIE-ContainerPair {{IEsSetParam}}
+
+-- **************************************************************
+--
+-- Container for Protocol Extensions
+--
+-- **************************************************************
+
+ProtocolExtensionContainer {NGAP-PROTOCOL-EXTENSION : ExtensionSetParam} ::=
+ SEQUENCE (SIZE (1..maxProtocolExtensions)) OF
+ ProtocolExtensionField {{ExtensionSetParam}}
+
+ProtocolExtensionField {NGAP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE {
+ id NGAP-PROTOCOL-EXTENSION.&id ({ExtensionSetParam}),
+ criticality NGAP-PROTOCOL-EXTENSION.&criticality ({ExtensionSetParam}{@id}),
+ extensionValue NGAP-PROTOCOL-EXTENSION.&Extension ({ExtensionSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Private IEs
+--
+-- **************************************************************
+
+PrivateIE-Container {NGAP-PRIVATE-IES : IEsSetParam } ::=
+ SEQUENCE (SIZE (1..maxPrivateIEs)) OF
+ PrivateIE-Field {{IEsSetParam}}
+
+PrivateIE-Field {NGAP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE {
+ id NGAP-PRIVATE-IES.&id ({IEsSetParam}),
+ criticality NGAP-PRIVATE-IES.&criticality ({IEsSetParam}{@id}),
+ value NGAP-PRIVATE-IES.&Value ({IEsSetParam}{@id})
+}
+
+END
+-- ASN1STOP
\ No newline at end of file
diff --git a/openair3/NGAP/ngap_common.c b/openair3/NGAP/ngap_common.c
new file mode 100644
index 0000000000..53b04e09eb
--- /dev/null
+++ b/openair3/NGAP/ngap_common.c
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/*! \file ngap_common.c
+ * \brief ngap procedures for both gNB and AMF
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+
+#include "ngap_common.h"
+#include "NGAP_NGAP-PDU.h"
+
+
+int asn1_xer_print = 0;
+
+
+void ngap_handle_criticality(NGAP_Criticality_t criticality)
+{
+}
diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h
new file mode 100644
index 0000000000..f0302a88c7
--- /dev/null
+++ b/openair3/NGAP/ngap_common.h
@@ -0,0 +1,163 @@
+/*
+ * 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 ngap_common.h
+ * \brief ngap procedures for both gNB and AMF
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+/** @defgroup _ngap_impl_ NGAP Layer Reference Implementation
+ * @ingroup _ref_implementation_
+ * @{
+ */
+
+
+#if HAVE_CONFIG_H_
+# include "config.h"
+#endif
+
+#ifndef NGAP_COMMON_H_
+#define NGAP_COMMON_H_
+
+
+#include "common/utils/LOG/log.h"
+/* replace ASN_DEBUG defined in asn_internal.h by oai tracing system
+ Would be cleaner to modify asn_internal.h but it seems to come
+ from non oai source, with BSD license, so prefer to do that here..
+*/
+#ifdef ASN_DEBUG
+# undef ASN_DEBUG
+#endif
+#define ASN_DEBUG( x... ) LOG_I(ASN, x)
+
+#include "NGAP_ProtocolIE-Field.h"
+#include "NGAP_NGAP-PDU.h"
+#include "NGAP_InitiatingMessage.h"
+#include "NGAP_SuccessfulOutcome.h"
+#include "NGAP_UnsuccessfulOutcome.h"
+#include "NGAP_ProtocolIE-Field.h"
+#include "NGAP_ProtocolIE-FieldPair.h"
+#include "NGAP_ProtocolIE-ContainerPair.h"
+#include "NGAP_ProtocolExtensionField.h"
+#include "NGAP_ProtocolExtensionContainer.h"
+#include "NGAP_asn_constant.h"
+#include "NGAP_SupportedTAItem.h"
+#include "NGAP_ServedGUAMIItem.h"
+#include "NGAP_BroadcastPLMNItem.h"
+#include "NGAP_SliceSupportItem.h"
+#include "NGAP_PLMNSupportItem.h"
+#include "NGAP_PDUSessionResourceSetupResponseTransfer.h"
+#include "NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h"
+#include "NGAP_PDUSessionResourceSetupItemCxtRes.h"
+#include "NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h"
+#include "NGAP_PDUSessionResourceSetupItemSUReq.h"
+#include "NGAP_PDUSessionResourceSetupItemSURes.h"
+#include "NGAP_PDUSessionResourceFailedToSetupItemSURes.h"
+#include "NGAP_AssociatedQosFlowItem.h"
+#include "NGAP_PDUSessionResourceSetupRequestTransfer.h"
+#include "NGAP_PDUSessionResourceSetupItemCxtReq.h"
+#include "NGAP_QosFlowSetupRequestItem.h"
+#include "NGAP_AllowedNSSAI-Item.h"
+#include "NGAP_PDUSessionResourceModifyItemModRes.h"
+#include "NGAP_PDUSessionResourceFailedToModifyItemModRes.h"
+#include "NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h"
+#include "NGAP_PDUSessionResourceReleasedItemRelRes.h"
+#include "NGAP_PDUSessionResourceToReleaseItemRelCmd.h"
+#include "NGAP_PDUSessionResourceModifyItemModReq.h"
+#include "NGAP_PDUSessionResourceModifyRequestTransfer.h"
+#include "NGAP_QosFlowAddOrModifyRequestItem.h"
+#include "NGAP_TAIListForPagingItem.h"
+#include "NGAP_GNB-ID.h"
+#include "NGAP_GlobalGNB-ID.h"
+#include "NGAP_GTPTunnel.h"
+#include "NGAP_UE-NGAP-ID-pair.h"
+#include "NGAP_UserLocationInformationNR.h"
+
+/* Checking version of ASN1C compiler */
+#if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION)
+# error "You are compiling ngap with the wrong version of ASN1C"
+#endif
+
+#ifndef FALSE
+# define FALSE (0)
+#endif
+#ifndef TRUE
+# define TRUE (!FALSE)
+#endif
+
+#define NGAP_UE_ID_FMT "0x%06"PRIX32
+
+extern int asn_debug;
+extern int asn1_xer_print;
+
+#if defined(ENB_MODE)
+# include "common/utils/LOG/log.h"
+# include "ngap_gNB_default_values.h"
+# define NGAP_ERROR(x, args...) LOG_E(NGAP, x, ##args)
+# define NGAP_WARN(x, args...) LOG_W(NGAP, x, ##args)
+# define NGAP_TRAF(x, args...) LOG_I(NGAP, x, ##args)
+# define NGAP_INFO(x, args...) LOG_I(NGAP, x, ##args)
+# define NGAP_DEBUG(x, args...) LOG_I(NGAP, x, ##args)
+#else
+# include "amf_default_values.h"
+# define NGAP_ERROR(x, args...) do { fprintf(stdout, "[NGAP][E]"x, ##args); } while(0)
+# define NGAP_WARN(x, args...) do { fprintf(stdout, "[NGAP][W]"x, ##args); } while(0)
+# define NGAP_TRAF(x, args...) do { fprintf(stdout, "[NGAP][T]"x, ##args); } while(0)
+# define NGAP_INFO(x, args...) do { fprintf(stdout, "[NGAP][I]"x, ##args); } while(0)
+# define NGAP_DEBUG(x, args...) do { fprintf(stdout, "[NGAP][D]"x, ##args); } while(0)
+#endif
+
+
+#define NGAP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
+ do {\
+ IE_TYPE **ptr; \
+ ie = NULL; \
+ for (ptr = container->protocolIEs.list.array; \
+ ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
+ ptr++) { \
+ if((*ptr)->id == IE_ID) { \
+ ie = *ptr; \
+ break; \
+ } \
+ } \
+ if (ie == NULL ) { \
+ NGAP_ERROR("NGAP_FIND_PROTOCOLIE_BY_ID: %s %d: ie is NULL\n",__FILE__,__LINE__);\
+ } \
+ if (mandatory) DevAssert(ie != NULL); \
+ } while(0)
+/** \brief Function callback prototype.
+ **/
+typedef int (*ngap_message_decoded_callback)(
+ uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu
+);
+
+/** \brief Handle criticality
+ \param criticality Criticality of the IE
+ @returns void
+ **/
+void ngap_handle_criticality(NGAP_Criticality_t criticality);
+
+#endif /* NGAP_COMMON_H_ */
diff --git a/openair3/NGAP/ngap_gNB.c b/openair3/NGAP/ngap_gNB.c
new file mode 100644
index 0000000000..924f28c87f
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB.c
@@ -0,0 +1,534 @@
+/*
+ * 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 ngap_gNB.c
+ * \brief NGAP gNB task
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+
+#include
+#include
+#include
+#include
+#include
+
+#include "tree.h"
+#include "queue.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_gNB_default_values.h"
+
+#include "ngap_common.h"
+
+#include "ngap_gNB_defs.h"
+#include "ngap_gNB.h"
+#include "ngap_gNB_encoder.h"
+#include "ngap_gNB_handlers.h"
+#include "ngap_gNB_nnsf.h"
+
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_management_procedures.h"
+#include "ngap_gNB_context_management_procedures.h"
+
+#include "ngap_gNB_itti_messaging.h"
+
+#include "ngap_gNB_ue_context.h" // test, to be removed
+#include "msc.h"
+
+#include "assertions.h"
+#include "conversions.h"
+
+ngap_gNB_config_t ngap_config;
+
+static int ngap_gNB_generate_ng_setup_request(
+ ngap_gNB_instance_t *instance_p, ngap_gNB_amf_data_t *ngap_amf_data_p);
+
+void ngap_gNB_handle_register_gNB(instance_t instance, ngap_register_gnb_req_t *ngap_register_gNB);
+
+void ngap_gNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
+
+uint32_t ngap_generate_gNB_id(void) {
+ char *out;
+ char hostname[50];
+ int ret;
+ uint32_t gNB_id;
+ /* Retrieve the host name */
+ ret = gethostname(hostname, sizeof(hostname));
+ DevAssert(ret == 0);
+ out = crypt(hostname, "eurecom");
+ DevAssert(out != NULL);
+ gNB_id = ((out[0] << 24) | (out[1] << 16) | (out[2] << 8) | out[3]);
+ return gNB_id;
+}
+
+static void ngap_gNB_register_amf(ngap_gNB_instance_t *instance_p,
+ net_ip_address_t *amf_ip_address,
+ net_ip_address_t *local_ip_addr,
+ uint16_t in_streams,
+ uint16_t out_streams,
+ uint8_t broadcast_plmn_num,
+ uint8_t broadcast_plmn_index[PLMN_LIST_MAX_SIZE]) {
+ MessageDef *message_p = NULL;
+ sctp_new_association_req_t *sctp_new_association_req_p = NULL;
+ ngap_gNB_amf_data_t *ngap_amf_data_p = NULL;
+ DevAssert(instance_p != NULL);
+ DevAssert(amf_ip_address != NULL);
+ message_p = itti_alloc_new_message(TASK_NGAP, SCTP_NEW_ASSOCIATION_REQ);
+ sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req;
+ sctp_new_association_req_p->port = NGAP_PORT_NUMBER;
+ sctp_new_association_req_p->ppid = NGAP_SCTP_PPID;
+ sctp_new_association_req_p->in_streams = in_streams;
+ sctp_new_association_req_p->out_streams = out_streams;
+ memcpy(&sctp_new_association_req_p->remote_address,
+ amf_ip_address,
+ sizeof(*amf_ip_address));
+ memcpy(&sctp_new_association_req_p->local_address,
+ local_ip_addr,
+ sizeof(*local_ip_addr));
+ NGAP_INFO("[gNB %d] check the amf registration state\n",instance_p->instance);
+
+ /* Create new AMF descriptor */
+ ngap_amf_data_p = calloc(1, sizeof(*ngap_amf_data_p));
+ DevAssert(ngap_amf_data_p != NULL);
+ ngap_amf_data_p->cnx_id = ngap_gNB_fetch_add_global_cnx_id();
+ sctp_new_association_req_p->ulp_cnx_id = ngap_amf_data_p->cnx_id;
+ ngap_amf_data_p->assoc_id = -1;
+ ngap_amf_data_p->broadcast_plmn_num = broadcast_plmn_num;
+ memcpy(&ngap_amf_data_p->amf_s1_ip,
+ amf_ip_address,
+ sizeof(*amf_ip_address));
+ for (int i = 0; i < broadcast_plmn_num; ++i)
+ ngap_amf_data_p->broadcast_plmn_index[i] = broadcast_plmn_index[i];
+
+ ngap_amf_data_p->ngap_gNB_instance = instance_p;
+ STAILQ_INIT(&ngap_amf_data_p->served_guami);
+ /* Insert the new descriptor in list of known AMF
+ * but not yet associated.
+ */
+ RB_INSERT(ngap_amf_map, &instance_p->ngap_amf_head, ngap_amf_data_p);
+ ngap_amf_data_p->state = NGAP_GNB_STATE_WAITING;
+ instance_p->ngap_amf_nb ++;
+ instance_p->ngap_amf_pending_nb ++;
+
+ itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p);
+}
+
+
+void ngap_gNB_handle_register_gNB(instance_t instance, ngap_register_gnb_req_t *ngap_register_gNB) {
+ ngap_gNB_instance_t *new_instance;
+ uint8_t index;
+ DevAssert(ngap_register_gNB != NULL);
+ /* Look if the provided instance already exists */
+ new_instance = ngap_gNB_get_instance(instance);
+
+ if (new_instance != NULL) {
+ /* Checks if it is a retry on the same gNB */
+ DevCheck(new_instance->gNB_id == ngap_register_gNB->gNB_id, new_instance->gNB_id, ngap_register_gNB->gNB_id, 0);
+ DevCheck(new_instance->cell_type == ngap_register_gNB->cell_type, new_instance->cell_type, ngap_register_gNB->cell_type, 0);
+ DevCheck(new_instance->num_plmn == ngap_register_gNB->num_plmn, new_instance->num_plmn, ngap_register_gNB->num_plmn, 0);
+ DevCheck(new_instance->tac == ngap_register_gNB->tac, new_instance->tac, ngap_register_gNB->tac, 0);
+
+ for (int i = 0; i < new_instance->num_plmn; i++) {
+ DevCheck(new_instance->mcc[i] == ngap_register_gNB->mcc[i], new_instance->mcc[i], ngap_register_gNB->mcc[i], 0);
+ DevCheck(new_instance->mnc[i] == ngap_register_gNB->mnc[i], new_instance->mnc[i], ngap_register_gNB->mnc[i], 0);
+ DevCheck(new_instance->mnc_digit_length[i] == ngap_register_gNB->mnc_digit_length[i], new_instance->mnc_digit_length[i], ngap_register_gNB->mnc_digit_length[i], 0);
+ }
+
+ DevCheck(new_instance->default_drx == ngap_register_gNB->default_drx, new_instance->default_drx, ngap_register_gNB->default_drx, 0);
+ } else {
+ new_instance = calloc(1, sizeof(ngap_gNB_instance_t));
+ DevAssert(new_instance != NULL);
+ RB_INIT(&new_instance->ngap_ue_head);
+ RB_INIT(&new_instance->ngap_amf_head);
+ /* Copy usefull parameters */
+ new_instance->instance = instance;
+ new_instance->gNB_name = ngap_register_gNB->gNB_name;
+ new_instance->gNB_id = ngap_register_gNB->gNB_id;
+ new_instance->cell_type = ngap_register_gNB->cell_type;
+ new_instance->tac = ngap_register_gNB->tac;
+
+ memcpy(&new_instance->gNB_ng_ip,
+ &ngap_register_gNB->gnb_ip_address,
+ sizeof(ngap_register_gNB->gnb_ip_address));
+
+ for (int i = 0; i < ngap_register_gNB->num_plmn; i++) {
+ new_instance->mcc[i] = ngap_register_gNB->mcc[i];
+ new_instance->mnc[i] = ngap_register_gNB->mnc[i];
+ new_instance->mnc_digit_length[i] = ngap_register_gNB->mnc_digit_length[i];
+
+ new_instance->num_nssai[i] = ngap_register_gNB->num_nssai[i];
+ }
+
+ new_instance->num_plmn = ngap_register_gNB->num_plmn;
+ new_instance->default_drx = ngap_register_gNB->default_drx;
+
+ memcpy(new_instance->s_nssai, ngap_register_gNB->s_nssai, sizeof(ngap_register_gNB->s_nssai));
+
+ /* Add the new instance to the list of gNB (meaningfull in virtual mode) */
+ ngap_gNB_insert_new_instance(new_instance);
+ NGAP_INFO("Registered new gNB[%d] and %s gNB id %u\n",
+ instance,
+ ngap_register_gNB->cell_type == CELL_MACRO_GNB ? "macro" : "home",
+ ngap_register_gNB->gNB_id);
+ }
+
+ DevCheck(ngap_register_gNB->nb_amf <= NGAP_MAX_NB_AMF_IP_ADDRESS,
+ NGAP_MAX_NB_AMF_IP_ADDRESS, ngap_register_gNB->nb_amf, 0);
+
+ /* Trying to connect to provided list of AMF ip address */
+ for (index = 0; index < ngap_register_gNB->nb_amf; index++) {
+ net_ip_address_t *amf_ip = &ngap_register_gNB->amf_ip_address[index];
+ struct ngap_gNB_amf_data_s *amf = NULL;
+ RB_FOREACH(amf, ngap_amf_map, &new_instance->ngap_amf_head) {
+ /* Compare whether IPv4 and IPv6 information is already present, in which
+ * wase we do not register again */
+ if (amf->amf_s1_ip.ipv4 == amf_ip->ipv4 && (!amf_ip->ipv4
+ || strncmp(amf->amf_s1_ip.ipv4_address, amf_ip->ipv4_address, 16) == 0)
+ && amf->amf_s1_ip.ipv6 == amf_ip->ipv6 && (!amf_ip->ipv6
+ || strncmp(amf->amf_s1_ip.ipv6_address, amf_ip->ipv6_address, 46) == 0))
+ break;
+ }
+ if (amf)
+ continue;
+ ngap_gNB_register_amf(new_instance,
+ amf_ip,
+ &ngap_register_gNB->gnb_ip_address,
+ ngap_register_gNB->sctp_in_streams,
+ ngap_register_gNB->sctp_out_streams,
+ ngap_register_gNB->broadcast_plmn_num[index],
+ ngap_register_gNB->broadcast_plmn_index[index]);
+ }
+}
+
+void ngap_gNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) {
+ ngap_gNB_instance_t *instance_p;
+ ngap_gNB_amf_data_t *ngap_amf_data_p;
+ DevAssert(sctp_new_association_resp != NULL);
+ instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(instance_p != NULL);
+ ngap_amf_data_p = ngap_gNB_get_AMF(instance_p, -1,
+ sctp_new_association_resp->ulp_cnx_id);
+ DevAssert(ngap_amf_data_p != NULL);
+
+ if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
+ NGAP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n",
+ sctp_new_association_resp->sctp_state,
+ instance,
+ sctp_new_association_resp->ulp_cnx_id);
+ ngap_handle_ng_setup_message(ngap_amf_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
+ return;
+ }
+
+ /* Update parameters */
+ ngap_amf_data_p->assoc_id = sctp_new_association_resp->assoc_id;
+ ngap_amf_data_p->in_streams = sctp_new_association_resp->in_streams;
+ ngap_amf_data_p->out_streams = sctp_new_association_resp->out_streams;
+ /* Prepare new NG Setup Request */
+ ngap_gNB_generate_ng_setup_request(instance_p, ngap_amf_data_p);
+}
+
+static
+void ngap_gNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) {
+ int result;
+ DevAssert(sctp_data_ind != NULL);
+
+ ngap_gNB_handle_message(sctp_data_ind->assoc_id, sctp_data_ind->stream,
+ sctp_data_ind->buffer, sctp_data_ind->buffer_length);
+
+ result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+}
+
+void ngap_gNB_init(void) {
+ NGAP_DEBUG("Starting NGAP layer\n");
+ ngap_gNB_prepare_internal_data();
+ itti_mark_task_ready(TASK_NGAP);
+ MSC_START_USE();
+}
+
+void *ngap_gNB_process_itti_msg(void *notUsed) {
+ MessageDef *received_msg = NULL;
+ int result;
+ itti_receive_msg(TASK_NGAP, &received_msg);
+
+ switch (ITTI_MSG_ID(received_msg)) {
+ case TERMINATE_MESSAGE:
+ NGAP_WARN(" *** Exiting NGAP thread\n");
+ itti_exit_task();
+ break;
+
+ case NGAP_REGISTER_GNB_REQ: {
+ /* Register a new gNB.
+ * in Virtual mode gNBs will be distinguished using the mod_id/
+ * Each gNB has to send an NGAP_REGISTER_GNB message with its
+ * own parameters.
+ */
+ ngap_gNB_handle_register_gNB(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_REGISTER_GNB_REQ(received_msg));
+ }
+ break;
+
+ case SCTP_NEW_ASSOCIATION_RESP: {
+ ngap_gNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &received_msg->ittiMsg.sctp_new_association_resp);
+ }
+ break;
+
+ case SCTP_DATA_IND: {
+ ngap_gNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind);
+ }
+ break;
+
+ case NGAP_NAS_FIRST_REQ: {
+ ngap_gNB_handle_nas_first_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_NAS_FIRST_REQ(received_msg));
+ }
+ break;
+
+ case NGAP_UPLINK_NAS: {
+ ngap_gNB_nas_uplink(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_UPLINK_NAS(received_msg));
+ }
+ break;
+
+ case NGAP_UE_CAPABILITIES_IND: {
+ ngap_gNB_ue_capabilities(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_UE_CAPABILITIES_IND(received_msg));
+ }
+ break;
+
+ case NGAP_INITIAL_CONTEXT_SETUP_RESP: {
+ ngap_gNB_initial_ctxt_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_INITIAL_CONTEXT_SETUP_RESP(received_msg));
+ }
+ break;
+
+ case NGAP_PDUSESSION_SETUP_RESP: {
+ ngap_gNB_pdusession_setup_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_PDUSESSION_SETUP_RESP(received_msg));
+ }
+ break;
+
+ case NGAP_PDUSESSION_MODIFY_RESP: {
+ ngap_gNB_pdusession_modify_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_PDUSESSION_MODIFY_RESP(received_msg));
+ }
+ break;
+
+ case NGAP_NAS_NON_DELIVERY_IND: {
+ ngap_gNB_nas_non_delivery_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_NAS_NON_DELIVERY_IND(received_msg));
+ }
+ break;
+
+ case NGAP_PATH_SWITCH_REQ: {
+ ngap_gNB_path_switch_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_PATH_SWITCH_REQ(received_msg));
+ }
+ break;
+
+ case NGAP_PDUSESSION_MODIFICATION_IND: {
+ ngap_gNB_generate_PDUSESSION_Modification_Indication(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_PDUSESSION_MODIFICATION_IND(received_msg));
+ }
+ break;
+
+ case NGAP_UE_CONTEXT_RELEASE_COMPLETE: {
+ ngap_ue_context_release_complete(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_UE_CONTEXT_RELEASE_COMPLETE(received_msg));
+ }
+ break;
+
+ case NGAP_UE_CONTEXT_RELEASE_REQ: {
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL; // test
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL; // test
+ ngap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_UE_CONTEXT_RELEASE_REQ(received_msg));
+ ngap_gNB_instance_p = ngap_gNB_get_instance(ITTI_MESSAGE_GET_INSTANCE(received_msg)); // test
+ DevAssert(ngap_gNB_instance_p != NULL); // test
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ NGAP_UE_CONTEXT_RELEASE_REQ(received_msg).gNB_ue_ngap_id)) == NULL) { // test
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_ERROR("Failed to find ue context associated with gNB ue ngap id: %u\n",
+ NGAP_UE_CONTEXT_RELEASE_REQ(received_msg).gNB_ue_ngap_id); // test
+ } // test
+ }
+ break;
+
+ case NGAP_PDUSESSION_RELEASE_RESPONSE: {
+ ngap_gNB_pdusession_release_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &NGAP_PDUSESSION_RELEASE_RESPONSE(received_msg));
+ }
+ break;
+
+ default:
+ NGAP_ERROR("Received unhandled message: %d:%s\n",
+ ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
+ break;
+ }
+
+ result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+ received_msg = NULL;
+ return NULL;
+}
+
+
+void *ngap_gNB_task(void *arg) {
+ ngap_gNB_init();
+
+ while (1) {
+ (void) ngap_gNB_process_itti_msg(NULL);
+ }
+
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+/*
+* gNB generate a NG setup request towards AMF
+*/
+static int ngap_gNB_generate_ng_setup_request(
+ ngap_gNB_instance_t *instance_p,
+ ngap_gNB_amf_data_t *ngap_amf_data_p)
+//-----------------------------------------------------------------------------
+{
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_NGSetupRequest_t *out = NULL;
+ NGAP_NGSetupRequestIEs_t *ie = NULL;
+ NGAP_SupportedTAItem_t *ta = NULL;
+ NGAP_BroadcastPLMNItem_t *plmn = NULL;
+ NGAP_SliceSupportItem_t *ssi = NULL;
+ uint8_t *buffer = NULL;
+ uint32_t len = 0;
+ int ret = 0;
+ DevAssert(instance_p != NULL);
+ DevAssert(ngap_amf_data_p != NULL);
+ ngap_amf_data_p->state = NGAP_GNB_STATE_WAITING;
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage = CALLOC(1, sizeof(struct NGAP_InitiatingMessage));
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_NGSetup;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_reject;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_NGSetupRequest;
+ out = &pdu.choice.initiatingMessage->value.choice.NGSetupRequest;
+ /* mandatory */
+ ie = (NGAP_NGSetupRequestIEs_t *)calloc(1, sizeof(NGAP_NGSetupRequestIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_GlobalRANNodeID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_NGSetupRequestIEs__value_PR_GlobalRANNodeID;
+ ie->value.choice.GlobalRANNodeID.present = NGAP_GlobalRANNodeID_PR_globalGNB_ID;
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID = CALLOC(1, sizeof(struct NGAP_GlobalGNB_ID));
+ MCC_MNC_TO_PLMNID(instance_p->mcc[ngap_amf_data_p->broadcast_plmn_index[0]],
+ instance_p->mnc[ngap_amf_data_p->broadcast_plmn_index[0]],
+ instance_p->mnc_digit_length[ngap_amf_data_p->broadcast_plmn_index[0]],
+ &(ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->pLMNIdentity));
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.present = NGAP_GNB_ID_PR_gNB_ID;
+ MACRO_GNB_ID_TO_BIT_STRING(instance_p->gNB_id,
+ &ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.choice.gNB_ID);
+ NGAP_INFO("%u -> %02x%02x%02x%02x\n", instance_p->gNB_id,
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.choice.gNB_ID.buf[0],
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.choice.gNB_ID.buf[1],
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.choice.gNB_ID.buf[2],
+ ie->value.choice.GlobalRANNodeID.choice.globalGNB_ID->gNB_ID.choice.gNB_ID.buf[3]);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (instance_p->gNB_name) {
+ ie = (NGAP_NGSetupRequestIEs_t *)calloc(1, sizeof(NGAP_NGSetupRequestIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RANNodeName;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_NGSetupRequestIEs__value_PR_RANNodeName;
+ OCTET_STRING_fromBuf(&ie->value.choice.RANNodeName, instance_p->gNB_name,
+ strlen(instance_p->gNB_name));
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* mandatory */
+ ie = (NGAP_NGSetupRequestIEs_t *)calloc(1, sizeof(NGAP_NGSetupRequestIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_SupportedTAList;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_NGSetupRequestIEs__value_PR_SupportedTAList;
+ {
+ ta = (NGAP_SupportedTAItem_t *)calloc(1, sizeof(NGAP_SupportedTAItem_t));
+ INT24_TO_OCTET_STRING(instance_p->tac, &ta->tAC);
+ {
+ for (int i = 0; i < ngap_amf_data_p->broadcast_plmn_num; ++i) {
+ plmn = (NGAP_BroadcastPLMNItem_t *)calloc(1, sizeof(NGAP_BroadcastPLMNItem_t));
+ MCC_MNC_TO_TBCD(instance_p->mcc[ngap_amf_data_p->broadcast_plmn_index[i]],
+ instance_p->mnc[ngap_amf_data_p->broadcast_plmn_index[i]],
+ instance_p->mnc_digit_length[ngap_amf_data_p->broadcast_plmn_index[i]],
+ &plmn->pLMNIdentity);
+
+ for(int si = 0; si < instance_p->num_nssai[i]; si++) {
+ ssi = (NGAP_SliceSupportItem_t *)calloc(1, sizeof(NGAP_SliceSupportItem_t));
+ INT8_TO_OCTET_STRING(instance_p->s_nssai[i][si].sST, &ssi->s_NSSAI.sST);
+
+ if(instance_p->s_nssai[i]->sD_flag) {
+ ssi->s_NSSAI.sD = calloc(1, sizeof(NGAP_SD_t));
+ ssi->s_NSSAI.sD->buf = calloc(3, sizeof(uint8_t));
+ ssi->s_NSSAI.sD->size = 3;
+ ssi->s_NSSAI.sD->buf[0] = instance_p->s_nssai[i][si].sD[0];
+ ssi->s_NSSAI.sD->buf[1] = instance_p->s_nssai[i][si].sD[1];
+ ssi->s_NSSAI.sD->buf[2] = instance_p->s_nssai[i][si].sD[2];
+ }
+
+
+ ASN_SEQUENCE_ADD(&plmn->tAISliceSupportList.list, ssi);
+ }
+
+ ASN_SEQUENCE_ADD(&ta->broadcastPLMNList.list, plmn);
+ }
+ }
+ ASN_SEQUENCE_ADD(&ie->value.choice.SupportedTAList.list, ta);
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (NGAP_NGSetupRequestIEs_t *)calloc(1, sizeof(NGAP_NGSetupRequestIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_DefaultPagingDRX;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_NGSetupRequestIEs__value_PR_PagingDRX;
+ ie->value.choice.PagingDRX = instance_p->default_drx;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+ NGAP_ERROR("Failed to encode NG setup request\n");
+ return -1;
+ }
+
+ /* Non UE-Associated signalling -> stream = 0 */
+ ngap_gNB_itti_send_sctp_data_req(instance_p->instance, ngap_amf_data_p->assoc_id, buffer, len, 0);
+ return ret;
+}
+
+
+
+
diff --git a/openair3/NGAP/ngap_gNB.h b/openair3/NGAP/ngap_gNB.h
new file mode 100644
index 0000000000..e6a24acdb4
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB.h
@@ -0,0 +1,64 @@
+/*
+ * 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 ngap_gNB.h
+ * \brief NGAP gNB task
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+#include
+#include
+
+/** @defgroup _ngap_impl_ NGAP Layer Reference Implementation for gNB
+ * @ingroup _ref_implementation_
+ * @{
+ */
+
+#ifndef NGAP_GNB_H_
+#define NGAP_GNB_H_
+
+typedef struct ngap_gNB_config_s {
+ // MME related params
+ unsigned char amf_enabled; ///< AMF enabled ?
+ unsigned char ngap_enabled; ///< NGAP enabled ?
+} ngap_gNB_config_t;
+
+extern ngap_gNB_config_t ngap_config;
+
+#define AMF_MODE_ENABLED ngap_config.amf_enabled
+#define NGAP_CONF_MODE ngap_config.ngap_enabled
+
+
+void *ngap_gNB_process_itti_msg(void*);
+void ngap_gNB_init(void);
+void *ngap_gNB_task(void *arg);
+
+uint32_t ngap_generate_gNB_id(void);
+
+#endif /* NGAP_GNB_H_ */
+
+/**
+ * @}
+ */
diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.c b/openair3/NGAP/ngap_gNB_context_management_procedures.c
new file mode 100644
index 0000000000..81dee33293
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_context_management_procedures.c
@@ -0,0 +1,271 @@
+/*
+ * 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 ngap_gNB_context_management_procedures.c
+ * \brief NGAP context management procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+
+#include
+#include
+#include
+
+#include "assertions.h"
+#include "conversions.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+
+#include "ngap_gNB_itti_messaging.h"
+
+#include "ngap_gNB_encoder.h"
+#include "ngap_gNB_nnsf.h"
+#include "ngap_gNB_ue_context.h"
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_management_procedures.h"
+#include "ngap_gNB_context_management_procedures.h"
+#include "msc.h"
+
+
+int ngap_ue_context_release_complete(instance_t instance,
+ ngap_ue_release_complete_t *ue_release_complete_p)
+{
+
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_UEContextReleaseComplete_t *out;
+ NGAP_UEContextReleaseComplete_IEs_t *ie;
+ uint8_t *buffer;
+ uint32_t length;
+
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+
+ DevAssert(ue_release_complete_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ /*RB_FOREACH(ue_context_p, ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head) {
+ NGAP_WARN("in ngap_ue_map: UE context gNB_ue_ngap_id %u amf_ue_ngap_id %u state %u\n",
+ ue_context_p->gNB_ue_ngap_id, ue_context_p->amf_ue_ngap_id,
+ ue_context_p->ue_state);
+ }*/
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ ue_release_complete_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
+ ue_release_complete_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome = CALLOC(1, sizeof(struct NGAP_SuccessfulOutcome));
+ pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_UEContextRelease;
+ pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
+ pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_UEContextReleaseComplete;
+ out = &pdu.choice.successfulOutcome->value.choice.UEContextReleaseComplete;
+
+ /* mandatory */
+ ie = (NGAP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseComplete_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (NGAP_UEContextReleaseComplete_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseComplete_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_UEContextReleaseComplete_IEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_release_complete_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ /* Encode procedure has failed... */
+ NGAP_ERROR("Failed to encode UE context release complete\n");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ buffer,
+ length,
+ MSC_AS_TIME_FMT" UEContextRelease successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %lu",
+ 0,0, //MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_release_complete_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ //LG ngap_gNB_itti_send_sctp_close_association(ngap_gNB_instance_p->instance,
+ // ue_context_p->amf_ref->assoc_id);
+ // release UE context
+ struct ngap_gNB_ue_context_s *ue_context2_p = NULL;
+
+ if ((ue_context2_p = RB_REMOVE(ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head, ue_context_p))
+ != NULL) {
+ NGAP_WARN("Removed UE context gNB_ue_ngap_id %u\n",
+ ue_context2_p->gNB_ue_ngap_id);
+ ngap_gNB_free_ue_context(ue_context2_p);
+ } else {
+ NGAP_WARN("Removing UE context gNB_ue_ngap_id %u: did not find context\n",
+ ue_context_p->gNB_ue_ngap_id);
+ }
+ /*RB_FOREACH(ue_context_p, ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head) {
+ NGAP_WARN("in ngap_ue_map: UE context gNB_ue_ngap_id %u amf_ue_ngap_id %u state %u\n",
+ ue_context_p->gNB_ue_ngap_id, ue_context_p->amf_ue_ngap_id,
+ ue_context_p->ue_state);
+ }*/
+
+ return 0;
+}
+
+
+int ngap_ue_context_release_req(instance_t instance,
+ ngap_ue_release_req_t *ue_release_req_p)
+{
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_UEContextReleaseRequest_t *out;
+ NGAP_UEContextReleaseRequest_IEs_t *ie;
+ uint8_t *buffer = NULL;
+ uint32_t length;
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+
+ DevAssert(ue_release_req_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ ue_release_req_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
+ ue_release_req_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage = CALLOC(1, sizeof(struct NGAP_InitiatingMessage));
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UEContextReleaseRequest;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UEContextReleaseRequest;
+ out = &pdu.choice.initiatingMessage->value.choice.UEContextReleaseRequest;
+
+ /* mandatory */
+ ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_release_req_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (NGAP_UEContextReleaseRequest_IEs_t *)calloc(1, sizeof(NGAP_UEContextReleaseRequest_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_Cause;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause;
+
+ switch (ue_release_req_p->cause) {
+ case NGAP_Cause_PR_radioNetwork:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
+ ie->value.choice.Cause.choice.radioNetwork = ue_release_req_p->cause_value;
+ break;
+
+ case NGAP_Cause_PR_transport:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_transport;
+ ie->value.choice.Cause.choice.transport = ue_release_req_p->cause_value;
+ break;
+
+ case NGAP_Cause_PR_nas:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_nas;
+ ie->value.choice.Cause.choice.nas = ue_release_req_p->cause_value;
+ break;
+
+ case NGAP_Cause_PR_protocol:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_protocol;
+ ie->value.choice.Cause.choice.protocol = ue_release_req_p->cause_value;
+ break;
+
+ case NGAP_Cause_PR_misc:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_misc;
+ ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value;
+ break;
+
+ case NGAP_Cause_PR_NOTHING:
+ default:
+ ie->value.choice.Cause.present = NGAP_Cause_PR_NOTHING;
+ break;
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ /* Encode procedure has failed... */
+ NGAP_ERROR("Failed to encode UE context release complete\n");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ buffer,
+ length,
+ MSC_AS_TIME_FMT" UEContextReleaseRequest initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %lu",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_release_req_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ return 0;
+}
+
diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.h b/openair3/NGAP/ngap_gNB_context_management_procedures.h
new file mode 100644
index 0000000000..5eca34e56d
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_context_management_procedures.h
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+/*! \file ngap_gNB_context_management_procedures.h
+ * \brief NGAP context management procedures
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+#ifndef NGAP_GNB_CONTEXT_MANAGEMENT_PROCEDURES_H_
+#define NGAP_GNB_CONTEXT_MANAGEMENT_PROCEDURES_H_
+
+
+int ngap_ue_context_release_complete(instance_t instance,
+ ngap_ue_release_complete_t *ue_release_complete_p);
+
+int ngap_ue_context_release_req(instance_t instance,
+ ngap_ue_release_req_t *ue_release_req_p);
+
+#endif /* NGAP_GNB_CONTEXT_MANAGEMENT_PROCEDURES_H_ */
diff --git a/openair3/NGAP/ngap_gNB_decoder.c b/openair3/NGAP/ngap_gNB_decoder.c
new file mode 100644
index 0000000000..b551471a84
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_decoder.c
@@ -0,0 +1,188 @@
+/*
+ * 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 ngap_gNB_decoder.c
+ * \brief ngap pdu decode procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+
+#include "assertions.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_decoder.h"
+
+static int ngap_gNB_decode_initiating_message(NGAP_NGAP_PDU_t *pdu) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.initiatingMessage->procedureCode) {
+ case NGAP_ProcedureCode_id_DownlinkNASTransport:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_InitialContextSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_UEContextRelease:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_Paging:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ NGAP_INFO("Paging initiating message\n");
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("PDUSESSIONSetup initiating message\n");
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceModify:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("PDUSESSIONModify initiating message\n");
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceRelease:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("TODO PDUSESSIONRelease initiating message\n");
+ break;
+
+ case NGAP_ProcedureCode_id_ErrorIndication:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("TODO ErrorIndication initiating message\n");
+ break;
+
+ default:
+ NGAP_ERROR("Unknown procedure ID (%d) for initiating message\n",
+ (int)pdu->choice.initiatingMessage->procedureCode);
+ AssertFatal( 0, "Unknown procedure ID (%d) for initiating message\n",
+ (int)pdu->choice.initiatingMessage->procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int ngap_gNB_decode_successful_outcome(NGAP_NGAP_PDU_t *pdu) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.successfulOutcome->procedureCode) {
+ case NGAP_ProcedureCode_id_NGSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PathSwitchRequest:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceModifyIndication:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+
+ default:
+ NGAP_ERROR("Unknown procedure ID (%d) for successfull outcome message\n",
+ (int)pdu->choice.successfulOutcome->procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int ngap_gNB_decode_unsuccessful_outcome(NGAP_NGAP_PDU_t *pdu) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.unsuccessfulOutcome->procedureCode) {
+ case NGAP_ProcedureCode_id_NGSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+ case NGAP_ProcedureCode_id_PathSwitchRequest:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ default:
+ NGAP_ERROR("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+ (int)pdu->choice.unsuccessfulOutcome->procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer,
+ const uint32_t length) {
+ asn_dec_rval_t dec_ret;
+ DevAssert(pdu != NULL);
+ DevAssert(buffer != NULL);
+ dec_ret = aper_decode(NULL,
+ &asn_DEF_NGAP_NGAP_PDU,
+ (void **)&pdu,
+ buffer,
+ length,
+ 0,
+ 0);
+
+ if (dec_ret.code != RC_OK) {
+ NGAP_ERROR("Failed to decode pdu\n");
+ return -1;
+ }
+
+ switch(pdu->present) {
+ case NGAP_NGAP_PDU_PR_initiatingMessage:
+ return ngap_gNB_decode_initiating_message(pdu);
+
+ case NGAP_NGAP_PDU_PR_successfulOutcome:
+ return ngap_gNB_decode_successful_outcome(pdu);
+
+ case NGAP_NGAP_PDU_PR_unsuccessfulOutcome:
+ return ngap_gNB_decode_unsuccessful_outcome(pdu);
+
+ default:
+ NGAP_DEBUG("Unknown presence (%d) or not implemented\n", (int)pdu->present);
+ break;
+ }
+
+ return -1;
+}
diff --git a/openair3/NGAP/ngap_gNB_decoder.h b/openair3/NGAP/ngap_gNB_decoder.h
new file mode 100644
index 0000000000..9fc8d433c4
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_decoder.h
@@ -0,0 +1,37 @@
+/*
+ * 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 ngap_gNB_decoder.h
+ * \brief ngap pdu decode procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+
+#ifndef NGAP_GNB_DECODER_H_
+#define NGAP_GNB_DECODER_H_
+
+int ngap_gNB_decode_pdu(NGAP_NGAP_PDU_t *pdu, const uint8_t *const buffer,
+ const uint32_t length) __attribute__ ((warn_unused_result));
+
+#endif /* NGAP_GNB_DECODER_H_ */
diff --git a/openair3/NGAP/ngap_gNB_default_values.h b/openair3/NGAP/ngap_gNB_default_values.h
new file mode 100644
index 0000000000..afbe91ec7f
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_default_values.h
@@ -0,0 +1,45 @@
+/*
+ * 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 ngap_gNB_default_values.h
+ * \brief ngap default values
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#ifndef NGAP_GNB_DEFAULT_VALUES_H_
+#define NGAP_GNB_DEFAULT_VALUES_H_
+
+#define GNB_TAC (1)
+#define GNB_MCC (208)
+#define GNB_MNC (92)
+
+#define GNB_NAME "Eurecom GNB"
+#define GNB_NAME_FORMAT (GNB_NAME" %u")
+
+#define NGAP_PORT_NUMBER (38412)
+#define NGAP_SCTP_PPID (60)
+
+#define X2AP_PORT_NUMBER (36422)
+#define X2AP_SCTP_PPID (27)
+
+#endif /* NGAP_GNB_DEFAULT_VALUES_H_ */
diff --git a/openair3/NGAP/ngap_gNB_defs.h b/openair3/NGAP/ngap_gNB_defs.h
new file mode 100644
index 0000000000..f2bdd646ae
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_defs.h
@@ -0,0 +1,298 @@
+/*
+ * 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 ngap_gNB_defs.h
+ * \brief ngap define procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+
+#include "queue.h"
+#include "tree.h"
+
+#ifndef NGAP_GNB_DEFS_H_
+#define NGAP_GNB_DEFS_H_
+
+#define NGAP_GNB_NAME_LENGTH_MAX (150)
+
+typedef enum {
+ /* Disconnected state: initial state for any association. */
+ NGAP_GNB_STATE_DISCONNECTED = 0x0,
+ /* State waiting for S1 Setup response message if gNB is AMF accepted or
+ * S1 Setup failure if AMF rejects the gNB.
+ */
+ NGAP_GNB_STATE_WAITING = 0x1,
+ /* The gNB is successfully connected to AMF, UE contexts can be created. */
+ NGAP_GNB_STATE_CONNECTED = 0x2,
+ /* The AMF has sent an overload start message. Once the AMF disables the
+ * OVERLOAD marker, the state of the association will be
+ * NGAP_GNB_STATE_CONNECTED.
+ */
+ NGAP_GNB_OVERLOAD = 0x3,
+ /* Max number of states available */
+ NGAP_GNB_STATE_MAX,
+} ngap_gNB_state_t;
+
+/* If the Overload Action IE in the OVERLOAD START message is set to
+ * - “reject all RRC connection establishments for non-emergency mobile
+ * originated data transfer E(i.e. reject traffic corresponding to RRC cause
+ * “mo-data E(TS 36.331 [16])), or
+ * - “reject all RRC connection establishments for signalling E(i.e. reject
+ * traffic corresponding to RRC cause “modata Eand “mo-signalling E * (TS 38.331 [16])),or
+ * - “only permit RRC connection establishments for emergency sessions and
+ * mobile terminated services E(i.e. only permit traffic corresponding to RRC
+ * cause “emergency Eand “mt-Access E(TS 36.331 [16])).
+ *
+ * NOTE: When the Overload Action IE is set to “only permit RRC connection
+ * establishments for emergency sessions and mobile terminated services E
+ * emergency calls with RRC cause “highPriorityAcess Efrom high priority users
+ * are rejected (TS 24.301 [24]).
+ */
+typedef enum {
+ NGAP_OVERLOAD_REJECT_MO_DATA = 0x0,
+ NGAP_OVERLOAD_REJECT_ALL_SIGNALLING = 0x1,
+ NGAP_OVERLOAD_ONLY_EMERGENCY_AND_MT = 0x2,
+ NGAP_NO_OVERLOAD = 0x3,
+ NGAP_OVERLOAD_MAX,
+} ngap_overload_state_t;
+
+/* Served PLMN identity element */
+struct plmn_identity_s {
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+ STAILQ_ENTRY(plmn_identity_s) next;
+};
+
+/* Served amf region id for a particular AMF */
+struct served_region_id_s {
+ uint8_t amf_region_id;
+ STAILQ_ENTRY(served_region_id_s) next;
+};
+
+/* Served amf set id for a particular AMF */
+struct amf_set_id_s {
+ uint16_t amf_set_id;
+ STAILQ_ENTRY(amf_set_id_s) next;
+};
+
+/* Served amf pointer for a particular AMF */
+struct amf_pointer_s {
+ uint8_t amf_pointer;
+ STAILQ_ENTRY(amf_pointer_s) next;
+};
+
+
+/* Served guami element */
+struct served_guami_s {
+ /* Number of AMF served PLMNs */
+ uint8_t nb_served_plmns;
+ /* List of served PLMNs by AMF */
+ STAILQ_HEAD(served_plmns_s, plmn_identity_s) served_plmns;
+
+ /* Number of region id in list */
+ uint8_t nb_region_id;
+ /* Served group id list */
+ STAILQ_HEAD(served_region_ids_s, served_region_id_s) served_region_ids;
+
+ /* Number of AMF set id */
+ uint8_t nb_amf_set_id;
+ /* AMF Set id to uniquely identify an AMF within an AMF pool area */
+ STAILQ_HEAD(amf_set_ids_s, amf_set_id_s) amf_set_ids;
+
+ /* Number of AMF pointer */
+ uint8_t nb_amf_pointer;
+ /* AMF pointer to uniquely identify an AMF within an AMF pool area */
+ STAILQ_HEAD(amf_pointers_s, amf_pointer_s) amf_pointers;
+
+ /* Next GUAMI element */
+ STAILQ_ENTRY(served_guami_s) next;
+};
+
+/* NSSAI element */
+struct slice_support_s{
+ uint8_t sST;
+ uint8_t sD_flag;
+ uint8_t sD[3];
+
+ /* Next slice element */
+ STAILQ_ENTRY(slice_support_s) next;
+};
+
+
+/* plmn support element */
+struct plmn_support_s {
+ struct plmn_identity_s plmn_identity;
+
+ /* Number of slice support in list */
+ uint8_t nb_slice_s;
+ /* Served group id list */
+ STAILQ_HEAD(slice_supports_s, slice_support_s) slice_supports;
+
+ /* Next plmn support element */
+ STAILQ_ENTRY(plmn_support_s) next;
+};
+
+
+struct ngap_gNB_instance_s;
+
+/* This structure describes association of a gNB to a AMF */
+typedef struct ngap_gNB_amf_data_s {
+ /* AMF descriptors tree, ordered by sctp assoc id */
+ RB_ENTRY(ngap_gNB_amf_data_s) entry;
+
+ /* This is the optional name provided by the AMF */
+ char *amf_name;
+
+ /* AMF NGAP IP address */
+ net_ip_address_t amf_s1_ip;
+
+ /* List of served GUAMI per AMF. There is one GUAMI per RAT with a max
+ * number of 8 RATs but in our case only one is used. The LTE related pool
+ * configuration is included on the first place in the list.
+ */
+ STAILQ_HEAD(served_guamis_s, served_guami_s) served_guami;
+
+ /* Relative processing capacity of an AMF with respect to the other AMFs
+ * in the pool in order to load-balance AMFs within a pool as defined
+ * in TS 23.401.
+ */
+ uint8_t relative_amf_capacity;
+
+ /*
+ * List of PLMN Support per AMF.
+ *
+ */
+ STAILQ_HEAD(plmn_supports_s, plmn_support_s) plmn_supports;
+
+ /* Current AMF overload information (if any). */
+ ngap_overload_state_t overload_state;
+ /* Current gNB->AMF NGAP association state */
+ ngap_gNB_state_t state;
+
+ /* Next usable stream for UE signalling */
+ int32_t nextstream;
+
+ /* Number of input/ouput streams */
+ uint16_t in_streams;
+ uint16_t out_streams;
+
+ /* Connexion id used between SCTP/NGAP */
+ uint16_t cnx_id;
+
+ /* SCTP association id */
+ int32_t assoc_id;
+
+ /* This is served PLMN IDs communicated to the AMF via an index over the
+ * MCC/MNC array in ngap_gNB_instance */
+ uint8_t broadcast_plmn_num;
+ uint8_t broadcast_plmn_index[PLMN_LIST_MAX_SIZE];
+
+
+ /* Only meaningfull in virtual mode */
+ struct ngap_gNB_instance_s *ngap_gNB_instance;
+} ngap_gNB_amf_data_t;
+
+typedef struct ngap_gNB_NSSAI_s{
+ uint8_t sST;
+ uint8_t sD_flag;
+ uint8_t sD[3];
+}ngap_gNB_NSSAI_t;
+
+typedef struct ngap_gNB_instance_s {
+ /* Next ngap gNB association.
+ * Only used for virtual mode.
+ */
+ STAILQ_ENTRY(ngap_gNB_instance_s) ngap_gNB_entries;
+
+ /* Number of AMF requested by gNB (tree size) */
+ uint32_t ngap_amf_nb;
+ /* Number of AMF for which association is pending */
+ uint32_t ngap_amf_pending_nb;
+ /* Number of AMF successfully associated to gNB */
+ uint32_t ngap_amf_associated_nb;
+ /* Tree of NGAP AMF associations ordered by association ID */
+ RB_HEAD(ngap_amf_map, ngap_gNB_amf_data_s) ngap_amf_head;
+
+ /* TODO: add a map ordered by relative AMF capacity */
+
+ /* Tree of UE ordered by gNB_ue_ngap_id's */
+ RB_HEAD(ngap_ue_map, ngap_gNB_ue_context_s) ngap_ue_head;
+
+ /* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */
+ instance_t instance;
+
+ /* Displayable name of gNB */
+ char *gNB_name;
+
+ /* Unique gNB_id to identify the gNB within EPC.
+ * In our case the gNB is a macro gNB so the id will be 20 bits long.
+ * For Home gNB id, this field should be 36 bits long.
+ */
+ uint32_t gNB_id;
+ /* The type of the cell */
+ enum cell_type_e cell_type;
+
+ /* Tracking area code */
+ uint32_t tac;
+
+ /* gNB NGAP IP address */
+ net_ip_address_t gNB_ng_ip;
+
+ /* Mobile Country Code
+ * Mobile Network Code
+ */
+ uint16_t mcc[PLMN_LIST_MAX_SIZE];
+ uint16_t mnc[PLMN_LIST_MAX_SIZE];
+ uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
+ uint8_t num_plmn;
+
+ uint16_t num_nssai[PLMN_LIST_MAX_SIZE];
+ ngap_gNB_NSSAI_t s_nssai[PLMN_LIST_MAX_SIZE][8];
+
+ /* Default Paging DRX of the gNB as defined in TS 38.304 */
+ ngap_paging_drx_t default_drx;
+} ngap_gNB_instance_t;
+
+typedef struct {
+ /* List of served gNBs
+ * Only used for virtual mode
+ */
+ STAILQ_HEAD(ngap_gNB_instances_head_s, ngap_gNB_instance_s) ngap_gNB_instances_head;
+ /* Nb of registered gNBs */
+ uint8_t nb_registered_gNBs;
+
+ /* Generate a unique connexion id used between NGAP and SCTP */
+ uint16_t global_cnx_id;
+} ngap_gNB_internal_data_t;
+
+int ngap_gNB_compare_assoc_id(
+ struct ngap_gNB_amf_data_s *p1, struct ngap_gNB_amf_data_s *p2);
+
+/* Generate the tree management functions */
+RB_PROTOTYPE(ngap_amf_map, ngap_gNB_amf_data_s, entry,
+ ngap_gNB_compare_assoc_id);
+
+#endif /* NGAP_GNB_DEFS_H_ */
diff --git a/openair3/NGAP/ngap_gNB_encoder.c b/openair3/NGAP/ngap_gNB_encoder.c
new file mode 100644
index 0000000000..b510dde23e
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_encoder.c
@@ -0,0 +1,223 @@
+/*
+ * 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 ngap_gNB_encoder.c
+ * \brief ngap pdu encode procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+
+#include
+#include
+#include
+
+#include "assertions.h"
+#include "conversions.h"
+#include "intertask_interface.h"
+#include "ngap_common.h"
+#include "ngap_gNB_encoder.h"
+
+static inline int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer,
+ uint32_t *len);
+
+static inline int ngap_gNB_encode_successfull_outcome(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer, uint32_t *len);
+
+static inline int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer, uint32_t *len);
+
+int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len) {
+ int ret = -1;
+ DevAssert(pdu != NULL);
+ DevAssert(buffer != NULL);
+ DevAssert(len != NULL);
+
+ switch(pdu->present) {
+ case NGAP_NGAP_PDU_PR_initiatingMessage:
+ ret = ngap_gNB_encode_initiating(pdu, buffer, len);
+ break;
+
+ case NGAP_NGAP_PDU_PR_successfulOutcome:
+ ret = ngap_gNB_encode_successfull_outcome(pdu, buffer, len);
+ break;
+
+ case NGAP_NGAP_PDU_PR_unsuccessfulOutcome:
+ ret = ngap_gNB_encode_unsuccessfull_outcome(pdu, buffer, len);
+ break;
+
+ default:
+ NGAP_DEBUG("Unknown message outcome (%d) or not implemented",
+ (int)pdu->present);
+ return -1;
+ }
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, pdu);
+ return ret;
+}
+
+static inline
+int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer, uint32_t *len) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.initiatingMessage->procedureCode) {
+ case NGAP_ProcedureCode_id_NGSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_UplinkNASTransport:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_UERadioCapabilityInfoIndication:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_InitialUEMessage:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_NASNonDeliveryIndication:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_UEContextReleaseRequest:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PathSwitchRequest:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceModifyIndication:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ default:
+ NGAP_DEBUG("Unknown procedure ID (%d) for initiating message\n",
+ (int)pdu->choice.initiatingMessage->procedureCode);
+ return -1;
+ }
+
+ if (asn1_xer_print) {
+ xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ *buffer = res.buffer;
+ *len = res.result.encoded;
+ return 0;
+}
+
+static inline
+int ngap_gNB_encode_successfull_outcome(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer, uint32_t *len) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.successfulOutcome->procedureCode) {
+ case NGAP_ProcedureCode_id_InitialContextSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_UEContextRelease:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("PDUSESSIONSetup successful message\n");
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceModify:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("PDUSESSIONModify successful message\n");
+ break;
+
+ case NGAP_ProcedureCode_id_PDUSessionResourceRelease:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ NGAP_INFO("PDUSESSION Release successful message\n");
+ break;
+
+ default:
+ NGAP_WARN("Unknown procedure ID (%d) for successfull outcome message\n",
+ (int)pdu->choice.successfulOutcome->procedureCode);
+ return -1;
+ }
+
+ if (asn1_xer_print) {
+ xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ *buffer = res.buffer;
+ *len = res.result.encoded;
+ return 0;
+}
+
+static inline
+int ngap_gNB_encode_unsuccessfull_outcome(NGAP_NGAP_PDU_t *pdu,
+ uint8_t **buffer, uint32_t *len) {
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.unsuccessfulOutcome->procedureCode) {
+ case NGAP_ProcedureCode_id_InitialContextSetup:
+ res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ free(res.buffer);
+ break;
+
+ default:
+ NGAP_DEBUG("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+ (int)pdu->choice.unsuccessfulOutcome->procedureCode);
+ return -1;
+ }
+
+ if (asn1_xer_print) {
+ xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, (void *)pdu);
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_NGAP_PDU, pdu);
+ *buffer = res.buffer;
+ *len = res.result.encoded;
+ return 0;
+}
diff --git a/openair3/NGAP/ngap_gNB_encoder.h b/openair3/NGAP/ngap_gNB_encoder.h
new file mode 100644
index 0000000000..bd151405ff
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_encoder.h
@@ -0,0 +1,36 @@
+/*
+ * 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 ngap_gNB_encoder.h
+ * \brief ngap pdu encode procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#ifndef NGAP_GNB_ENCODER_H_
+#define NGAP_GNB_ENCODER_H_
+
+int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
+__attribute__ ((warn_unused_result));
+
+#endif /* NGAP_GNB_ENCODER_H_ */
diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c
new file mode 100644
index 0000000000..b35741151f
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_handlers.c
@@ -0,0 +1,1883 @@
+/*
+ * 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 ngap_gNB_handlers.c
+ * \brief ngap messages handlers for gNB part
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#include
+
+#include "intertask_interface.h"
+
+#include "asn1_conversions.h"
+
+#include "ngap_common.h"
+// #include "ngap_gNB.h"
+#include "ngap_gNB_defs.h"
+#include "ngap_gNB_handlers.h"
+#include "ngap_gNB_decoder.h"
+
+#include "ngap_gNB_ue_context.h"
+#include "ngap_gNB_trace.h"
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_management_procedures.h"
+
+#include "ngap_gNB_default_values.h"
+
+#include "assertions.h"
+#include "conversions.h"
+#include "msc.h"
+
+static
+int ngap_gNB_handle_ng_setup_response(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+static
+int ngap_gNB_handle_ng_setup_failure(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_error_indication(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_initial_context_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_ue_context_release_command(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_paging(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_pdusession_modify_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_pdusession_release_command(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_ng_path_switch_request_ack(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_ng_path_switch_request_failure(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+static
+int ngap_gNB_handle_ng_ENDC_pdusession_modification_confirm(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+/* Handlers matrix. Only gNB related procedure present here */
+ngap_message_decoded_callback ngap_messages_callback[][3] = {
+ { 0, 0, 0 }, /* AMFConfigurationUpdate */
+ { 0, 0, 0 }, /* AMFStatusIndication */
+ { 0, 0, 0 }, /* CellTrafficTrace */
+ { ngap_gNB_handle_deactivate_trace, 0, 0 }, /* DeactivateTrace */
+ { ngap_gNB_handle_nas_downlink, 0, 0 }, /* DownlinkNASTransport */
+ { 0, 0, 0 }, /* DownlinkNonUEAssociatedNRPPaTransport */
+ { 0, 0, 0 }, /* DownlinkRANConfigurationTransfer */
+ { 0, 0, 0 }, /* DownlinkRANStatusTransfer */
+ { 0, 0, 0 }, /* DownlinkUEAssociatedNRPPaTransport */
+ { ngap_gNB_handle_error_indication, 0, 0 }, /* ErrorIndication */
+ { 0, 0, 0 }, /* HandoverCancel */
+ { 0, 0, 0 }, /* HandoverNotification */
+ { 0, 0, 0 }, /* HandoverPreparation */
+ { 0, 0, 0 }, /* HandoverResourceAllocation */
+ { ngap_gNB_handle_initial_context_request, 0, 0 }, /* InitialContextSetup */
+ { 0, 0, 0 }, /* InitialUEMessage */
+ { 0, 0, 0 }, /* LocationReportingControl */
+ { 0, 0, 0 }, /* LocationReportingFailureIndication */
+ { 0, 0, 0 }, /* LocationReport */
+ { 0, 0, 0 }, /* NASNonDeliveryIndication */
+ { 0, 0, 0 }, /* NGReset */
+ { 0, ngap_gNB_handle_ng_setup_response, ngap_gNB_handle_ng_setup_failure }, /* NGSetup */
+ { 0, 0, 0 }, /* OverloadStart */
+ { 0, 0, 0 }, /* OverloadStop */
+ { ngap_gNB_handle_paging, 0, 0 }, /* Paging */
+ { 0, ngap_gNB_handle_ng_path_switch_request_ack, ngap_gNB_handle_ng_path_switch_request_failure }, /* PathSwitchRequest */
+ { ngap_gNB_handle_pdusession_modify_request, 0, 0 }, /* PDUSessionResourceModify */
+ { 0, ngap_gNB_handle_ng_ENDC_pdusession_modification_confirm, 0 }, /* PDUSessionResourceModifyIndication */
+ { ngap_gNB_handle_pdusession_release_command, 0, 0 }, /* PDUSessionResourceRelease */
+ { ngap_gNB_handle_pdusession_setup_request, 0, 0 }, /* PDUSessionResourceSetup */
+ { 0, 0, 0 }, /* PDUSessionResourceNotify */
+ { 0, 0, 0 }, /* PrivateMessage */
+ { 0, 0, 0 }, /* PWSCancel */
+ { 0, 0, 0 }, /* PWSFailureIndication */
+ { 0, 0, 0 }, /* PWSRestartIndication */
+ { 0, 0, 0 }, /* RANConfigurationUpdate */
+ { 0, 0, 0 }, /* RerouteNASRequest */
+ { 0, 0, 0 }, /* RRCInactiveTransitionReport */
+ { 0, 0, 0 }, /* TraceFailureIndication */
+ { ngap_gNB_handle_trace_start, 0, 0 }, /* TraceStart */
+ { 0, 0, 0 }, /* UEContextModification */
+ { ngap_gNB_handle_ue_context_release_command, 0, 0 }, /* UEContextRelease */
+ { 0, 0, 0 }, /* UEContextReleaseRequest */
+ { 0, 0, 0 }, /* UERadioCapabilityCheck */
+ { 0, 0, 0 }, /* UERadioCapabilityInfoIndication */
+ { 0, 0, 0 }, /* UETNLABindingRelease */
+ { 0, 0, 0 }, /* UplinkNASTransport */
+ { 0, 0, 0 }, /* UplinkNonUEAssociatedNRPPaTransport */
+ { 0, 0, 0 }, /* UplinkRANConfigurationTransfer */
+ { 0, 0, 0 }, /* UplinkRANStatusTransfer */
+ { 0, 0, 0 }, /* UplinkUEAssociatedNRPPaTransport */
+ { 0, 0, 0 }, /* WriteReplaceWarning */
+ { 0, 0, 0 }, /* SecondaryRATDataUsageReport */
+
+};
+char *ngap_direction2String(int ngap_dir) {
+ static char *ngap_direction_String[] = {
+ "", /* Nothing */
+ "Originating message", /* originating message */
+ "Successfull outcome", /* successfull outcome */
+ "UnSuccessfull outcome", /* successfull outcome */
+ };
+ return(ngap_direction_String[ngap_dir]);
+}
+void ngap_handle_ng_setup_message(ngap_gNB_amf_data_t *amf_desc_p, int sctp_shutdown) {
+ if (sctp_shutdown) {
+ /* A previously connected AMF has been shutdown */
+
+ /* TODO check if it was used by some gNB and send a message to inform these gNB if there is no more associated AMF */
+ if (amf_desc_p->state == NGAP_GNB_STATE_CONNECTED) {
+ amf_desc_p->state = NGAP_GNB_STATE_DISCONNECTED;
+
+ if (amf_desc_p->ngap_gNB_instance->ngap_amf_associated_nb > 0) {
+ /* Decrease associated AMF number */
+ amf_desc_p->ngap_gNB_instance->ngap_amf_associated_nb --;
+ }
+
+ /* If there are no more associated AMF, inform gNB app */
+ if (amf_desc_p->ngap_gNB_instance->ngap_amf_associated_nb == 0) {
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_DEREGISTERED_GNB_IND);
+ NGAP_DEREGISTERED_GNB_IND(message_p).nb_amf = 0;
+ itti_send_msg_to_task(TASK_GNB_APP, amf_desc_p->ngap_gNB_instance->instance, message_p);
+ }
+ }
+ } else {
+ /* Check that at least one setup message is pending */
+ DevCheck(amf_desc_p->ngap_gNB_instance->ngap_amf_pending_nb > 0, amf_desc_p->ngap_gNB_instance->instance,
+ amf_desc_p->ngap_gNB_instance->ngap_amf_pending_nb, 0);
+
+ if (amf_desc_p->ngap_gNB_instance->ngap_amf_pending_nb > 0) {
+ /* Decrease pending messages number */
+ amf_desc_p->ngap_gNB_instance->ngap_amf_pending_nb --;
+ }
+
+ /* If there are no more pending messages, inform gNB app */
+ if (amf_desc_p->ngap_gNB_instance->ngap_amf_pending_nb == 0) {
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_REGISTER_GNB_CNF);
+ NGAP_REGISTER_GNB_CNF(message_p).nb_amf = amf_desc_p->ngap_gNB_instance->ngap_amf_associated_nb;
+ itti_send_msg_to_task(TASK_GNB_APP, amf_desc_p->ngap_gNB_instance->instance, message_p);
+ }
+ }
+}
+
+int ngap_gNB_handle_message(uint32_t assoc_id, int32_t stream,
+ const uint8_t *const data, const uint32_t data_length) {
+ NGAP_NGAP_PDU_t pdu;
+ int ret;
+ DevAssert(data != NULL);
+ memset(&pdu, 0, sizeof(pdu));
+
+ if (ngap_gNB_decode_pdu(&pdu, data, data_length) < 0) {
+ NGAP_ERROR("Failed to decode PDU\n");
+ return -1;
+ }
+
+ /* Checking procedure Code and direction of message */
+ if (pdu.choice.initiatingMessage->procedureCode >= sizeof(ngap_messages_callback) / (3 * sizeof(
+ ngap_message_decoded_callback))
+ || (pdu.present > NGAP_NGAP_PDU_PR_unsuccessfulOutcome)) {
+ NGAP_ERROR("[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n",
+ assoc_id, pdu.choice.initiatingMessage->procedureCode, pdu.present);
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, &pdu);
+ return -1;
+ }
+
+ /* No handler present.
+ * This can mean not implemented or no procedure for gNB (wrong direction).
+ */
+ if (ngap_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1] == NULL) {
+ NGAP_ERROR("[SCTP %d] No handler for procedureCode %ld in %s\n",
+ assoc_id, pdu.choice.initiatingMessage->procedureCode,
+ ngap_direction2String(pdu.present - 1));
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, &pdu);
+ return -1;
+ }
+
+ /* Calling the right handler */
+ ret = (*ngap_messages_callback[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1])
+ (assoc_id, stream, &pdu);
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_NGAP_PDU, &pdu);
+ return ret;
+}
+
+static
+int ngap_gNB_handle_ng_setup_failure(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+ NGAP_NGSetupFailure_t *container;
+ NGAP_NGSetupFailureIEs_t *ie;
+ ngap_gNB_amf_data_t *amf_desc_p;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.unsuccessfulOutcome->value.choice.NGSetupFailure;
+
+ /* S1 Setup Failure == Non UE-related procedure -> stream 0 */
+ if (stream != 0) {
+ NGAP_WARN("[SCTP %d] Received s1 setup failure on stream != 0 (%d)\n",
+ assoc_id, stream);
+ }
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received S1 setup response for non existing "
+ "AMF context\n", assoc_id);
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_NGSetupFailureIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_Cause,true);
+
+ if ((ie->value.choice.Cause.present == NGAP_Cause_PR_misc) &&
+ (ie->value.choice.Cause.choice.misc == NGAP_CauseMisc_unspecified)) {
+ NGAP_WARN("Received NG setup failure for AMF... AMF is not ready\n");
+ } else {
+ NGAP_ERROR("Received NG setup failure for AMF... please check your parameters\n");
+ }
+
+ amf_desc_p->state = NGAP_GNB_STATE_WAITING;
+ ngap_handle_ng_setup_message(amf_desc_p, 0);
+ return 0;
+}
+
+static
+int ngap_gNB_handle_ng_setup_response(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+ NGAP_NGSetupResponse_t *container;
+ NGAP_NGSetupResponseIEs_t *ie;
+ ngap_gNB_amf_data_t *amf_desc_p;
+ int i;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.successfulOutcome->value.choice.NGSetupResponse;
+
+ /* NG Setup Response == Non UE-related procedure -> stream 0 */
+ if (stream != 0) {
+ NGAP_ERROR("[SCTP %d] Received ng setup response on stream != 0 (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received NG setup response for non existing "
+ "AMF context\n", assoc_id);
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_NGSetupResponseIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_ServedGUAMIList, true);
+
+ /* The list of served guami can contain at most 256 elements.
+ * NR related guami is the first element in the list, i.e with an id of 0.
+ */
+ NGAP_DEBUG("servedGUAMIs.list.count %d\n", ie->value.choice.ServedGUAMIList.list.count);
+ DevAssert(ie->value.choice.ServedGUAMIList.list.count > 0);
+ DevAssert(ie->value.choice.ServedGUAMIList.list.count <= NGAP_maxnoofServedGUAMIs);
+
+ for (i = 0; i < ie->value.choice.ServedGUAMIList.list.count; i++) {
+ NGAP_ServedGUAMIItem_t *guami_item_p;
+ struct served_guami_s *new_guami_p;
+
+ guami_item_p = ie->value.choice.ServedGUAMIList.list.array[i];
+ new_guami_p = calloc(1, sizeof(struct served_guami_s));
+ STAILQ_INIT(&new_guami_p->served_plmns);
+ STAILQ_INIT(&new_guami_p->served_region_ids);
+ STAILQ_INIT(&new_guami_p->amf_set_ids);
+ STAILQ_INIT(&new_guami_p->amf_pointers);
+
+ NGAP_PLMNIdentity_t *plmn_identity_p;
+ struct plmn_identity_s *new_plmn_identity_p;
+ plmn_identity_p = &guami_item_p->gUAMI.pLMNIdentity;
+ new_plmn_identity_p = calloc(1, sizeof(struct plmn_identity_s));
+ TBCD_TO_MCC_MNC(plmn_identity_p, new_plmn_identity_p->mcc,
+ new_plmn_identity_p->mnc, new_plmn_identity_p->mnc_digit_length);
+ STAILQ_INSERT_TAIL(&new_guami_p->served_plmns, new_plmn_identity_p, next);
+ new_guami_p->nb_served_plmns++;
+
+ NGAP_AMFRegionID_t *amf_region_id_p;
+ struct served_region_id_s *new_region_id_p;
+ amf_region_id_p = &guami_item_p->gUAMI.aMFRegionID;
+ new_region_id_p = calloc(1, sizeof(struct served_region_id_s));
+ OCTET_STRING_TO_INT8(amf_region_id_p, new_region_id_p->amf_region_id);
+ STAILQ_INSERT_TAIL(&new_guami_p->served_region_ids, new_region_id_p, next);
+ new_guami_p->nb_region_id++;
+
+ NGAP_AMFSetID_t *amf_set_id_p;
+ struct amf_set_id_s *new_amf_set_id_p;
+ amf_set_id_p = &guami_item_p->gUAMI.aMFSetID;
+ new_amf_set_id_p = calloc(1, sizeof(struct amf_set_id_s));
+ OCTET_STRING_TO_INT16(amf_set_id_p, new_amf_set_id_p->amf_set_id);
+ STAILQ_INSERT_TAIL(&new_guami_p->amf_set_ids, new_amf_set_id_p, next);
+ new_guami_p->nb_amf_set_id++;
+
+ NGAP_AMFPointer_t *amf_pointer_p;
+ struct amf_pointer_s *new_amf_pointer_p;
+ amf_pointer_p = &guami_item_p->gUAMI.aMFPointer;
+ new_amf_pointer_p = calloc(1, sizeof(struct amf_pointer_s));
+ OCTET_STRING_TO_INT8(amf_pointer_p, new_amf_pointer_p->amf_pointer);
+ STAILQ_INSERT_TAIL(&new_guami_p->amf_pointers, new_amf_pointer_p, next);
+ new_guami_p->nb_amf_pointer++;
+
+ STAILQ_INSERT_TAIL(&amf_desc_p->served_guami, new_guami_p, next);
+ }
+
+ /* Set the capacity of this AMF */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_NGSetupResponseIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RelativeAMFCapacity, true);
+
+ amf_desc_p->relative_amf_capacity = ie->value.choice.RelativeAMFCapacity;
+
+ /* mandatory set the amf name */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_NGSetupResponseIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMFName, true);
+
+ if (ie) {
+ amf_desc_p->amf_name = calloc(ie->value.choice.AMFName.size + 1, sizeof(char));
+ memcpy(amf_desc_p->amf_name, ie->value.choice.AMFName.buf,
+ ie->value.choice.AMFName.size);
+ /* Convert the amf name to a printable string */
+ amf_desc_p->amf_name[ie->value.choice.AMFName.size] = '\0';
+ }
+
+
+ /* mandatory set the plmn supports */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_NGSetupResponseIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PLMNSupportList, true);
+
+ NGAP_DEBUG("PLMNSupportList.list.count %d\n", ie->value.choice.PLMNSupportList.list.count);
+ DevAssert(ie->value.choice.PLMNSupportList.list.count > 0);
+ DevAssert(ie->value.choice.PLMNSupportList.list.count <= NGAP_maxnoofPLMNs);
+
+ STAILQ_INIT(&amf_desc_p->plmn_supports);
+
+ for (i = 0; i < ie->value.choice.ServedGUAMIList.list.count; i++) {
+ NGAP_PLMNSupportItem_t *plmn_support_item_p;
+ struct plmn_support_s *new_plmn_support_p;
+ NGAP_SliceSupportItem_t *slice_support_item_p;
+ struct slice_support_s *new_slice_support_p;
+
+ plmn_support_item_p = ie->value.choice.PLMNSupportList.list.array[i];
+
+ new_plmn_support_p = calloc(1, sizeof(struct plmn_support_s));
+
+ TBCD_TO_MCC_MNC(&plmn_support_item_p->pLMNIdentity, new_plmn_support_p->plmn_identity.mcc,
+ new_plmn_support_p->plmn_identity.mnc, new_plmn_support_p->plmn_identity.mnc_digit_length);
+
+ NGAP_DEBUG("PLMNSupportList.list.count %d\n", plmn_support_item_p->sliceSupportList.list.count);
+ DevAssert(plmn_support_item_p->sliceSupportList.list.count > 0);
+ DevAssert(plmn_support_item_p->sliceSupportList.list.count <= NGAP_maxnoofSliceItems);
+
+ STAILQ_INIT(&new_plmn_support_p->slice_supports);
+ for(int j=0; jsliceSupportList.list.count; j++) {
+ slice_support_item_p = plmn_support_item_p->sliceSupportList.list.array[j];
+
+ new_slice_support_p = calloc(1, sizeof(struct slice_support_s));
+
+ OCTET_STRING_TO_INT8(&slice_support_item_p->s_NSSAI.sST, new_slice_support_p->sST);
+
+ if(slice_support_item_p->s_NSSAI.sD != NULL) {
+ new_slice_support_p->sD_flag = 1;
+ new_slice_support_p->sD[0] = slice_support_item_p->s_NSSAI.sD->buf[0];
+ new_slice_support_p->sD[1] = slice_support_item_p->s_NSSAI.sD->buf[1];
+ new_slice_support_p->sD[2] = slice_support_item_p->s_NSSAI.sD->buf[2];
+ }
+ STAILQ_INSERT_TAIL(&new_plmn_support_p->slice_supports, new_slice_support_p, next);
+ }
+
+ STAILQ_INSERT_TAIL(&amf_desc_p->plmn_supports, new_plmn_support_p, next);
+ }
+
+ /* The association is now ready as gNB and AMF know parameters of each other.
+ * Mark the association as UP to enable UE contexts creation.
+ */
+ amf_desc_p->state = NGAP_GNB_STATE_CONNECTED;
+ amf_desc_p->ngap_gNB_instance->ngap_amf_associated_nb ++;
+ ngap_handle_ng_setup_message(amf_desc_p, 0);
+
+ return 0;
+}
+
+
+static
+int ngap_gNB_handle_error_indication(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ NGAP_ErrorIndication_t *container;
+ NGAP_ErrorIndicationIEs_t *ie;
+ ngap_gNB_amf_data_t *amf_desc_p;
+ uint64_t amf_ue_ngap_id;
+
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.ErrorIndication;
+
+ /* NG Setup Failure == Non UE-related procedure -> stream 0 */
+ if (stream != 0) {
+ NGAP_WARN("[SCTP %d] Received ng Error indication on stream != 0 (%d)\n",
+ assoc_id, stream);
+ }
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received ng Error indication for non existing "
+ "AMF context\n", assoc_id);
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_ErrorIndicationIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, false);
+
+ /* optional */
+ if (ie != NULL) {
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ NGAP_WARN("Received NG Error indication AMF UE NGAP ID 0x%lx\n", amf_ue_ngap_id);
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_ErrorIndicationIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, false);
+
+ /* optional */
+ if (ie != NULL) {
+ NGAP_WARN("Received NG Error indication gNB UE NGAP ID 0x%lx\n", ie->value.choice.RAN_UE_NGAP_ID);
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_ErrorIndicationIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_Cause, false);
+
+ /* optional */
+ if (ie) {
+ switch(ie->value.choice.Cause.present) {
+ case NGAP_Cause_PR_NOTHING:
+ NGAP_WARN("Received NG Error indication cause NOTHING\n");
+ break;
+
+ case NGAP_Cause_PR_radioNetwork:
+ switch (ie->value.choice.Cause.choice.radioNetwork) {
+ case NGAP_CauseRadioNetwork_unspecified:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_unspecified\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_txnrelocoverall_expiry:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_txnrelocoverall_expiry\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_successful_handover:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_successful_handover\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_release_due_to_ngran_generated_reason:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_release_due_to_ngran_generated_reason\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_release_due_to_5gc_generated_reason:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_release_due_to_5gc_generated_reason\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_handover_cancelled:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_handover_cancelled\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_partial_handover:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_partial_handover\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ho_failure_in_target_5GC_ngran_node_or_target_system:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ho_failure_in_target_5GC_ngran_node_or_target_system\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ho_target_not_allowed:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ho_target_not_allowed\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_tngrelocoverall_expiry:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_tngrelocoverall_expiry\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_tngrelocprep_expiry:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_tngrelocprep_expiry\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_cell_not_available:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_cell_not_available\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_unknown_targetID:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_unknown_targetID\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_no_radio_resources_available_in_target_cell:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_no_radio_resources_available_in_target_cell\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_inconsistent_remote_UE_NGAP_ID:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_inconsistent_remote_UE_NGAP_ID\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_handover_desirable_for_radio_reason\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_time_critical_handover:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_time_critical_handover\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_resource_optimisation_handover:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_resource_optimisation_handover\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_reduce_load_in_serving_cell:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_reduce_load_in_serving_cell\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_user_inactivity:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_user_inactivity\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_radio_connection_with_ue_lost:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_radio_connection_with_ue_lost\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_radio_resources_not_available:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_radio_resources_not_available\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_invalid_qos_combination:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_invalid_qos_combination\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_interaction_with_other_procedure:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_interaction_with_other_procedure\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_unknown_PDU_session_ID:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_unknown_PDU_session_ID\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_unkown_qos_flow_ID:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_unkown_qos_flow_ID\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_multiple_qos_flow_ID_instances:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_multiple_qos_flow_ID_instances\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ng_intra_system_handover_triggered:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ng_intra_system_handover_triggered\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ng_inter_system_handover_triggered:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ng_inter_system_handover_triggered\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_xn_handover_triggered:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_xn_handover_triggered\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_not_supported_5QI_value:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_not_supported_5QI_value\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ue_context_transfer:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ue_context_transfer\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ims_voice_eps_fallback_or_rat_fallback_triggered:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ims_voice_eps_fallback_or_rat_fallback_triggered\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_up_integrity_protection_not_possible:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_up_integrity_protection_not_possible\n");
+ break;
+ case NGAP_CauseRadioNetwork_up_confidentiality_protection_not_possible:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_up_confidentiality_protection_not_possible\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_slice_not_supported:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_slice_not_supported\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ue_in_rrc_inactive_state_not_reachable:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ue_in_rrc_inactive_state_not_reachable\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_redirection:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_redirection\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_resources_not_available_for_the_slice:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_resources_not_available_for_the_slice\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_ue_max_integrity_protected_data_rate_reason:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_ue_max_integrity_protected_data_rate_reason\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_release_due_to_cn_detected_mobility:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_release_due_to_cn_detected_mobility\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_n26_interface_not_available:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_n26_interface_not_available\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_release_due_to_pre_emption:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_release_due_to_pre_emption\n");
+ break;
+
+ case NGAP_CauseRadioNetwork_multiple_location_reporting_reference_ID_instances:
+ NGAP_WARN("Received NG Error indication NGAP_CauseRadioNetwork_multiple_location_reporting_reference_ID_instances\n");
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause radio network case not handled\n");
+ }
+
+ break;
+
+ case NGAP_Cause_PR_transport:
+ switch (ie->value.choice.Cause.choice.transport) {
+ case NGAP_CauseTransport_transport_resource_unavailable:
+ NGAP_WARN("Received NG Error indication NGAP_CauseTransport_transport_resource_unavailable\n");
+ break;
+
+ case NGAP_CauseTransport_unspecified:
+ NGAP_WARN("Received NG Error indication NGAP_CauseTransport_unspecified\n");
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause transport case not handled\n");
+ }
+
+ break;
+
+ case NGAP_Cause_PR_nas:
+ switch (ie->value.choice.Cause.choice.nas) {
+ case NGAP_CauseNas_normal_release:
+ NGAP_WARN("Received NG Error indication NGAP_CauseNas_normal_release\n");
+ break;
+
+ case NGAP_CauseNas_authentication_failure:
+ NGAP_WARN("Received NG Error indication NGAP_CauseNas_authentication_failure\n");
+ break;
+
+ case NGAP_CauseNas_deregister:
+ NGAP_WARN("Received NG Error indication NGAP_CauseNas_deregister\n");
+ break;
+
+ case NGAP_CauseNas_unspecified:
+ NGAP_WARN("Received NG Error indication NGAP_CauseNas_unspecified\n");
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause nas case not handled\n");
+ }
+
+ break;
+
+ case NGAP_Cause_PR_protocol:
+ switch (ie->value.choice.Cause.choice.protocol) {
+ case NGAP_CauseProtocol_transfer_syntax_error:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_transfer_syntax_error\n");
+ break;
+
+ case NGAP_CauseProtocol_abstract_syntax_error_reject:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_abstract_syntax_error_reject\n");
+ break;
+
+ case NGAP_CauseProtocol_abstract_syntax_error_ignore_and_notify:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_abstract_syntax_error_ignore_and_notify\n");
+ break;
+
+ case NGAP_CauseProtocol_message_not_compatible_with_receiver_state:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_message_not_compatible_with_receiver_state\n");
+ break;
+
+ case NGAP_CauseProtocol_semantic_error:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_semantic_error\n");
+ break;
+
+ case NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message\n");
+ break;
+
+ case NGAP_CauseProtocol_unspecified:
+ NGAP_WARN("Received NG Error indication NGAP_CauseProtocol_unspecified\n");
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause protocol case not handled\n");
+ }
+
+ break;
+
+ case NGAP_Cause_PR_misc:
+ switch (ie->value.choice.Cause.choice.protocol) {
+ case NGAP_CauseMisc_control_processing_overload:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_control_processing_overload\n");
+ break;
+
+ case NGAP_CauseMisc_not_enough_user_plane_processing_resources:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_not_enough_user_plane_processing_resources\n");
+ break;
+
+ case NGAP_CauseMisc_hardware_failure:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_hardware_failure\n");
+ break;
+
+ case NGAP_CauseMisc_om_intervention:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_om_intervention\n");
+ break;
+
+ case NGAP_CauseMisc_unspecified:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_unspecified\n");
+ break;
+
+ case NGAP_CauseMisc_unknown_PLMN:
+ NGAP_WARN("Received NG Error indication NGAP_CauseMisc_unknown_PLMN\n");
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause misc case not handled\n");
+ }
+
+ break;
+
+ default:
+ NGAP_WARN("Received NG Error indication cause NGAP_Cause_PR_choice_Extensions\n");
+ break;
+
+ }
+ }
+
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_ErrorIndicationIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_CriticalityDiagnostics, false);
+
+ if (ie) {
+ // TODO continue
+ }
+
+
+ // TODO continue
+ return 0;
+}
+
+
+static
+int ngap_gNB_handle_initial_context_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ int i;
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ MessageDef *message_p = NULL;
+ NGAP_InitialContextSetupRequest_t *container;
+ NGAP_InitialContextSetupRequestIEs_t *ie;
+ NGAP_RAN_UE_NGAP_ID_t ran_ue_ngap_id;
+ uint64_t amf_ue_ngap_id;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.InitialContextSetupRequest;
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received initial context setup request for non "
+ "existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+ /* id-AMF-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ } else {
+ return -1;
+ }
+
+ /* id-RAN-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ ran_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(amf_desc_p->ngap_gNB_instance,
+ ran_ue_ngap_id)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received initial context setup request for non "
+ "existing UE context 0x%06lx\n", assoc_id,
+ ran_ue_ngap_id);
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+
+ /* Initial context request = UE-related procedure -> stream != 0 */
+ if (stream == 0) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ ue_desc_p->rx_stream = stream;
+ ue_desc_p->amf_ue_ngap_id = amf_ue_ngap_id;
+
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_INITIAL_CONTEXT_SETUP_REQ);
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id;
+ ue_desc_p->ue_initial_id = 0;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).gNB_ue_ngap_id = ue_desc_p->gNB_ue_ngap_id;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).amf_ue_ngap_id = ue_desc_p->amf_ue_ngap_id;
+ /* id-UEAggregateMaximumBitRate */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_UEAggregateMaximumBitRate, false);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ asn_INTEGER2ulong(&(ie->value.choice.UEAggregateMaximumBitRate.uEAggregateMaximumBitRateUL),
+ &(NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).ue_ambr.br_ul));
+ asn_INTEGER2ulong(&(ie->value.choice.UEAggregateMaximumBitRate.uEAggregateMaximumBitRateDL),
+ &(NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).ue_ambr.br_dl));
+ } else {
+ NGAP_ERROR("could not found NGAP_ProtocolIE_ID_id_UEAggregateMaximumBitRate\n");
+ }
+
+
+ /* id-GUAMI */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_GUAMI, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ TBCD_TO_MCC_MNC(&ie->value.choice.GUAMI.pLMNIdentity, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.mcc,
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.mnc, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.mnc_len);
+
+ OCTET_STRING_TO_INT8(&ie->value.choice.GUAMI.aMFRegionID, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.amf_region_id);
+ OCTET_STRING_TO_INT16(&ie->value.choice.GUAMI.aMFSetID, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.amf_set_id);
+ OCTET_STRING_TO_INT8(&ie->value.choice.GUAMI.aMFPointer, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).guami.amf_pointer);
+ } else {/* ie != NULL */
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListCxtReq, false);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nb_of_pdusessions =
+ ie->value.choice.PDUSessionResourceSetupListCxtReq.list.count;
+
+ for (i = 0; i < ie->value.choice.PDUSessionResourceSetupListCxtReq.list.count; i++) {
+ NGAP_PDUSessionResourceSetupItemCxtReq_t *item_p;
+ asn_dec_rval_t dec_rval;
+ NGAP_PDUSessionResourceSetupRequestTransfer_t *pdusessionTransfer_p = NULL;
+ NGAP_PDUSessionResourceSetupRequestTransferIEs_t *pdusessionTransfer_ies = NULL;
+
+ item_p = (NGAP_PDUSessionResourceSetupItemCxtReq_t *)ie->value.choice.PDUSessionResourceSetupListCxtReq.list.array[i];
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].pdusession_id = item_p->pDUSessionID;
+
+ if (item_p->nAS_PDU != NULL) {
+ /* Only copy NAS pdu if present */
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nas_pdu.length = item_p->nAS_PDU->size;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nas_pdu.buffer =
+ malloc(sizeof(uint8_t) * item_p->nAS_PDU->size);
+ memcpy(NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nas_pdu.buffer,
+ item_p->nAS_PDU->buf, item_p->nAS_PDU->size);
+ NGAP_DEBUG("Received NAS message with the PDUSESSION setup procedure\n");
+ } else {
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nas_pdu.length = 0;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nas_pdu.buffer = NULL;
+ }
+
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NGAP_PDUSessionResourceSetupRequestTransfer,
+ (void **)&pdusessionTransfer_p,
+ item_p->pDUSessionResourceSetupRequestTransfer.buf,
+ item_p->pDUSessionResourceSetupRequestTransfer.size, 0, 0);
+
+ if(dec_rval.code != RC_OK) {
+ NGAP_ERROR("could not decode PDUSessionResourceSetupRequestTransfer\n");
+ return -1;
+ }
+
+ for(int j=0; j< pdusessionTransfer_p->protocolIEs.list.count; j++) {
+ pdusessionTransfer_ies = pdusessionTransfer_p->protocolIEs.list.array[j];
+ switch(pdusessionTransfer_ies->id) {
+ /* optional PDUSessionAggregateMaximumBitRate */
+ case NGAP_ProtocolIE_ID_id_PDUSessionAggregateMaximumBitRate:
+ break;
+
+ /* mandatory UL-NGU-UP-TNLInformation */
+ case NGAP_ProtocolIE_ID_id_UL_NGU_UP_TNLInformation:
+ {
+ NGAP_GTPTunnel_t *gTPTunnel_p;
+ gTPTunnel_p = pdusessionTransfer_ies->value.choice.UPTransportLayerInformation.choice.gTPTunnel;
+
+ /* Set the transport layer address */
+ memcpy(NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].upf_addr.buffer,
+ gTPTunnel_p->transportLayerAddress.buf, gTPTunnel_p->transportLayerAddress.size);
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].upf_addr.length =
+ gTPTunnel_p->transportLayerAddress.size * 8 - gTPTunnel_p->transportLayerAddress.bits_unused;
+
+ /* GTP tunnel endpoint ID */
+ OCTET_STRING_TO_INT32(&gTPTunnel_p->gTP_TEID, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].gtp_teid);
+ }
+
+ break;
+
+ /* optional AdditionalUL-NGU-UP-TNLInformation */
+ case NGAP_ProtocolIE_ID_id_AdditionalUL_NGU_UP_TNLInformation:
+ break;
+
+ /* optional DataForwardingNotPossible */
+ case NGAP_ProtocolIE_ID_id_DataForwardingNotPossible:
+ break;
+
+ /* mandatory PDUSessionType */
+ case NGAP_ProtocolIE_ID_id_PDUSessionType:
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].upf_addr.pdu_session_type = (uint8_t)pdusessionTransfer_ies->value.choice.PDUSessionType;
+ break;
+
+ /* optional SecurityIndication */
+ case NGAP_ProtocolIE_ID_id_SecurityIndication:
+ break;
+
+ /* optional NetworkInstance */
+ case NGAP_ProtocolIE_ID_id_NetworkInstance:
+ break;
+
+ /* mandatory QosFlowSetupRequestList */
+ case NGAP_ProtocolIE_ID_id_QosFlowSetupRequestList:
+ {
+ NGAP_QosFlowSetupRequestItem_t *qosFlowItem_p;
+
+ NGAP_DEBUG("QosFlowSetupRequestList.list.count %d\n", pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count > 0);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count <= NGAP_maxnoofQosFlows);
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].nb_qos = pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count;
+
+ for(int qosIdx = 0; qosIdx < pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count; qosIdx++) {
+ qosFlowItem_p = pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.array[qosIdx];
+
+ /* Set the QOS informations */
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].qci = (uint8_t)qosFlowItem_p->qosFlowIdentifier;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].allocation_retention_priority.priority_level =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.priorityLevelARP;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].allocation_retention_priority.pre_emp_capability =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.pre_emptionCapability;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).pdusession_param[i].qos[qosIdx].allocation_retention_priority.pre_emp_vulnerability =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.pre_emptionVulnerability;
+ }
+ }
+
+ break;
+
+ /* optional CommonNetworkInstance */
+ case NGAP_ProtocolIE_ID_id_CommonNetworkInstance:
+ break;
+
+ default:
+ NGAP_ERROR("could not found protocolIEs id %ld\n", pdusessionTransfer_ies->id);
+ return -1;
+ }
+ }
+
+ } /* for i... */
+ } else {/* ie != NULL */
+ NGAP_ERROR("could not found NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListCxtReq\n");
+ }
+
+ /* id-AllowedNSSAI */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AllowedNSSAI, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_AllowedNSSAI_Item_t *allow_nssai_item_p = NULL;
+
+ NGAP_DEBUG("AllowedNSSAI.list.count %d\n", ie->value.choice.AllowedNSSAI.list.count);
+ DevAssert(ie->value.choice.AllowedNSSAI.list.count > 0);
+ DevAssert(ie->value.choice.AllowedNSSAI.list.count <= NGAP_maxnoofAllowedS_NSSAIs);
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nb_allowed_nssais = ie->value.choice.AllowedNSSAI.list.count;
+
+ for(i = 0; i < ie->value.choice.AllowedNSSAI.list.count; i++) {
+ allow_nssai_item_p = ie->value.choice.AllowedNSSAI.list.array[i];
+
+ OCTET_STRING_TO_INT8(&allow_nssai_item_p->s_NSSAI.sST, NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sST);
+
+ if(allow_nssai_item_p->s_NSSAI.sD != NULL) {
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sD_flag = 1;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sD[0] = allow_nssai_item_p->s_NSSAI.sD->buf[0];
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sD[1] = allow_nssai_item_p->s_NSSAI.sD->buf[1];
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).allowed_nssai[i].sD[2] = allow_nssai_item_p->s_NSSAI.sD->buf[2];
+ }
+ }
+ } else {/* ie != NULL */
+ return -1;
+ }
+
+ /* id-UESecurityCapabilities */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_UESecurityCapabilities, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).security_capabilities.nRencryption_algorithms =
+ BIT_STRING_to_uint16(&ie->value.choice.UESecurityCapabilities.nRencryptionAlgorithms);
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).security_capabilities.nRintegrity_algorithms =
+ BIT_STRING_to_uint16(&ie->value.choice.UESecurityCapabilities.nRintegrityProtectionAlgorithms);
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).security_capabilities.eUTRAencryption_algorithms =
+ BIT_STRING_to_uint16(&ie->value.choice.UESecurityCapabilities.eUTRAencryptionAlgorithms);
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).security_capabilities.eUTRAintegrity_algorithms =
+ BIT_STRING_to_uint16(&ie->value.choice.UESecurityCapabilities.eUTRAintegrityProtectionAlgorithms);
+ /* id-SecurityKey : Copy the security key */
+ } else {/* ie != NULL */
+ return -1;
+ }
+
+ /* id-MobilityRestrictionList */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_SecurityKey, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ memcpy(&NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).security_key,
+ ie->value.choice.SecurityKey.buf, ie->value.choice.SecurityKey.size);
+
+ } else {/* ie != NULL */
+ return -1;
+ }
+
+ /* id-NAS-PDU */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_MobilityRestrictionList, false);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_MobilityRestrictionList_t *mobility_rest_list_p = NULL;
+ mobility_rest_list_p = &ie->value.choice.MobilityRestrictionList;
+
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).mobility_restriction_flag = 1;
+ TBCD_TO_MCC_MNC(&mobility_rest_list_p->servingPLMN,
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).mobility_restriction.serving_plmn.mcc,
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).mobility_restriction.serving_plmn.mnc,
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).mobility_restriction.serving_plmn.mnc_digit_length);
+ }
+
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_InitialContextSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_NAS_PDU, false);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ if(ie->value.choice.NAS_PDU.size > 0) {
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nas_pdu_flag = 1;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nas_pdu.length = ie->value.choice.NAS_PDU.size;
+ NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nas_pdu.buffer = malloc(sizeof(uint8_t) * ie->value.choice.NAS_PDU.size);
+ memcpy(NGAP_INITIAL_CONTEXT_SETUP_REQ(message_p).nas_pdu.buffer,
+ ie->value.choice.NAS_PDU.buf, ie->value.choice.NAS_PDU.size);
+ }
+
+ }
+
+ itti_send_msg_to_task(TASK_RRC_GNB, ue_desc_p->gNB_instance->instance, message_p);
+
+ return 0;
+}
+
+
+static
+int ngap_gNB_handle_ue_context_release_command(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ MessageDef *message_p = NULL;
+ uint64_t amf_ue_ngap_id;
+ NGAP_RAN_UE_NGAP_ID_t gnb_ue_ngap_id;
+ NGAP_UEContextReleaseCommand_t *container;
+ NGAP_UEContextReleaseCommand_IEs_t *ie;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received UE context release command for non "
+ "existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_UEContextReleaseCommand_IEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_UE_NGAP_IDs, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ switch (ie->value.choice.UE_NGAP_IDs.present) {
+ case NGAP_UE_NGAP_IDs_PR_uE_NGAP_ID_pair:
+ gnb_ue_ngap_id = ie->value.choice.UE_NGAP_IDs.choice.uE_NGAP_ID_pair->rAN_UE_NGAP_ID;
+ asn_INTEGER2ulong(&(ie->value.choice.UE_NGAP_IDs.choice.uE_NGAP_ID_pair->aMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ MSC_LOG_RX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ NULL,0,
+ "0 UEContextRelease/%s gNB_ue_ngap_id "NGAP_UE_ID_FMT" amf_ue_ngap_id "NGAP_UE_ID_FMT" len %u",
+ ngap_direction2String(pdu->present - 1),
+ gnb_ue_ngap_id,
+ amf_ue_ngap_id);
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(amf_desc_p->ngap_gNB_instance,
+ gnb_ue_ngap_id)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received UE context release command for non "
+ "existing UE context 0x%06lx\n",
+ assoc_id,
+ gnb_ue_ngap_id);
+ return -1;
+ } else {
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_RRC_GNB,
+ NULL,0,
+ "0 NGAP_UE_CONTEXT_RELEASE_COMMAND/%d gNB_ue_ngap_id "NGAP_UE_ID_FMT" ",
+ gnb_ue_ngap_id);
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_UE_CONTEXT_RELEASE_COMMAND);
+
+ if (ue_desc_p->amf_ue_ngap_id == 0) { // case of Detach Request and switch off from RRC_IDLE mode
+ ue_desc_p->amf_ue_ngap_id = amf_ue_ngap_id;
+ }
+
+ NGAP_UE_CONTEXT_RELEASE_COMMAND(message_p).gNB_ue_ngap_id = gnb_ue_ngap_id;
+ itti_send_msg_to_task(TASK_RRC_GNB, ue_desc_p->gNB_instance->instance, message_p);
+ return 0;
+ }
+
+ break;
+
+ //#warning "TODO mapping amf_ue_ngap_id gnb_ue_ngap_id?"
+
+ case NGAP_UE_NGAP_IDs_PR_aMF_UE_NGAP_ID:
+ asn_INTEGER2ulong(&(ie->value.choice.UE_NGAP_IDs.choice.aMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ NGAP_ERROR("TO DO mapping amf_ue_ngap_id gnb_ue_ngap_id");
+ (void)amf_ue_ngap_id; /* TODO: remove - it's to remove gcc warning about unused var */
+
+ case NGAP_UE_NGAP_IDs_PR_NOTHING:
+ default:
+ NGAP_ERROR("NGAP_UE_CONTEXT_RELEASE_COMMAND not processed, missing info elements");
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_UEContextReleaseCommand_IEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_Cause, true);
+ /* TBD */
+
+ return 0;
+}
+
+static
+int ngap_gNB_handle_pdusession_setup_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+// NGAP_AMF_UE_NGAP_ID_t amf_ue_ngap_id;
+ uint64_t amf_ue_ngap_id;
+ NGAP_RAN_UE_NGAP_ID_t ran_ue_ngap_id;
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ MessageDef *message_p = NULL;
+ NGAP_PDUSessionResourceSetupRequest_t *container;
+ NGAP_PDUSessionResourceSetupRequestIEs_t *ie;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.PDUSessionResourceSetupRequest;
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received pdu session resource setup request for non "
+ "existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+ /* id-AMF-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ } else {
+ return -1;
+ }
+
+ /* id-gNB-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ ran_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
+ } else {
+ return -1;
+ }
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(amf_desc_p->ngap_gNB_instance,
+ ran_ue_ngap_id)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received pdu session resource setup request for non "
+ "existing UE context 0x%06lx\n", assoc_id,
+ ran_ue_ngap_id);
+ return -1;
+ }
+
+ /* Initial context request = UE-related procedure -> stream != 0 */
+ if (stream == 0) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ ue_desc_p->rx_stream = stream;
+
+ if ( ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
+ NGAP_WARN("UE context amf_ue_ngap_id is different form that of the message (%lu != %lu)",
+ (uint64_t)ue_desc_p->amf_ue_ngap_id, amf_ue_ngap_id);
+ }
+
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_PDUSESSION_SETUP_REQ);
+ NGAP_PDUSESSION_SETUP_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id;
+ ue_desc_p->ue_initial_id = 0;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).gNB_ue_ngap_id = ue_desc_p->gNB_ue_ngap_id;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).amf_ue_ngap_id = ue_desc_p->amf_ue_ngap_id;
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceSetupRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_PDUSESSION_SETUP_REQ(message_p).nb_pdusessions_tosetup =
+ ie->value.choice.PDUSessionResourceSetupListSUReq.list.count;
+
+ for (int i = 0; i < ie->value.choice.PDUSessionResourceSetupListSUReq.list.count; i++) {
+ NGAP_PDUSessionResourceSetupItemSUReq_t *item_p;
+ asn_dec_rval_t dec_rval;
+ NGAP_PDUSessionResourceSetupRequestTransfer_t *pdusessionTransfer_p = NULL;
+ NGAP_PDUSessionResourceSetupRequestTransferIEs_t *pdusessionTransfer_ies = NULL;
+
+ item_p = (NGAP_PDUSessionResourceSetupItemSUReq_t *)ie->value.choice.PDUSessionResourceSetupListSUReq.list.array[i];
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].pdusession_id = item_p->pDUSessionID;
+
+
+ // check for the NAS PDU
+ if (item_p->pDUSessionNAS_PDU->size > 0 ) {
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.length = item_p->pDUSessionNAS_PDU->size;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->pDUSessionNAS_PDU->size);
+ memcpy(NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.buffer,
+ item_p->pDUSessionNAS_PDU->buf, item_p->pDUSessionNAS_PDU->size);
+ // NGAP_INFO("received a NAS PDU with size %d (%02x.%02x)\n",NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.length, item_p->nAS_PDU.buf[0], item_p->nAS_PDU.buf[1]);
+ } else {
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.length = 0;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nas_pdu.buffer = NULL;
+ NGAP_WARN("NAS PDU is not provided, generate a PDUSESSION_SETUP Failure (TBD) back to AMF \n");
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NGAP_PDUSessionResourceSetupRequestTransfer,
+ (void **)&pdusessionTransfer_p,
+ item_p->pDUSessionResourceSetupRequestTransfer.buf,
+ item_p->pDUSessionResourceSetupRequestTransfer.size, 0, 0);
+
+ if(dec_rval.code != RC_OK) {
+ NGAP_ERROR("could not decode PDUSessionResourceSetupRequestTransfer\n");
+ return -1;
+ }
+
+ for(int j=0; j< pdusessionTransfer_p->protocolIEs.list.count; j++) {
+ pdusessionTransfer_ies = pdusessionTransfer_p->protocolIEs.list.array[j];
+
+ switch(pdusessionTransfer_ies->id) {
+ /* optional PDUSessionAggregateMaximumBitRate */
+ case NGAP_ProtocolIE_ID_id_PDUSessionAggregateMaximumBitRate:
+ break;
+
+ /* mandatory UL-NGU-UP-TNLInformation */
+ case NGAP_ProtocolIE_ID_id_UL_NGU_UP_TNLInformation:
+ {
+ NGAP_GTPTunnel_t *gTPTunnel_p;
+ gTPTunnel_p = pdusessionTransfer_ies->value.choice.UPTransportLayerInformation.choice.gTPTunnel;
+ /* The transport layer address for the IP packets */
+ OCTET_STRING_TO_INT32(&gTPTunnel_p->gTP_TEID, NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].gtp_teid);
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].upf_addr.length =
+ gTPTunnel_p->transportLayerAddress.size * 8 - gTPTunnel_p->transportLayerAddress.bits_unused;
+ memcpy(NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].upf_addr.buffer ,
+ gTPTunnel_p->transportLayerAddress.buf, gTPTunnel_p->transportLayerAddress.size);
+ }
+ break;
+
+ /* optional AdditionalUL-NGU-UP-TNLInformation */
+ case NGAP_ProtocolIE_ID_id_AdditionalUL_NGU_UP_TNLInformation:
+ break;
+
+ /* optional DataForwardingNotPossible */
+ case NGAP_ProtocolIE_ID_id_DataForwardingNotPossible:
+ break;
+
+ /* mandatory PDUSessionType */
+ case NGAP_ProtocolIE_ID_id_PDUSessionType:
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].upf_addr.pdu_session_type = (uint8_t)pdusessionTransfer_ies->value.choice.PDUSessionType;
+ break;
+
+ /* optional SecurityIndication */
+ case NGAP_ProtocolIE_ID_id_SecurityIndication:
+ break;
+
+ /* optional NetworkInstance */
+ case NGAP_ProtocolIE_ID_id_NetworkInstance:
+ break;
+
+ /* mandatory QosFlowSetupRequestList */
+ case NGAP_ProtocolIE_ID_id_QosFlowSetupRequestList:
+ {
+ NGAP_QosFlowSetupRequestItem_t *qosFlowItem_p;
+
+ NGAP_DEBUG("servedGUAMIs.list.count %d\n", pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count > 0);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count <= NGAP_maxnoofQosFlows);
+
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].nb_qos = pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count;
+
+ for(int qosIdx = 0; qosIdx < pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.count; qosIdx++){
+ qosFlowItem_p = pdusessionTransfer_ies->value.choice.QosFlowSetupRequestList.list.array[qosIdx];
+
+ /* Set the QOS informations */
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos[qosIdx].qci = (uint8_t)qosFlowItem_p->qosFlowIdentifier;
+
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos[qosIdx].allocation_retention_priority.priority_level =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.priorityLevelARP;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos[qosIdx].allocation_retention_priority.pre_emp_capability =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.pre_emptionCapability;
+ NGAP_PDUSESSION_SETUP_REQ(message_p).pdusession_setup_params[i].qos[qosIdx].allocation_retention_priority.pre_emp_vulnerability =
+ qosFlowItem_p->qosFlowLevelQosParameters.allocationAndRetentionPriority.pre_emptionVulnerability;
+ }
+ }
+ break;
+
+ /* optional CommonNetworkInstance */
+ case NGAP_ProtocolIE_ID_id_CommonNetworkInstance:
+ break;
+
+ default:
+ NGAP_ERROR("could not found protocolIEs id %ld\n", pdusessionTransfer_ies->id);
+ return -1;
+ }
+ }/* for j... */
+ } /* for i... */
+ itti_send_msg_to_task(TASK_RRC_GNB, ue_desc_p->gNB_instance->instance, message_p);
+ }else {/* ie == NULL */
+ NGAP_ERROR("could not found NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSUReq\n");
+ return -1;
+ }
+ return 0;
+}
+
+
+static
+int ngap_gNB_handle_paging(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_instance_t *ngap_gNB_instance = NULL;
+ MessageDef *message_p = NULL;
+ NGAP_Paging_t *container;
+ NGAP_PagingIEs_t *ie;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.Paging;
+ // received Paging Message from AMF
+ NGAP_DEBUG("[SCTP %d] Received Paging Message From AMF\n",assoc_id);
+
+ /* Paging procedure -> stream != 0 */
+ if (stream == 0) {
+ LOG_W(NGAP,"[SCTP %d] Received Paging procedure on stream (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received Paging for non "
+ "existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+ ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
+
+ if (ngap_gNB_instance == NULL) {
+ NGAP_ERROR("[SCTP %d] Received Paging for non existing AMF context : ngap_gNB_instance is NULL\n",
+ assoc_id);
+ return -1;
+ }
+
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_PAGING_IND);
+ /* convert NGAP_PagingIEs_t to ngap_paging_ind_t */
+ /* id-UEIdentityIndexValue : convert UE Identity Index value */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PagingIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_UEPagingIdentity, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ OCTET_STRING_TO_INT16(&ie->value.choice.UEPagingIdentity.choice.fiveG_S_TMSI->aMFSetID, NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_set_id);
+ OCTET_STRING_TO_INT8(&ie->value.choice.UEPagingIdentity.choice.fiveG_S_TMSI->aMFPointer, NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_pointer);
+ OCTET_STRING_TO_INT32(&ie->value.choice.UEPagingIdentity.choice.fiveG_S_TMSI->fiveG_TMSI, NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.m_tmsi);
+
+ NGAP_DEBUG("[SCTP %d] Received Paging Identity amf_set_id %d, amf_pointer %d, m_tmsi %d\n",
+ assoc_id,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_set_id,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_pointer,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.m_tmsi);
+ } else {
+ return -1;
+ }
+
+
+ NGAP_PAGING_IND(message_p).paging_drx = NGAP_PAGING_DRX_256;
+ /* id-pagingDRX */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PagingIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PagingDRX, false);
+
+ /* optional */
+ if (ie) {
+ NGAP_PAGING_IND(message_p).paging_drx = ie->value.choice.PagingDRX;
+ } else {
+ NGAP_PAGING_IND(message_p).paging_drx = NGAP_PAGING_DRX_256;
+ }
+
+ memset (&NGAP_PAGING_IND(message_p).plmn_identity[0], 0, sizeof(plmn_identity_t)*256);
+ memset (&NGAP_PAGING_IND(message_p).tac[0], 0, sizeof(int16_t)*256);
+ NGAP_PAGING_IND(message_p).tai_size = 0;
+ /* id-TAIList */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PagingIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_TAIListForPaging, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_INFO("[SCTP %d] Received Paging taiList For Paging: count %d\n", assoc_id, ie->value.choice.TAIListForPaging.list.count);
+
+ for (int i = 0; i < ie->value.choice.TAIListForPaging.list.count; i++) {
+ NGAP_TAIListForPagingItem_t *item_p;
+ item_p = (NGAP_TAIListForPagingItem_t *)ie->value.choice.TAIListForPaging.list.array[i];
+ TBCD_TO_MCC_MNC(&(item_p->tAI.pLMNIdentity), NGAP_PAGING_IND(message_p).plmn_identity[i].mcc,
+ NGAP_PAGING_IND(message_p).plmn_identity[i].mnc,
+ NGAP_PAGING_IND(message_p).plmn_identity[i].mnc_digit_length);
+ OCTET_STRING_TO_INT16(&(item_p->tAI.tAC), NGAP_PAGING_IND(message_p).tac[i]);
+ NGAP_PAGING_IND(message_p).tai_size++;
+ NGAP_DEBUG("[SCTP %d] Received Paging: MCC %d, MNC %d, TAC %d\n", assoc_id,
+ NGAP_PAGING_IND(message_p).plmn_identity[i].mcc,
+ NGAP_PAGING_IND(message_p).plmn_identity[i].mnc,
+ NGAP_PAGING_IND(message_p).tac[i]);
+ }
+ } else {
+ return -1;
+ }
+
+ //paging parameter values
+ NGAP_DEBUG("[SCTP %d] Received Paging parameters: Paging Identity amf_set_id %d amf_pointer %d m_tmsi %d paging_drx %d paging_priority %d\n",assoc_id,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_set_id,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.amf_pointer,
+ NGAP_PAGING_IND(message_p).ue_paging_identity.s_tmsi.m_tmsi,
+ NGAP_PAGING_IND(message_p).paging_drx, NGAP_PAGING_IND(message_p).paging_priority);
+ /* send message to RRC */
+ itti_send_msg_to_task(TASK_RRC_GNB, ngap_gNB_instance->instance, message_p);
+
+ return 0;
+}
+
+static
+int ngap_gNB_handle_pdusession_modify_request(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ int i, nb_of_pdusessions_failed;
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ MessageDef *message_p = NULL;
+ NGAP_PDUSessionResourceModifyRequest_t *container;
+ NGAP_PDUSessionResourceModifyRequestIEs_t *ie;
+ NGAP_RAN_UE_NGAP_ID_t gnb_ue_ngap_id;
+ uint64_t amf_ue_ngap_id;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.PDUSessionResourceModifyRequest;
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received PDUSession Resource modify request for non "
+ "existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+ /* id-AMF-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceModifyRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ } else {
+ return -1;
+ }
+
+ /* id-RAN-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceModifyRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ gnb_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
+ } else {
+ return -1;
+ }
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(amf_desc_p->ngap_gNB_instance,
+ gnb_ue_ngap_id)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received PDUSession Resource modify request for non "
+ "existing UE context 0x%08lx\n", assoc_id,
+ gnb_ue_ngap_id);
+ return -1;
+ }
+
+ /* PDUSession Resource modify request = UE-related procedure -> stream != 0 */
+ if (stream == 0) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ ue_desc_p->rx_stream = stream;
+
+ if (ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
+ NGAP_WARN("UE context amf_ue_ngap_id is different form that of the message (%ld != %ld)",
+ (uint64_t)ue_desc_p->amf_ue_ngap_id, amf_ue_ngap_id);
+ message_p = itti_alloc_new_message (TASK_RRC_GNB, NGAP_PDUSESSION_MODIFY_RESP);
+ NGAP_PDUSESSION_MODIFY_RESP (message_p).gNB_ue_ngap_id = gnb_ue_ngap_id;
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceModifyRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PDUSessionResourceModifyListModReq, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ for(nb_of_pdusessions_failed = 0; nb_of_pdusessions_failed < ie->value.choice.PDUSessionResourceModifyListModReq.list.count; nb_of_pdusessions_failed++) {
+ NGAP_PDUSessionResourceModifyItemModReq_t *item_p;
+ item_p = (NGAP_PDUSessionResourceModifyItemModReq_t *)ie->value.choice.PDUSessionResourceModifyListModReq.list.array[nb_of_pdusessions_failed];
+
+ NGAP_PDUSESSION_MODIFY_RESP(message_p).pdusessions_failed[nb_of_pdusessions_failed].pdusession_id = item_p->pDUSessionID;
+ NGAP_PDUSESSION_MODIFY_RESP(message_p).pdusessions_failed[nb_of_pdusessions_failed].cause = NGAP_Cause_PR_radioNetwork;
+ NGAP_PDUSESSION_MODIFY_RESP(message_p).pdusessions_failed[nb_of_pdusessions_failed].cause_value = NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID;
+ }
+ } else {
+ return -1;
+ }
+
+ NGAP_PDUSESSION_MODIFY_RESP(message_p).nb_of_pdusessions_failed = nb_of_pdusessions_failed;
+ ngap_gNB_pdusession_modify_resp(amf_desc_p->ngap_gNB_instance->instance,
+ &NGAP_PDUSESSION_MODIFY_RESP(message_p));
+ itti_free(TASK_RRC_GNB,message_p);
+ message_p = NULL;
+ return -1;
+ }
+
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_PDUSESSION_MODIFY_REQ);
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).amf_ue_ngap_id = amf_ue_ngap_id;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).gNB_ue_ngap_id = gnb_ue_ngap_id;
+ /* id-PDUSessionResourceModifyListModReq */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceModifyRequestIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PDUSessionResourceModifyListModReq, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).nb_pdusessions_tomodify =
+ ie->value.choice.PDUSessionResourceModifyListModReq.list.count;
+
+ for (i = 0; i < ie->value.choice.PDUSessionResourceModifyListModReq.list.count; i++) {
+ NGAP_PDUSessionResourceModifyItemModReq_t *item_p;
+ asn_dec_rval_t dec_rval;
+ NGAP_PDUSessionResourceModifyRequestTransfer_t *pdusessionTransfer_p = NULL;
+ NGAP_PDUSessionResourceModifyRequestTransferIEs_t *pdusessionTransfer_ies = NULL;
+
+ item_p = (NGAP_PDUSessionResourceModifyItemModReq_t *)ie->value.choice.PDUSessionResourceModifyListModReq.list.array[i];
+
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].pdusession_id = item_p->pDUSessionID;
+
+ // check for the NAS PDU
+ if (item_p->nAS_PDU != NULL && item_p->nAS_PDU->size > 0 ) {
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nas_pdu.length = item_p->nAS_PDU->size;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU->size);
+ memcpy(NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nas_pdu.buffer,
+ item_p->nAS_PDU->buf, item_p->nAS_PDU->size);
+ } else {
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nas_pdu.length = 0;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nas_pdu.buffer = NULL;
+ continue;
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NGAP_PDUSessionResourceModifyRequestTransfer,
+ (void **)&pdusessionTransfer_p,
+ item_p->pDUSessionResourceModifyRequestTransfer.buf,
+ item_p->pDUSessionResourceModifyRequestTransfer.size, 0, 0);
+
+ if(dec_rval.code != RC_OK) {
+ NGAP_ERROR("could not decode PDUSessionResourceModifyRequestTransfer\n");
+ return -1;
+ }
+
+ for(int j=0; j< pdusessionTransfer_p->protocolIEs.list.count; j++) {
+ pdusessionTransfer_ies = pdusessionTransfer_p->protocolIEs.list.array[j];
+ switch(pdusessionTransfer_ies->id) {
+ /* optional PDUSessionAggregateMaximumBitRate */
+ case NGAP_ProtocolIE_ID_id_PDUSessionAggregateMaximumBitRate:
+ break;
+
+ /* optional UL-NGU-UP-TNLModifyList */
+ case NGAP_ProtocolIE_ID_id_UL_NGU_UP_TNLModifyList:
+ break;
+
+ /* optional NetworkInstance */
+ case NGAP_ProtocolIE_ID_id_NetworkInstance:
+ break;
+
+ /* optional QosFlowAddOrModifyRequestList */
+ case NGAP_ProtocolIE_ID_id_QosFlowAddOrModifyRequestList:
+ {
+ NGAP_QosFlowAddOrModifyRequestItem_t *qosFlowItem_p;
+
+ NGAP_DEBUG("QosFlowAddOrModifyRequestList.list.count %d\n", pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.count);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.count > 0);
+ DevAssert(pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.count <= NGAP_maxnoofQosFlows);
+
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].nb_qos = pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.count;
+
+ for(int qosIdx = 0; qosIdx < pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.count; qosIdx++) {
+ qosFlowItem_p = pdusessionTransfer_ies->value.choice.QosFlowAddOrModifyRequestList.list.array[qosIdx];
+
+ /* Set the QOS informations */
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].qos[qosIdx].qci = (uint8_t)qosFlowItem_p->qosFlowIdentifier;
+ if(qosFlowItem_p->qosFlowLevelQosParameters) {
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].qos[qosIdx].allocation_retention_priority.priority_level =
+ qosFlowItem_p->qosFlowLevelQosParameters->allocationAndRetentionPriority.priorityLevelARP;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].qos[qosIdx].allocation_retention_priority.pre_emp_capability =
+ qosFlowItem_p->qosFlowLevelQosParameters->allocationAndRetentionPriority.pre_emptionCapability;
+ NGAP_PDUSESSION_MODIFY_REQ(message_p).pdusession_modify_params[i].qos[qosIdx].allocation_retention_priority.pre_emp_vulnerability =
+ qosFlowItem_p->qosFlowLevelQosParameters->allocationAndRetentionPriority.pre_emptionVulnerability;
+ }
+ }
+ }
+ break;
+
+ /* optional QosFlowToReleaseList */
+ case NGAP_ProtocolIE_ID_id_QosFlowToReleaseList:
+ break;
+
+ /* optional AdditionalUL-NGU-UP-TNLInformation */
+ case NGAP_ProtocolIE_ID_id_AdditionalUL_NGU_UP_TNLInformation:
+ break;
+
+ /* optional CommonNetworkInstance */
+ case NGAP_ProtocolIE_ID_id_CommonNetworkInstance:
+ break;
+
+ default:
+ NGAP_ERROR("could not found protocolIEs id %ld\n", pdusessionTransfer_ies->id);
+ return -1;
+ }
+ }
+ }
+
+ itti_send_msg_to_task(TASK_RRC_GNB, ue_desc_p->gNB_instance->instance, message_p);
+ } else { /* of if (ie != NULL)*/
+ return -1;
+ }
+
+ return 0;
+}
+// handle e-rab release command and send it to rrc_end
+static
+int ngap_gNB_handle_pdusession_release_command(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ int i;
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ MessageDef *message_p = NULL;
+ NGAP_PDUSessionResourceReleaseCommand_t *container;
+ NGAP_PDUSessionResourceReleaseCommandIEs_t *ie;
+ NGAP_RAN_UE_NGAP_ID_t gnb_ue_ngap_id;
+ uint64_t amf_ue_ngap_id;
+ DevAssert(pdu != NULL);
+ container = &pdu->choice.initiatingMessage->value.choice.PDUSessionResourceReleaseCommand;
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received E-RAB release command for non existing AMF context\n", assoc_id);
+ return -1;
+ }
+
+
+ /* id-AMF-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceReleaseCommandIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+ } else {
+ return -1;
+ }
+
+ /* id-RAN-UE-NGAP-ID */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceReleaseCommandIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ gnb_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
+ } else {
+ return -1;
+ }
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(amf_desc_p->ngap_gNB_instance,
+ gnb_ue_ngap_id)) == NULL) {
+ NGAP_ERROR("[SCTP %d] Received PDUSession Resource release command for non existing UE context 0x%08lx\n", assoc_id,
+ ie->value.choice.RAN_UE_NGAP_ID);
+ return -1;
+ }
+
+ /* Initial context request = UE-related procedure -> stream != 0 */
+ if (stream == 0) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n",
+ assoc_id, stream);
+ return -1;
+ }
+
+ ue_desc_p->rx_stream = stream;
+
+ if (ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
+ NGAP_WARN("UE context amf_ue_ngap_id is different form that of the message (%lu != %lu)",
+ (uint64_t)ue_desc_p->amf_ue_ngap_id, amf_ue_ngap_id);
+ }
+
+ NGAP_DEBUG("[SCTP %d] Received E-RAB release command for gNB_UE_NGAP_ID %lu amf_ue_ngap_id %lu\n",
+ assoc_id, gnb_ue_ngap_id, amf_ue_ngap_id);
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_PDUSESSION_RELEASE_COMMAND);
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).gNB_ue_ngap_id = gnb_ue_ngap_id;
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).amf_ue_ngap_id = amf_ue_ngap_id;
+ /* id-NAS-PDU */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceReleaseCommandIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_NAS_PDU, false);
+
+ if(ie && ie->value.choice.NAS_PDU.size > 0) {
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nas_pdu.length = ie->value.choice.NAS_PDU.size;
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nas_pdu.buffer = malloc(sizeof(uint8_t) * ie->value.choice.NAS_PDU.size);
+ memcpy(NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nas_pdu.buffer,
+ ie->value.choice.NAS_PDU.buf,
+ ie->value.choice.NAS_PDU.size);
+ } else {
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nas_pdu.length = 0;
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nas_pdu.buffer = NULL;
+ }
+
+ /* id-PDUSessionResourceToReleaseListRelCmd */
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_PDUSessionResourceReleaseCommandIEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_PDUSessionResourceToReleaseListRelCmd, true);
+
+ if (ie != NULL) { /* checked by macro but cppcheck doesn't see it */
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).nb_pdusessions_torelease = ie->value.choice.PDUSessionResourceToReleaseListRelCmd.list.count;
+
+ for (i = 0; i < ie->value.choice.PDUSessionResourceToReleaseListRelCmd.list.count; i++) {
+ NGAP_PDUSessionResourceToReleaseItemRelCmd_t *item_p;
+ item_p = (NGAP_PDUSessionResourceToReleaseItemRelCmd_t *)ie->value.choice.PDUSessionResourceToReleaseListRelCmd.list.array[i];
+
+ NGAP_PDUSESSION_RELEASE_COMMAND(message_p).pdusession_release_params[i].pdusession_id = item_p->pDUSessionID;
+ NGAP_DEBUG("[SCTP] Received E-RAB release command for pDUSessionID id %ld\n", item_p->pDUSessionID);
+ }
+ } else {
+ return -1;
+ }
+
+ itti_send_msg_to_task(TASK_RRC_GNB, ue_desc_p->gNB_instance->instance, message_p);
+
+ return 0;
+}
+
+static
+int ngap_gNB_handle_ng_path_switch_request_ack(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+ // TODO
+ return 0;
+}
+
+static
+int ngap_gNB_handle_ng_path_switch_request_failure(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu) {
+
+ // TODO
+ return 0;
+}
+
+static
+int ngap_gNB_handle_ng_ENDC_pdusession_modification_confirm(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu){
+
+ LOG_W(NGAP, "Implementation of NGAP Pdusession Modification confirm handler is pending...\n");
+ return 0;
+}
+
diff --git a/openair3/NGAP/ngap_gNB_handlers.h b/openair3/NGAP/ngap_gNB_handlers.h
new file mode 100644
index 0000000000..889946dd44
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_handlers.h
@@ -0,0 +1,38 @@
+/*
+ * 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 ngap_gNB_handlers.h
+ * \brief ngap messages handlers for gNB part
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#ifndef NGAP_GNB_HANDLERS_H_
+#define NGAP_GNB_HANDLERS_H_
+
+void ngap_handle_ng_setup_message(ngap_gNB_amf_data_t *amf_desc_p, int sctp_shutdown);
+
+int ngap_gNB_handle_message(uint32_t assoc_id, int32_t stream,
+ const uint8_t * const data, const uint32_t data_length);
+
+#endif /* NGAP_GNB_HANDLERS_H_ */
diff --git a/openair3/NGAP/ngap_gNB_itti_messaging.c b/openair3/NGAP/ngap_gNB_itti_messaging.c
new file mode 100644
index 0000000000..e423d7254d
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_itti_messaging.c
@@ -0,0 +1,85 @@
+/*
+ * 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 ngap_gNB_itti_messaging.c
+ * \brief ngap itti messages handlers for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#include "intertask_interface.h"
+
+#include "ngap_gNB_itti_messaging.h"
+
+void ngap_gNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+ uint32_t buffer_length, uint16_t stream)
+{
+ MessageDef *message_p;
+ sctp_data_req_t *sctp_data_req;
+
+ message_p = itti_alloc_new_message(TASK_NGAP, SCTP_DATA_REQ);
+
+ sctp_data_req = &message_p->ittiMsg.sctp_data_req;
+
+ sctp_data_req->assoc_id = assoc_id;
+ sctp_data_req->buffer = buffer;
+ sctp_data_req->buffer_length = buffer_length;
+ sctp_data_req->stream = stream;
+
+ itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
+void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance,
+ uint16_t ue_initial_id,
+ uint32_t gNB_ue_ngap_id,
+ uint8_t *nas_pdu,
+ uint32_t nas_pdu_length)
+{
+ MessageDef *message_p;
+ ngap_downlink_nas_t *ngap_downlink_nas;
+
+ message_p = itti_alloc_new_message(TASK_NGAP, NGAP_DOWNLINK_NAS);
+
+ ngap_downlink_nas = &message_p->ittiMsg.ngap_downlink_nas;
+
+ ngap_downlink_nas->ue_initial_id = ue_initial_id;
+ ngap_downlink_nas->gNB_ue_ngap_id = gNB_ue_ngap_id;
+ ngap_downlink_nas->nas_pdu.buffer = malloc(sizeof(uint8_t) * nas_pdu_length);
+ memcpy(ngap_downlink_nas->nas_pdu.buffer, nas_pdu, nas_pdu_length);
+ ngap_downlink_nas->nas_pdu.length = nas_pdu_length;
+
+ itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
+}
+
+void ngap_gNB_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id)
+{
+ MessageDef *message_p = NULL;
+ sctp_close_association_t *sctp_close_association_p = NULL;
+
+ message_p = itti_alloc_new_message(TASK_NGAP, SCTP_CLOSE_ASSOCIATION);
+ sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
+ sctp_close_association_p->assoc_id = assoc_id;
+
+ itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
diff --git a/openair3/NGAP/ngap_gNB_itti_messaging.h b/openair3/NGAP/ngap_gNB_itti_messaging.h
new file mode 100644
index 0000000000..94d4058178
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_itti_messaging.h
@@ -0,0 +1,46 @@
+/*
+ * 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 ngap_gNB_itti_messaging.h
+ * \brief ngap itti messages handlers for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \date 2020
+ * \version 0.1
+ */
+
+#ifndef NGAP_GNB_ITTI_MESSAGING_H_
+#define NGAP_GNB_ITTI_MESSAGING_H_
+
+void ngap_gNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+ uint32_t buffer_length, uint16_t stream);
+
+void ngap_gNB_itti_send_nas_downlink_ind(instance_t instance,
+ uint16_t ue_initial_id,
+ uint32_t gNB_ue_ngap_id,
+ uint8_t *nas_pdu,
+ uint32_t nas_pdu_length);
+
+void ngap_gNB_itti_send_sctp_close_association(instance_t instance,
+ int32_t assoc_id);
+
+
+#endif /* NGAP_GNB_ITTI_MESSAGING_H_ */
diff --git a/openair3/NGAP/ngap_gNB_management_procedures.c b/openair3/NGAP/ngap_gNB_management_procedures.c
new file mode 100644
index 0000000000..85167ed7f0
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_management_procedures.c
@@ -0,0 +1,193 @@
+/*
+ * 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 ngap_gNB_management_procedures.c
+ * \brief NGAP gNB task
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+#include
+#include
+#include
+
+#include "intertask_interface.h"
+
+#include "assertions.h"
+#include "conversions.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+#include "ngap_gNB.h"
+
+ngap_gNB_internal_data_t ngap_gNB_internal_data;
+
+RB_GENERATE(ngap_amf_map, ngap_gNB_amf_data_s, entry, ngap_gNB_compare_assoc_id);
+
+int ngap_gNB_compare_assoc_id(
+ struct ngap_gNB_amf_data_s *p1, struct ngap_gNB_amf_data_s *p2)
+{
+ if (p1->assoc_id == -1) {
+ if (p1->cnx_id < p2->cnx_id) {
+ return -1;
+ }
+
+ if (p1->cnx_id > p2->cnx_id) {
+ return 1;
+ }
+ } else {
+ if (p1->assoc_id < p2->assoc_id) {
+ return -1;
+ }
+
+ if (p1->assoc_id > p2->assoc_id) {
+ return 1;
+ }
+ }
+
+ /* Matching reference */
+ return 0;
+}
+
+uint16_t ngap_gNB_fetch_add_global_cnx_id(void)
+{
+ return ++ngap_gNB_internal_data.global_cnx_id;
+}
+
+void ngap_gNB_prepare_internal_data(void)
+{
+ memset(&ngap_gNB_internal_data, 0, sizeof(ngap_gNB_internal_data));
+ STAILQ_INIT(&ngap_gNB_internal_data.ngap_gNB_instances_head);
+}
+
+void ngap_gNB_insert_new_instance(ngap_gNB_instance_t *new_instance_p)
+{
+ DevAssert(new_instance_p != NULL);
+
+ STAILQ_INSERT_TAIL(&ngap_gNB_internal_data.ngap_gNB_instances_head,
+ new_instance_p, ngap_gNB_entries);
+}
+
+struct ngap_gNB_amf_data_s *ngap_gNB_get_AMF(
+ ngap_gNB_instance_t *instance_p,
+ int32_t assoc_id, uint16_t cnx_id)
+{
+ struct ngap_gNB_amf_data_s temp;
+ struct ngap_gNB_amf_data_s *found;
+
+ memset(&temp, 0, sizeof(struct ngap_gNB_amf_data_s));
+
+ temp.assoc_id = assoc_id;
+ temp.cnx_id = cnx_id;
+
+ if (instance_p == NULL) {
+ STAILQ_FOREACH(instance_p, &ngap_gNB_internal_data.ngap_gNB_instances_head,
+ ngap_gNB_entries) {
+ found = RB_FIND(ngap_amf_map, &instance_p->ngap_amf_head, &temp);
+
+ if (found != NULL) {
+ return found;
+ }
+ }
+ } else {
+ return RB_FIND(ngap_amf_map, &instance_p->ngap_amf_head, &temp);
+ }
+
+ return NULL;
+}
+
+struct ngap_gNB_amf_data_s *ngap_gNB_get_AMF_from_instance(
+ ngap_gNB_instance_t *instance_p)
+{
+
+ struct ngap_gNB_amf_data_s *amf = NULL;
+ struct ngap_gNB_amf_data_s *amf_next = NULL;
+
+ for (amf = RB_MIN(ngap_amf_map, &instance_p->ngap_amf_head); amf!=NULL ; amf = amf_next) {
+ amf_next = RB_NEXT(ngap_amf_map, &instance_p->ngap_amf_head, amf);
+ if (amf->ngap_gNB_instance == instance_p) {
+ return amf;
+ }
+ }
+
+ return NULL;
+}
+
+ngap_gNB_instance_t *ngap_gNB_get_instance(instance_t instance)
+{
+ ngap_gNB_instance_t *temp = NULL;
+
+ STAILQ_FOREACH(temp, &ngap_gNB_internal_data.ngap_gNB_instances_head,
+ ngap_gNB_entries) {
+ if (temp->instance == instance) {
+ /* Matching occurence */
+ return temp;
+ }
+ }
+
+ return NULL;
+}
+
+void ngap_gNB_remove_amf_desc(ngap_gNB_instance_t * instance)
+{
+
+ struct ngap_gNB_amf_data_s *amf = NULL;
+ struct ngap_gNB_amf_data_s *amfNext = NULL;
+ struct plmn_identity_s* plmnInfo;
+ struct served_region_id_s* regionInfo;
+ struct served_guami_s* guamInfo;
+ struct amf_set_id_s* amfSet;
+ struct amf_pointer_s* amfPoint;
+ for (amf = RB_MIN(ngap_amf_map, &instance->ngap_amf_head); amf; amf = amfNext) {
+ amfNext = RB_NEXT(ngap_amf_map, &instance->ngap_amf_head, amf);
+ RB_REMOVE(ngap_amf_map, &instance->ngap_amf_head, amf);
+ while (!STAILQ_EMPTY(&amf->served_guami)) {
+ guamInfo = STAILQ_FIRST(&amf->served_guami);
+ STAILQ_REMOVE_HEAD(&amf->served_guami, next);
+
+ while (!STAILQ_EMPTY(&guamInfo->served_plmns)) {
+ plmnInfo = STAILQ_FIRST(&guamInfo->served_plmns);
+ STAILQ_REMOVE_HEAD(&guamInfo->served_plmns, next);
+ free(plmnInfo);
+ }
+ while (!STAILQ_EMPTY(&guamInfo->served_region_ids)) {
+ regionInfo = STAILQ_FIRST(&guamInfo->served_region_ids);
+ STAILQ_REMOVE_HEAD(&guamInfo->served_region_ids, next);
+ free(regionInfo);
+ }
+ while (!STAILQ_EMPTY(&guamInfo->amf_set_ids)) {
+ amfSet = STAILQ_FIRST(&guamInfo->amf_set_ids);
+ STAILQ_REMOVE_HEAD(&guamInfo->amf_set_ids, next);
+ free(amfSet);
+ }
+ while (!STAILQ_EMPTY(&guamInfo->amf_pointers)) {
+ amfPoint = STAILQ_FIRST(&guamInfo->amf_pointers);
+ STAILQ_REMOVE_HEAD(&guamInfo->amf_pointers, next);
+ free(amfPoint);
+ }
+ free(guamInfo);
+ }
+ free(amf);
+ }
+}
diff --git a/openair3/NGAP/ngap_gNB_management_procedures.h b/openair3/NGAP/ngap_gNB_management_procedures.h
new file mode 100644
index 0000000000..e192f71be9
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_management_procedures.h
@@ -0,0 +1,50 @@
+/*
+ * 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 ngap_gNB_management_procedures.h
+ * \brief NGAP gNB task
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+#ifndef NGAP_GNB_MANAGEMENT_PROCEDURES_H_
+#define NGAP_GNB_MANAGEMENT_PROCEDURES_H_
+
+struct ngap_gNB_amf_data_s *ngap_gNB_get_AMF(
+ ngap_gNB_instance_t *instance_p,
+ int32_t assoc_id, uint16_t cnx_id);
+
+struct ngap_gNB_amf_data_s *ngap_gNB_get_AMF_from_instance(ngap_gNB_instance_t *instance_p);
+
+void ngap_gNB_remove_amf_desc(ngap_gNB_instance_t * instance);
+
+void ngap_gNB_insert_new_instance(ngap_gNB_instance_t *new_instance_p);
+
+ngap_gNB_instance_t *ngap_gNB_get_instance(uint8_t mod_id);
+
+uint16_t ngap_gNB_fetch_add_global_cnx_id(void);
+
+void ngap_gNB_prepare_internal_data(void);
+
+#endif /* NGAP_GNB_MANAGEMENT_PROCEDURES_H_ */
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c
new file mode 100644
index 0000000000..197cf88a52
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.c
@@ -0,0 +1,1463 @@
+/*
+ * 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 ngap_gNB_nas_procedures.c
+ * \brief NGAP gNb NAS procedure handler
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+
+#include
+#include
+#include
+
+#include "assertions.h"
+#include "conversions.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+
+#include "ngap_gNB_itti_messaging.h"
+
+#include "ngap_gNB_encoder.h"
+#include "ngap_gNB_nnsf.h"
+#include "ngap_gNB_ue_context.h"
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_management_procedures.h"
+#include "msc.h"
+
+//------------------------------------------------------------------------------
+int ngap_gNB_handle_nas_first_req(
+ instance_t instance, ngap_nas_first_req_t *ngap_nas_first_req_p)
+//------------------------------------------------------------------------------
+{
+ ngap_gNB_instance_t *instance_p = NULL;
+ struct ngap_gNB_amf_data_s *amf_desc_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_desc_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_InitialUEMessage_t *out;
+ NGAP_InitialUEMessage_IEs_t *ie;
+ NGAP_UserLocationInformationNR_t *userinfo_nr_p = NULL;
+ uint8_t *buffer = NULL;
+ uint32_t length = 0;
+ DevAssert(ngap_nas_first_req_p != NULL);
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(instance_p != NULL);
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage = (NGAP_InitiatingMessage_t *)calloc(1,sizeof(NGAP_InitiatingMessage_t));
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_InitialUEMessage;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_InitialUEMessage;
+ out = &pdu.choice.initiatingMessage->value.choice.InitialUEMessage;
+
+ /* Select the AMF corresponding to the provided GUAMI. */
+ //TODO have not be test. it's should be test
+ if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_guami) {
+ amf_desc_p = ngap_gNB_nnsf_select_amf_by_guami(
+ instance_p,
+ ngap_nas_first_req_p->establishment_cause,
+ ngap_nas_first_req_p->ue_identity.guami);
+
+ if (amf_desc_p) {
+ NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through GUAMI MCC %d MNC %d AMFRI %d AMFSI %d AMFPT %d\n",
+ instance,
+ amf_desc_p->amf_name,
+ amf_desc_p->assoc_id,
+ ngap_nas_first_req_p->ue_identity.guami.mcc,
+ ngap_nas_first_req_p->ue_identity.guami.mnc,
+ ngap_nas_first_req_p->ue_identity.guami.amf_region_id,
+ ngap_nas_first_req_p->ue_identity.guami.amf_set_id,
+ ngap_nas_first_req_p->ue_identity.guami.amf_pointer);
+ }
+ }
+
+ if (amf_desc_p == NULL) {
+ /* Select the AMF corresponding to the provided s-TMSI. */
+ //TODO have not be test. it's should be test
+ if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_FiveG_s_tmsi) {
+ amf_desc_p = ngap_gNB_nnsf_select_amf_by_amf_setid(
+ instance_p,
+ ngap_nas_first_req_p->establishment_cause,
+ ngap_nas_first_req_p->selected_plmn_identity,
+ ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id);
+
+ if (amf_desc_p) {
+ NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through S-TMSI AMFSI %d and selected PLMN Identity index %d MCC %d MNC %d\n",
+ instance,
+ amf_desc_p->amf_name,
+ amf_desc_p->assoc_id,
+ ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id,
+ ngap_nas_first_req_p->selected_plmn_identity,
+ instance_p->mcc[ngap_nas_first_req_p->selected_plmn_identity],
+ instance_p->mnc[ngap_nas_first_req_p->selected_plmn_identity]);
+ }
+ }
+ }
+
+ if (amf_desc_p == NULL) {
+ /* Select AMF based on the selected PLMN identity, received through RRC
+ * Connection Setup Complete */
+ //TODO have not be test. it's should be test
+ amf_desc_p = ngap_gNB_nnsf_select_amf_by_plmn_id(
+ instance_p,
+ ngap_nas_first_req_p->establishment_cause,
+ ngap_nas_first_req_p->selected_plmn_identity);
+
+ if (amf_desc_p) {
+ NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through selected PLMN Identity index %d MCC %d MNC %d\n",
+ instance,
+ amf_desc_p->amf_name,
+ amf_desc_p->assoc_id,
+ ngap_nas_first_req_p->selected_plmn_identity,
+ instance_p->mcc[ngap_nas_first_req_p->selected_plmn_identity],
+ instance_p->mnc[ngap_nas_first_req_p->selected_plmn_identity]);
+ }
+ }
+
+ if (amf_desc_p == NULL) {
+ /*
+ * If no AMF corresponds to the GUAMI, the s-TMSI, or the selected PLMN
+ * identity, selects the AMF with the highest capacity.
+ */
+ //TODO have not be test. it's should be test
+ amf_desc_p = ngap_gNB_nnsf_select_amf(
+ instance_p,
+ ngap_nas_first_req_p->establishment_cause);
+
+ if (amf_desc_p) {
+ NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through highest relative capacity\n",
+ instance,
+ amf_desc_p->amf_name,
+ amf_desc_p->assoc_id);
+ }
+ }
+
+ if (amf_desc_p == NULL) {
+ /*
+ * In case gNB has no AMF associated, the gNB should inform RRC and discard
+ * this request.
+ */
+ NGAP_WARN("No AMF is associated to the gNB\n");
+ // TODO: Inform RRC
+ return -1;
+ }
+
+ /* The gNB should allocate a unique gNB UE NGAP ID for this UE. The value
+ * will be used for the duration of the connectivity.
+ */
+ ue_desc_p = ngap_gNB_allocate_new_UE_context();
+ DevAssert(ue_desc_p != NULL);
+ /* Keep a reference to the selected AMF */
+ ue_desc_p->amf_ref = amf_desc_p;
+ ue_desc_p->ue_initial_id = ngap_nas_first_req_p->ue_initial_id;
+ ue_desc_p->gNB_instance = instance_p;
+ ue_desc_p->selected_plmn_identity = ngap_nas_first_req_p->selected_plmn_identity;
+
+ do {
+ struct ngap_gNB_ue_context_s *collision_p;
+ /* Peek a random value for the gNB_ue_ngap_id */
+ ue_desc_p->gNB_ue_ngap_id = (random() + random()) & 0xffffffff;
+
+ if ((collision_p = RB_INSERT(ngap_ue_map, &instance_p->ngap_ue_head, ue_desc_p))
+ == NULL) {
+ NGAP_DEBUG("Found usable gNB_ue_ngap_id: 0x%08x %u(10)\n",
+ ue_desc_p->gNB_ue_ngap_id,
+ ue_desc_p->gNB_ue_ngap_id);
+ /* Break the loop as the id is not already used by another UE */
+ break;
+ }
+ } while(1);
+
+ /* mandatory */
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_desc_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_NAS_PDU;
+#if 1
+ ie->value.choice.NAS_PDU.buf = ngap_nas_first_req_p->nas_pdu.buffer;
+#else
+ ie->value.choice.NAS_PDU.buf = malloc(ngap_nas_first_req_p->nas_pdu.length);
+ memcpy(ie->value.choice.NAS_PDU.buf,
+ ngap_nas_first_req_p->nas_pdu.buffer,
+ ngap_nas_first_req_p->nas_pdu.length);
+#endif
+ ie->value.choice.NAS_PDU.size = ngap_nas_first_req_p->nas_pdu.length;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_UserLocationInformation;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_UserLocationInformation;
+
+ ie->value.choice.UserLocationInformation.present = NGAP_UserLocationInformation_PR_userLocationInformationNR;
+
+ ie->value.choice.UserLocationInformation.choice.userLocationInformationNR =
+ CALLOC(1, sizeof(*ie->value.choice.UserLocationInformation.choice.userLocationInformationNR));
+ userinfo_nr_p = ie->value.choice.UserLocationInformation.choice.userLocationInformationNR;
+
+ /* Set nRCellIdentity. default userLocationInformationNR */
+ MACRO_GNB_ID_TO_CELL_IDENTITY(instance_p->gNB_id,
+ 0, // Cell ID
+ &userinfo_nr_p->nR_CGI.nRCellIdentity);
+ MCC_MNC_TO_TBCD(instance_p->mcc[ue_desc_p->selected_plmn_identity],
+ instance_p->mnc[ue_desc_p->selected_plmn_identity],
+ instance_p->mnc_digit_length[ue_desc_p->selected_plmn_identity],
+ &userinfo_nr_p->nR_CGI.pLMNIdentity);
+
+ /* Set TAI */
+ INT24_TO_OCTET_STRING(instance_p->tac, &userinfo_nr_p->tAI.tAC);
+ MCC_MNC_TO_PLMNID(instance_p->mcc[ue_desc_p->selected_plmn_identity],
+ instance_p->mnc[ue_desc_p->selected_plmn_identity],
+ instance_p->mnc_digit_length[ue_desc_p->selected_plmn_identity],
+ &userinfo_nr_p->tAI.pLMNIdentity);
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+
+ /* Set the establishment cause according to those provided by RRC */
+ DevCheck(ngap_nas_first_req_p->establishment_cause < NGAP_RRC_CAUSE_LAST,
+ ngap_nas_first_req_p->establishment_cause, NGAP_RRC_CAUSE_LAST, 0);
+
+ /* mandatory */
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RRCEstablishmentCause;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_RRCEstablishmentCause;
+ ie->value.choice.RRCEstablishmentCause = ngap_nas_first_req_p->establishment_cause;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_FiveG_s_tmsi) {
+ NGAP_DEBUG("FIVEG_S_TMSI_PRESENT\n");
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_FiveG_S_TMSI;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_FiveG_S_TMSI;
+ AMF_SETID_TO_BIT_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id,
+ &ie->value.choice.FiveG_S_TMSI.aMFSetID);
+ AMF_SETID_TO_BIT_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.amf_pointer,
+ &ie->value.choice.FiveG_S_TMSI.aMFPointer);
+ M_TMSI_TO_OCTET_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.m_tmsi,
+ &ie->value.choice.FiveG_S_TMSI.fiveG_TMSI);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+
+ /* optional */
+ ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_UEContextRequest;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_UEContextRequest;
+ ie->value.choice.UEContextRequest = NGAP_UEContextRequest_requested;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ /* Failed to encode message */
+ DevMessage("Failed to encode initial UE message\n");
+ }
+
+ /* Update the current NGAP UE state */
+ ue_desc_p->ue_state = NGAP_UE_WAITING_CSR;
+ /* Assign a stream for this UE :
+ * From 3GPP 38.412 7)Transport layers:
+ * Within the SCTP association established between one AMF and gNB pair:
+ * - a single pair of stream identifiers shall be reserved for the sole use
+ * of NGAP elementary procedures that utilize non UE-associated signalling.
+ * - At least one pair of stream identifiers shall be reserved for the sole use
+ * of NGAP elementary procedures that utilize UE-associated signallings.
+ * However a few pairs (i.e. more than one) should be reserved.
+ * - A single UE-associated signalling shall use one SCTP stream and
+ * the stream should not be changed during the communication of the
+ * UE-associated signalling.
+ */
+ amf_desc_p->nextstream = (amf_desc_p->nextstream + 1) % amf_desc_p->out_streams;
+
+ if ((amf_desc_p->nextstream == 0) && (amf_desc_p->out_streams > 1)) {
+ amf_desc_p->nextstream += 1;
+ }
+
+ ue_desc_p->tx_stream = amf_desc_p->nextstream;
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)NULL,
+ 0,
+ MSC_AS_TIME_FMT" initialUEMessage initiatingMessage gNB_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_desc_p->gNB_ue_ngap_id);
+ /* Send encoded message over sctp */
+ ngap_gNB_itti_send_sctp_data_req(instance_p->instance, amf_desc_p->assoc_id,
+ buffer, length, ue_desc_p->tx_stream);
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_handle_nas_downlink(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu)
+//------------------------------------------------------------------------------
+{
+
+ ngap_gNB_amf_data_t *amf_desc_p = NULL;
+ ngap_gNB_ue_context_t *ue_desc_p = NULL;
+ ngap_gNB_instance_t *ngap_gNB_instance = NULL;
+ NGAP_DownlinkNASTransport_t *container;
+ NGAP_DownlinkNASTransport_IEs_t *ie;
+ NGAP_RAN_UE_NGAP_ID_t gnb_ue_ngap_id;
+ uint64_t amf_ue_ngap_id;
+ DevAssert(pdu != NULL);
+
+ /* UE-related procedure -> stream != 0 */
+ if (stream == 0) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream == 0\n",
+ assoc_id);
+ return -1;
+ }
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ NGAP_ERROR(
+ "[SCTP %d] Received NAS downlink message for non existing AMF context\n",
+ assoc_id);
+ return -1;
+ }
+
+ ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
+ /* Prepare the NGAP message to encode */
+ container = &pdu->choice.initiatingMessage->value.choice.DownlinkNASTransport;
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
+ asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);
+
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
+ gnb_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
+
+ if ((ue_desc_p = ngap_gNB_get_ue_context(ngap_gNB_instance,
+ gnb_ue_ngap_id)) == NULL) {
+ MSC_LOG_RX_DISCARDED_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ NULL,
+ 0,
+ MSC_AS_TIME_FMT" downlinkNASTransport gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ gnb_ue_ngap_id,
+ amf_ue_ngap_id);
+ NGAP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context gNB_UE_NGAP_ID: 0x%lx\n",
+ assoc_id,
+ gnb_ue_ngap_id);
+ return -1;
+ }
+
+ if (0 == ue_desc_p->rx_stream) {
+ ue_desc_p->rx_stream = stream;
+ } else if (stream != ue_desc_p->rx_stream) {
+ NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream %u, expecting %u\n",
+ assoc_id, stream, ue_desc_p->rx_stream);
+ return -1;
+ }
+
+ /* Is it the first outcome of the AMF for this UE ? If so store the amf
+ * UE ngap id.
+ */
+ if (ue_desc_p->amf_ue_ngap_id == 0) {
+ ue_desc_p->amf_ue_ngap_id = amf_ue_ngap_id;
+ } else {
+ /* We already have a amf ue ngap id check the received is the same */
+ if (ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
+ NGAP_ERROR("[SCTP %d] Mismatch in AMF UE NGAP ID (0x%lx != 0x%"PRIx64"\n",
+ assoc_id,
+ amf_ue_ngap_id,
+ (uint64_t)ue_desc_p->amf_ue_ngap_id
+ );
+ return -1;
+ }
+ }
+
+ MSC_LOG_RX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ NULL,
+ 0,
+ MSC_AS_TIME_FMT" downlinkNASTransport gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ assoc_id,
+ amf_ue_ngap_id);
+
+ NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
+ NGAP_ProtocolIE_ID_id_NAS_PDU, true);
+ /* Forward the NAS PDU to NR-RRC */
+ ngap_gNB_itti_send_nas_downlink_ind(ngap_gNB_instance->instance,
+ ue_desc_p->ue_initial_id,
+ ue_desc_p->gNB_ue_ngap_id,
+ ie->value.choice.NAS_PDU.buf,
+ ie->value.choice.NAS_PDU.size);
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_nas_uplink(instance_t instance, ngap_uplink_nas_t *ngap_uplink_nas_p)
+//------------------------------------------------------------------------------
+{
+ struct ngap_gNB_ue_context_s *ue_context_p;
+ ngap_gNB_instance_t *ngap_gNB_instance_p;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_UplinkNASTransport_t *out;
+ NGAP_UplinkNASTransport_IEs_t *ie;
+ NGAP_UserLocationInformationNR_t *userinfo_nr_p = NULL;
+ uint8_t *buffer;
+ uint32_t length;
+ DevAssert(ngap_uplink_nas_p != NULL);
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p, ngap_uplink_nas_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %08x\n",
+ ngap_uplink_nas_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Uplink NAS transport can occur either during an ngap connected state
+ * or during initial attach (for example: NAS authentication).
+ */
+ if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
+ ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
+ NGAP_WARN("You are attempting to send NAS data over non-connected "
+ "gNB ue ngap id: %u, current state: %d\n",
+ ngap_uplink_nas_p->gNB_ue_ngap_id, ue_context_p->ue_state);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UplinkNASTransport;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UplinkNASTransport;
+ out = &pdu.choice.initiatingMessage->value.choice.UplinkNASTransport;
+ /* mandatory */
+ ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_AMF_UE_NGAP_ID;
+ //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_NAS_PDU;
+ ie->value.choice.NAS_PDU.buf = ngap_uplink_nas_p->nas_pdu.buffer;
+ ie->value.choice.NAS_PDU.size = ngap_uplink_nas_p->nas_pdu.length;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_UserLocationInformation;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_UserLocationInformation;
+
+ ie->value.choice.UserLocationInformation.present = NGAP_UserLocationInformation_PR_userLocationInformationNR;
+ userinfo_nr_p = ie->value.choice.UserLocationInformation.choice.userLocationInformationNR;
+
+ /* Set nRCellIdentity. default userLocationInformationNR */
+ MACRO_GNB_ID_TO_CELL_IDENTITY(ngap_gNB_instance_p->gNB_id,
+ 0, // Cell ID
+ &userinfo_nr_p->nR_CGI.nRCellIdentity);
+ MCC_MNC_TO_TBCD(ngap_gNB_instance_p->mcc[ue_context_p->selected_plmn_identity],
+ ngap_gNB_instance_p->mnc[ue_context_p->selected_plmn_identity],
+ ngap_gNB_instance_p->mnc_digit_length[ue_context_p->selected_plmn_identity],
+ &userinfo_nr_p->nR_CGI.pLMNIdentity);
+
+ /* Set TAI */
+ INT24_TO_OCTET_STRING(ngap_gNB_instance_p->tac, &userinfo_nr_p->tAI.tAC);
+ MCC_MNC_TO_PLMNID(ngap_gNB_instance_p->mcc[ue_context_p->selected_plmn_identity],
+ ngap_gNB_instance_p->mnc[ue_context_p->selected_plmn_identity],
+ ngap_gNB_instance_p->mnc_digit_length[ue_context_p->selected_plmn_identity],
+ &userinfo_nr_p->tAI.pLMNIdentity);
+
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode uplink NAS transport\n");
+ /* Encode procedure has failed... */
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)NULL,
+ 0,
+ MSC_AS_TIME_FMT" uplinkNASTransport initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ return 0;
+}
+
+
+//------------------------------------------------------------------------------
+int ngap_gNB_nas_non_delivery_ind(instance_t instance,
+ ngap_nas_non_delivery_ind_t *ngap_nas_non_delivery_ind)
+//------------------------------------------------------------------------------
+{
+ struct ngap_gNB_ue_context_s *ue_context_p;
+ ngap_gNB_instance_t *ngap_gNB_instance_p;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_NASNonDeliveryIndication_t *out;
+ NGAP_NASNonDeliveryIndication_IEs_t *ie;
+ uint8_t *buffer;
+ uint32_t length;
+ DevAssert(ngap_nas_non_delivery_ind != NULL);
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p, ngap_nas_non_delivery_ind->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %08x\n",
+ ngap_nas_non_delivery_ind->gNB_ue_ngap_id);
+ MSC_LOG_EVENT(
+ MSC_NGAP_GNB,
+ MSC_AS_TIME_FMT" Sent of NAS_NON_DELIVERY_IND to AMF failed, no context for gNB_ue_ngap_id %08x",
+ ngap_nas_non_delivery_ind->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_NASNonDeliveryIndication;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_NASNonDeliveryIndication;
+ out = &pdu.choice.initiatingMessage->value.choice.NASNonDeliveryIndication;
+ /* mandatory */
+ ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_NAS_PDU;
+ ie->value.choice.NAS_PDU.buf = ngap_nas_non_delivery_ind->nas_pdu.buffer;
+ ie->value.choice.NAS_PDU.size = ngap_nas_non_delivery_ind->nas_pdu.length;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_Cause;
+ ie->criticality = NGAP_Criticality_ignore;
+ /* Send a dummy cause */
+ ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_Cause;
+ ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
+ ie->value.choice.Cause.choice.radioNetwork = NGAP_CauseRadioNetwork_radio_connection_with_ue_lost;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode NAS NON delivery indication\n");
+ /* Encode procedure has failed... */
+ MSC_LOG_EVENT(
+ MSC_NGAP_GNB,
+ MSC_AS_TIME_FMT" Sent of NAS_NON_DELIVERY_IND to AMF failed (encoding)");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" NASNonDeliveryIndication initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %lu",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_initial_ctxt_resp(
+ instance_t instance, ngap_initial_context_setup_resp_t *initial_ctxt_resp_p)
+//------------------------------------------------------------------------------
+{
+
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_InitialContextSetupResponse_t *out;
+ NGAP_InitialContextSetupResponseIEs_t *ie;
+ uint8_t *buffer = NULL;
+ uint32_t length;
+ int i;
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+
+
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(initial_ctxt_resp_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ initial_ctxt_resp_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
+ initial_ctxt_resp_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Uplink NAS transport can occur either during an ngap connected state
+ * or during initial attach (for example: NAS authentication).
+ */
+ if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
+ ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
+ NGAP_WARN("You are attempting to send NAS data over non-connected "
+ "gNB ue ngap id: %08x, current state: %d\n",
+ initial_ctxt_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_InitialContextSetup;
+ pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
+ pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_InitialContextSetupResponse;
+ out = &pdu.choice.successfulOutcome->value.choice.InitialContextSetupResponse;
+ /* mandatory */
+ ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
+ //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = initial_ctxt_resp_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* optional */
+ ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListCxtRes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_PDUSessionResourceSetupListCxtRes;
+
+ for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions; i++) {
+ NGAP_PDUSessionResourceSetupItemCxtRes_t *item;
+ NGAP_PDUSessionResourceSetupResponseTransfer_t *pdusessionTransfer_p = NULL;
+
+ /* mandatory */
+ item = (NGAP_PDUSessionResourceSetupItemCxtRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupItemCxtRes_t));
+
+ /* pDUSessionID */
+ item->pDUSessionID = initial_ctxt_resp_p->pdusessions[i].pdusession_id;
+
+ /* dLQosFlowPerTNLInformation */
+ pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));
+
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
+
+ GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->gTP_TEID);
+
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf = malloc(initial_ctxt_resp_p->pdusessions[i].gNB_addr.length);
+
+ memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf,
+ initial_ctxt_resp_p->pdusessions[i].gNB_addr.buffer,
+ initial_ctxt_resp_p->pdusessions[i].gNB_addr.length);
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size = initial_ctxt_resp_p->pdusessions[i].gNB_addr.length;
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
+
+ NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n",
+ item->pDUSessionID,
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[0],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[1],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[2],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[3],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size);
+
+ /* associatedQosFlowList. number of 1? */
+ for(int j=0; j < initial_ctxt_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
+ NGAP_AssociatedQosFlowItem_t *ass_qos_item_p;
+ ass_qos_item_p = (NGAP_AssociatedQosFlowItem_t *)calloc(1, sizeof(NGAP_AssociatedQosFlowItem_t));
+
+ /* qosFlowIdentifier */
+ ass_qos_item_p->qosFlowIdentifier = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qci;
+
+ /* qosFlowMappingIndication */
+ if(initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
+ ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
+ *ass_qos_item_p->qosFlowMappingIndication = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
+ }
+ ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+ item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
+ item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceSetupListCxtRes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (initial_ctxt_resp_p->nb_of_pdusessions_failed) {
+ ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToSetupListCxtRes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListCxtRes;
+
+ for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions_failed; i++) {
+ NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *item;
+ NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;
+
+ /* mandatory */
+ item = (NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t));
+ /* pDUSessionID */
+ item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id;
+
+ /* cause */
+ pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
+ pdusessionUnTransfer_p->cause.present = initial_ctxt_resp_p->pdusessions_failed[i].cause;
+ switch(pdusessionUnTransfer_p->cause.present) {
+ case NGAP_Cause_PR_radioNetwork:
+ pdusessionUnTransfer_p->cause.choice.radioNetwork = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_transport:
+ pdusessionUnTransfer_p->cause.choice.transport = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_nas:
+ pdusessionUnTransfer_p->cause.choice.nas = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_protocol:
+ pdusessionUnTransfer_p->cause.choice.protocol = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_misc:
+ pdusessionUnTransfer_p->cause.choice.misc = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_NOTHING:
+ default:
+ break;
+ }
+
+ NGAP_DEBUG("initial context setup response: failed pdusession ID %ld\n", item->pDUSessionID);
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
+ item->pDUSessionResourceSetupUnsuccessfulTransfer.buf = res.buffer;
+ item->pDUSessionResourceSetupUnsuccessfulTransfer.size = res.result.encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
+
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceFailedToSetupListCxtRes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* optional */
+ if (0) {
+ ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_CriticalityDiagnostics;
+ // ie->value.choice.CriticalityDiagnostics =;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode InitialContextSetupResponse\n");
+ /* Encode procedure has failed... */
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" InitialContextSetup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ initial_ctxt_resp_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_ue_capabilities(instance_t instance,
+ ngap_ue_cap_info_ind_t *ue_cap_info_ind_p)
+//------------------------------------------------------------------------------
+{
+ ngap_gNB_instance_t *ngap_gNB_instance_p;
+ struct ngap_gNB_ue_context_s *ue_context_p;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_UERadioCapabilityInfoIndication_t *out;
+ NGAP_UERadioCapabilityInfoIndicationIEs_t *ie;
+ uint8_t *buffer;
+ uint32_t length;
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(ue_cap_info_ind_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ ue_cap_info_ind_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
+ ue_cap_info_ind_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* UE radio capabilities message can occur either during an ngap connected state
+ * or during initial attach (for example: NAS authentication).
+ */
+ if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
+ ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
+ NGAP_WARN("You are attempting to send NAS data over non-connected "
+ "gNB ue ngap id: %u, current state: %d\n",
+ ue_cap_info_ind_p->gNB_ue_ngap_id, ue_context_p->ue_state);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage->procedureCode = NGAP_ProcedureCode_id_UERadioCapabilityInfoIndication;
+ pdu.choice.initiatingMessage->criticality = NGAP_Criticality_ignore;
+ pdu.choice.initiatingMessage->value.present = NGAP_InitiatingMessage__value_PR_UERadioCapabilityInfoIndication;
+ out = &pdu.choice.initiatingMessage->value.choice.UERadioCapabilityInfoIndication;
+ /* mandatory */
+ ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_AMF_UE_NGAP_ID;
+ //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = ue_cap_info_ind_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_UERadioCapability;
+ ie->criticality = NGAP_Criticality_reject;
+ ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_UERadioCapability;
+ ie->value.choice.UERadioCapability.buf = ue_cap_info_ind_p->ue_radio_cap.buffer;
+ ie->value.choice.UERadioCapability.size = ue_cap_info_ind_p->ue_radio_cap.length;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* optional */
+ //NGAP_UERadioCapabilityForPaging TBD
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ /* Encode procedure has failed... */
+ NGAP_ERROR("Failed to encode UE radio capabilities indication\n");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" UECapabilityInfoIndication initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_cap_info_ind_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_pdusession_setup_resp(instance_t instance,
+ ngap_pdusession_setup_resp_t *pdusession_setup_resp_p)
+//------------------------------------------------------------------------------
+{
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_PDUSessionResourceSetupResponse_t *out;
+ NGAP_PDUSessionResourceSetupResponseIEs_t *ie;
+ uint8_t *buffer = NULL;
+ uint32_t length;
+ int i;
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(pdusession_setup_resp_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ pdusession_setup_resp_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
+ pdusession_setup_resp_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Uplink NAS transport can occur either during an ngap connected state
+ * or during initial attach (for example: NAS authentication).
+ */
+ if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
+ ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
+ NGAP_WARN("You are attempting to send NAS data over non-connected "
+ "gNB ue ngap id: %08x, current state: %d\n",
+ pdusession_setup_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceSetup;
+ pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
+ pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_PDUSessionResourceSetupResponse;
+ out = &pdu.choice.successfulOutcome->value.choice.PDUSessionResourceSetupResponse;
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = pdusession_setup_resp_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (pdusession_setup_resp_p->nb_of_pdusessions > 0) {
+ ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSURes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceSetupListSURes;
+
+ for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions; i++) {
+ NGAP_PDUSessionResourceSetupItemSURes_t *item;
+ NGAP_PDUSessionResourceSetupResponseTransfer_t *pdusessionTransfer_p = NULL;
+
+ /* mandatory */
+ item = (NGAP_PDUSessionResourceSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupItemSURes_t));
+
+ /* pDUSessionID */
+ item->pDUSessionID = pdusession_setup_resp_p->pdusessions[i].pdusession_id;
+
+ /* dLQosFlowPerTNLInformation */
+ pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));
+
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
+
+ GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->gTP_TEID);
+
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
+
+ memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf,
+ pdusession_setup_resp_p->pdusessions[i].gNB_addr.buffer,
+ pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length;
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0;
+
+ NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n",
+ item->pDUSessionID,
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[0],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[1],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[2],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[3],
+ pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size);
+
+ /* associatedQosFlowList. number of 1? */
+ for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
+ NGAP_AssociatedQosFlowItem_t *ass_qos_item_p;
+ ass_qos_item_p = (NGAP_AssociatedQosFlowItem_t *)calloc(1, sizeof(NGAP_AssociatedQosFlowItem_t));
+
+ /* qosFlowIdentifier */
+ ass_qos_item_p->qosFlowIdentifier = pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qci;
+
+ /* qosFlowMappingIndication */
+ if(pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
+ ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
+ *ass_qos_item_p->qosFlowMappingIndication = pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
+ }
+ ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+ item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
+ item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceSetupListSURes.list, item);
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* optional */
+ if (pdusession_setup_resp_p->nb_of_pdusessions_failed > 0) {
+ ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToSetupListSURes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListSURes;
+
+ for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions_failed; i++) {
+ NGAP_PDUSessionResourceFailedToSetupItemSURes_t *item;
+ NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;
+
+ /* mandatory */
+ item = (NGAP_PDUSessionResourceFailedToSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemSURes_t));
+ /* pDUSessionID */
+ item->pDUSessionID = pdusession_setup_resp_p->pdusessions_failed[i].pdusession_id;
+
+ /* cause */
+ pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
+ pdusessionUnTransfer_p->cause.present = pdusession_setup_resp_p->pdusessions_failed[i].cause;
+ switch(pdusessionUnTransfer_p->cause.present) {
+ case NGAP_Cause_PR_radioNetwork:
+ pdusessionUnTransfer_p->cause.choice.radioNetwork = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_transport:
+ pdusessionUnTransfer_p->cause.choice.transport = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_nas:
+ pdusessionUnTransfer_p->cause.choice.nas = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_protocol:
+ pdusessionUnTransfer_p->cause.choice.protocol = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_misc:
+ pdusessionUnTransfer_p->cause.choice.misc = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_NOTHING:
+ default:
+ break;
+ }
+
+ NGAP_DEBUG("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID);
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
+ item->pDUSessionResourceSetupUnsuccessfulTransfer.buf = res.buffer;
+ item->pDUSessionResourceSetupUnsuccessfulTransfer.size = res.result.encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
+
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceFailedToSetupListSURes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* optional */
+ if (0) {
+ ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_CriticalityDiagnostics;
+ // ie->value.choice.CriticalityDiagnostics = ;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode uplink transport\n");
+ /* Encode procedure has failed... */
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" PduSession Setup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ pdusession_setup_resp_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+int ngap_gNB_pdusession_modify_resp(instance_t instance,
+ ngap_pdusession_modify_resp_t *pdusession_modify_resp_p)
+//------------------------------------------------------------------------------
+{
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_PDUSessionResourceModifyResponse_t *out;
+ NGAP_PDUSessionResourceModifyResponseIEs_t *ie;
+ uint8_t *buffer = NULL;
+ uint32_t length;
+ int i;
+ asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
+
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(pdusession_modify_resp_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ pdusession_modify_resp_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
+ pdusession_modify_resp_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Uplink NAS transport can occur either during an ngap connected state
+ * or during initial attach (for example: NAS authentication).
+ */
+ if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
+ ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
+ NGAP_WARN("You are attempting to send NAS data over non-connected "
+ "gNB ue ngap id: %08x, current state: %d\n",
+ pdusession_modify_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceModify;
+ pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
+ pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_PDUSessionResourceModifyResponse;
+ out = &pdu.choice.successfulOutcome->value.choice.PDUSessionResourceModifyResponse;
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = pdusession_modify_resp_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (pdusession_modify_resp_p->nb_of_pdusessions > 0) {
+ ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceModifyListModRes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_PDUSessionResourceModifyListModRes;
+
+ for (i = 0; i < pdusession_modify_resp_p->nb_of_pdusessions; i++) {
+ NGAP_PDUSessionResourceModifyItemModRes_t *item;
+
+ item = (NGAP_PDUSessionResourceModifyItemModRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyItemModRes_t));
+ item->pDUSessionID = pdusession_modify_resp_p->pdusessions[i].pdusession_id;
+
+ NGAP_DEBUG("pdusession_modify_resp: modified pdusession ID %ld\n", item->pDUSessionID);
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceModifyListModRes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* optional */
+ if (pdusession_modify_resp_p->nb_of_pdusessions_failed > 0) {
+ ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToModifyListModRes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_PDUSessionResourceFailedToModifyListModRes;
+
+ for (i = 0; i < pdusession_modify_resp_p->nb_of_pdusessions_failed; i++) {
+ NGAP_PDUSessionResourceFailedToModifyItemModRes_t *item;
+ NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t *pdusessionTransfer_p = NULL;
+
+ item = (NGAP_PDUSessionResourceFailedToModifyItemModRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToModifyItemModRes_t));
+ item->pDUSessionID = pdusession_modify_resp_p->pdusessions_failed[i].pdusession_id;
+
+ pdusessionTransfer_p = (NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t));
+ pdusessionTransfer_p->cause.present = pdusession_modify_resp_p->pdusessions_failed[i].cause;
+
+ switch(pdusessionTransfer_p->cause.present) {
+ case NGAP_Cause_PR_radioNetwork:
+ pdusessionTransfer_p->cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_transport:
+ pdusessionTransfer_p->cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_nas:
+ pdusessionTransfer_p->cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_protocol:
+ pdusessionTransfer_p->cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_misc:
+ pdusessionTransfer_p->cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
+ break;
+
+ case NGAP_Cause_PR_NOTHING:
+ default:
+ break;
+ }
+
+ memset(&res, 0, sizeof(res));
+ res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceModifyUnsuccessfulTransfer, pdusessionTransfer_p);
+ item->pDUSessionResourceModifyUnsuccessfulTransfer.buf = res.buffer;
+ item->pDUSessionResourceModifyUnsuccessfulTransfer.size = res.result.encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceModifyUnsuccessfulTransfer, pdusessionTransfer_p);
+
+
+ NGAP_DEBUG("pdusession_modify_resp: failed pdusession ID %ld\n", item->pDUSessionID);
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceFailedToModifyListModRes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ /* optional */
+ if (0) {
+ ie = (NGAP_PDUSessionResourceModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceModifyResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceModifyResponseIEs__value_PR_CriticalityDiagnostics;
+ // ie->value.choice.CriticalityDiagnostics = ;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+ fprintf(stderr, "start encode\n");
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode uplink transport\n");
+ /* Encode procedure has failed... */
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" E_RAN Modify successful Outcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ pdusession_modify_resp_p->gNB_ue_ngap_id,
+ ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+
+ return 0;
+}
+//------------------------------------------------------------------------------
+int ngap_gNB_pdusession_release_resp(instance_t instance,
+ ngap_pdusession_release_resp_t *pdusession_release_resp_p)
+//------------------------------------------------------------------------------
+{
+ ngap_gNB_instance_t *ngap_gNB_instance_p = NULL;
+ struct ngap_gNB_ue_context_s *ue_context_p = NULL;
+ NGAP_NGAP_PDU_t pdu;
+ NGAP_PDUSessionResourceReleaseResponse_t *out;
+ NGAP_PDUSessionResourceReleaseResponseIEs_t *ie;
+ uint8_t *buffer = NULL;
+ uint32_t length;
+ int i;
+ /* Retrieve the NGAP gNB instance associated with Mod_id */
+ ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
+ DevAssert(pdusession_release_resp_p != NULL);
+ DevAssert(ngap_gNB_instance_p != NULL);
+
+ if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
+ pdusession_release_resp_p->gNB_ue_ngap_id)) == NULL) {
+ /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
+ NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
+ pdusession_release_resp_p->gNB_ue_ngap_id);
+ return -1;
+ }
+
+ /* Prepare the NGAP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceRelease;
+ pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
+ pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_PDUSessionResourceReleaseResponse;
+ out = &pdu.choice.successfulOutcome->value.choice.PDUSessionResourceReleaseResponse;
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceReleaseResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceReleaseResponseIEs__value_PR_AMF_UE_NGAP_ID;
+ asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ /* mandatory */
+ ie = (NGAP_PDUSessionResourceReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceReleaseResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceReleaseResponseIEs__value_PR_RAN_UE_NGAP_ID;
+ ie->value.choice.RAN_UE_NGAP_ID = pdusession_release_resp_p->gNB_ue_ngap_id;
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional */
+ if (pdusession_release_resp_p->nb_of_pdusessions_released > 0) {
+ ie = (NGAP_PDUSessionResourceReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceReleaseResponseIEs_t));
+ ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceReleasedListRelRes;
+ ie->criticality = NGAP_Criticality_ignore;
+ ie->value.present = NGAP_PDUSessionResourceReleaseResponseIEs__value_PR_PDUSessionResourceReleasedListRelRes;
+
+ for (i = 0; i < pdusession_release_resp_p->nb_of_pdusessions_released; i++) {
+ NGAP_PDUSessionResourceReleasedItemRelRes_t *item;
+ item = (NGAP_PDUSessionResourceReleasedItemRelRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceReleasedItemRelRes_t));
+
+ item->pDUSessionID = pdusession_release_resp_p->pdusession_release[i].pdusession_id;
+ NGAP_DEBUG("pdusession_release_resp: pdusession ID %ld\n", item->pDUSessionID);
+ ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceReleasedListRelRes.list, item);
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+ }
+
+
+ if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
+ NGAP_ERROR("Failed to encode release response\n");
+ /* Encode procedure has failed... */
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE(
+ MSC_NGAP_GNB,
+ MSC_NGAP_AMF,
+ (const char *)buffer,
+ length,
+ MSC_AS_TIME_FMT" E_RAN Release successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %lu",
+ 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
+ pdusession_release_resp_p->gNB_ue_ngap_id,
+ (uint64_t)ue_context_p->amf_ue_ngap_id);
+ /* UE associated signalling -> use the allocated stream */
+ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
+ ue_context_p->amf_ref->assoc_id, buffer,
+ length, ue_context_p->tx_stream);
+ NGAP_INFO("pdusession_release_response sended gNB_UE_NGAP_ID %u amf_ue_ngap_id %lu nb_of_pdusessions_released %d nb_of_pdusessions_failed %d\n",
+ pdusession_release_resp_p->gNB_ue_ngap_id, (uint64_t)ue_context_p->amf_ue_ngap_id,pdusession_release_resp_p->nb_of_pdusessions_released,pdusession_release_resp_p->nb_of_pdusessions_failed);
+
+ return 0;
+}
+
+int ngap_gNB_path_switch_req(instance_t instance,
+ ngap_path_switch_req_t *path_switch_req_p)
+//------------------------------------------------------------------------------
+{
+ //TODO
+
+ return 0;
+}
+
+int ngap_gNB_generate_PDUSESSION_Modification_Indication(
+ instance_t instance,
+ ngap_pdusession_modification_ind_t *pdusession_modification_ind)
+//-----------------------------------------------------------------------------
+{
+ //TODO
+ return 0;
+}
+
+
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.h b/openair3/NGAP/ngap_gNB_nas_procedures.h
new file mode 100644
index 0000000000..e7552cd47e
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.h
@@ -0,0 +1,68 @@
+/*
+ * 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 ngap_gNB_nas_procedures.h
+ * \brief NGAP gNb NAS procedure handler
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ * \version 1.0
+ * @ingroup _ngap
+ */
+
+#ifndef NGAP_GNB_NAS_PROCEDURES_H_
+#define NGAP_GNB_NAS_PROCEDURES_H_
+
+int ngap_gNB_handle_nas_downlink(
+ uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+int ngap_gNB_nas_uplink(instance_t instance, ngap_uplink_nas_t *ngap_uplink_nas_p);
+
+int ngap_gNB_nas_non_delivery_ind(instance_t instance,
+ ngap_nas_non_delivery_ind_t *ngap_nas_non_delivery_ind);
+
+int ngap_gNB_handle_nas_first_req(
+ instance_t instance, ngap_nas_first_req_t *ngap_nas_first_req_p);
+
+int ngap_gNB_initial_ctxt_resp(
+ instance_t instance, ngap_initial_context_setup_resp_t *initial_ctxt_resp_p);
+
+int ngap_gNB_ue_capabilities(instance_t instance,
+ ngap_ue_cap_info_ind_t *ue_cap_info_ind_p);
+
+int ngap_gNB_pdusession_setup_resp(instance_t instance,
+ ngap_pdusession_setup_resp_t *pdusession_setup_resp_p);
+
+int ngap_gNB_pdusession_modify_resp(instance_t instance,
+ ngap_pdusession_modify_resp_t *pdusession_modify_resp_p);
+
+int ngap_gNB_pdusession_release_resp(instance_t instance,
+ ngap_pdusession_release_resp_t *pdusession_release_resp_p);
+
+int ngap_gNB_path_switch_req(instance_t instance,
+ ngap_path_switch_req_t *path_switch_req_p);
+
+int ngap_gNB_generate_PDUSESSION_Modification_Indication(
+ instance_t instance, ngap_pdusession_modification_ind_t *pdusession_modification_ind);
+
+#endif /* NGAP_GNB_NAS_PROCEDURES_H_ */
diff --git a/openair3/NGAP/ngap_gNB_nnsf.c b/openair3/NGAP/ngap_gNB_nnsf.c
new file mode 100644
index 0000000000..e9ec66b1b4
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_nnsf.c
@@ -0,0 +1,410 @@
+/*
+ * 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 ngap_gNB_nnsf.c
+ * \brief ngap NAS node selection functions
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#include
+#include
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+
+#include "ngap_gNB_defs.h"
+#include "ngap_gNB_nnsf.h"
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause)
+{
+ struct ngap_gNB_amf_data_s *amf_data_p = NULL;
+ struct ngap_gNB_amf_data_s *amf_highest_capacity_p = NULL;
+ uint8_t current_capacity = 0;
+
+ RB_FOREACH(amf_data_p, ngap_amf_map, &instance_p->ngap_amf_head) {
+ if (amf_data_p->state != NGAP_GNB_STATE_CONNECTED) {
+ /* The association between AMF and gNB is not ready for the moment,
+ * go to the next known AMF.
+ */
+ if (amf_data_p->state == NGAP_GNB_OVERLOAD) {
+ /* AMF is overloaded. We have to check the RRC establishment
+ * cause and take decision to the select this AMF depending on
+ * the overload state.
+ */
+ if ((cause == NGAP_RRC_CAUSE_MO_DATA)
+ && (amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_MO_DATA)) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_ALL_SIGNALLING)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA))) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_ONLY_EMERGENCY_AND_MT)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA)
+ || (cause == NGAP_RRC_CAUSE_HIGH_PRIO_ACCESS))) {
+ continue;
+ }
+
+ /* At this point, the RRC establishment can be handled by the AMF
+ * even if it is in overload state.
+ */
+ } else {
+ /* The AMF is not overloaded, association is simply not ready. */
+ continue;
+ }
+ }
+
+ if (current_capacity < amf_data_p->relative_amf_capacity) {
+ /* We find a better AMF, keep a reference to it */
+ current_capacity = amf_data_p->relative_amf_capacity;
+ amf_highest_capacity_p = amf_data_p;
+ }
+ }
+
+ return amf_highest_capacity_p;
+}
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf_by_plmn_id(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ int selected_plmn_identity)
+{
+ struct ngap_gNB_amf_data_s *amf_data_p = NULL;
+ struct ngap_gNB_amf_data_s *amf_highest_capacity_p = NULL;
+ uint8_t current_capacity = 0;
+
+ RB_FOREACH(amf_data_p, ngap_amf_map, &instance_p->ngap_amf_head) {
+ struct served_guami_s *guami_p = NULL;
+ struct plmn_identity_s *served_plmn_p = NULL;
+ if (amf_data_p->state != NGAP_GNB_STATE_CONNECTED) {
+ /* The association between AMF and gNB is not ready for the moment,
+ * go to the next known AMF.
+ */
+ if (amf_data_p->state == NGAP_GNB_OVERLOAD) {
+ /* AMF is overloaded. We have to check the RRC establishment
+ * cause and take decision to the select this AMF depending on
+ * the overload state.
+ */
+ if ((cause == NGAP_RRC_CAUSE_MO_DATA)
+ && (amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_MO_DATA)) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_ALL_SIGNALLING)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA))) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_ONLY_EMERGENCY_AND_MT)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA)
+ || (cause == NGAP_RRC_CAUSE_HIGH_PRIO_ACCESS))) {
+ continue;
+ }
+
+ /* At this point, the RRC establishment can be handled by the AMF
+ * even if it is in overload state.
+ */
+ } else {
+ /* The AMF is not overloaded, association is simply not ready. */
+ continue;
+ }
+ }
+
+ /* Looking for served GUAMI PLMN Identity selected matching the one provided by the UE */
+ STAILQ_FOREACH(guami_p, &amf_data_p->served_guami, next) {
+ STAILQ_FOREACH(served_plmn_p, &guami_p->served_plmns, next) {
+ if ((served_plmn_p->mcc == instance_p->mcc[selected_plmn_identity]) &&
+ (served_plmn_p->mnc == instance_p->mnc[selected_plmn_identity])) {
+ break;
+ }
+ }
+ /* if found, we can stop the outer loop, too */
+ if (served_plmn_p) break;
+ }
+ /* if we didn't find such a served PLMN, go on with the next AMF */
+ if (!served_plmn_p) continue;
+
+ if (current_capacity < amf_data_p->relative_amf_capacity) {
+ /* We find a better AMF, keep a reference to it */
+ current_capacity = amf_data_p->relative_amf_capacity;
+ amf_highest_capacity_p = amf_data_p;
+ }
+ }
+
+ return amf_highest_capacity_p;
+}
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf_by_amf_setid(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ int selected_plmn_identity,
+ uint8_t amf_setid)
+{
+ struct ngap_gNB_amf_data_s *amf_data_p = NULL;
+
+ RB_FOREACH(amf_data_p, ngap_amf_map, &instance_p->ngap_amf_head) {
+ struct served_guami_s *guami_p = NULL;
+
+ if (amf_data_p->state != NGAP_GNB_STATE_CONNECTED) {
+ /* The association between AMF and gNB is not ready for the moment,
+ * go to the next known AMF.
+ */
+ if (amf_data_p->state == NGAP_GNB_OVERLOAD) {
+ /* AMF is overloaded. We have to check the RRC establishment
+ * cause and take decision to the select this AMF depending on
+ * the overload state.
+ */
+ if ((cause == NGAP_RRC_CAUSE_MO_DATA)
+ && (amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_MO_DATA)) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_ALL_SIGNALLING)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA))) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_ONLY_EMERGENCY_AND_MT)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA)
+ || (cause == NGAP_RRC_CAUSE_HIGH_PRIO_ACCESS))) {
+ continue;
+ }
+
+ /* At this point, the RRC establishment can be handled by the AMF
+ * even if it is in overload state.
+ */
+ } else {
+ /* The AMF is not overloaded, association is simply not ready. */
+ continue;
+ }
+ }
+
+ /* Looking for AMF code matching the one provided by NAS */
+ STAILQ_FOREACH(guami_p, &amf_data_p->served_guami, next) {
+ struct amf_set_id_s *amf_setid_p = NULL;
+ struct plmn_identity_s *served_plmn_p = NULL;
+
+ STAILQ_FOREACH(served_plmn_p, &guami_p->served_plmns, next) {
+ if ((served_plmn_p->mcc == instance_p->mcc[selected_plmn_identity]) &&
+ (served_plmn_p->mnc == instance_p->mnc[selected_plmn_identity])) {
+ break;
+ }
+ }
+ STAILQ_FOREACH(amf_setid_p, &guami_p->amf_set_ids, next) {
+ if (amf_setid_p->amf_set_id == amf_setid) {
+ break;
+ }
+ }
+
+ /* The AMF matches the parameters provided by the NAS layer ->
+ * the AMF is knwown and the association is ready.
+ * Return the reference to the AMF to use it for this UE.
+ */
+ if (amf_setid_p && served_plmn_p) {
+ return amf_data_p;
+ }
+ }
+ }
+
+ /* At this point no AMF matches the selected PLMN and AMF code. In this case,
+ * return NULL. That way the RRC layer should know about it and reject RRC
+ * connectivity. */
+ return NULL;
+}
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf_by_guami(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ ngap_guami_t guami)
+{
+ struct ngap_gNB_amf_data_s *amf_data_p = NULL;
+
+ RB_FOREACH(amf_data_p, ngap_amf_map, &instance_p->ngap_amf_head) {
+ struct served_guami_s *guami_p = NULL;
+
+ if (amf_data_p->state != NGAP_GNB_STATE_CONNECTED) {
+ /* The association between AMF and gNB is not ready for the moment,
+ * go to the next known AMF.
+ */
+ if (amf_data_p->state == NGAP_GNB_OVERLOAD) {
+ /* AMF is overloaded. We have to check the RRC establishment
+ * cause and take decision to the select this AMF depending on
+ * the overload state.
+ */
+ if ((cause == NGAP_RRC_CAUSE_MO_DATA)
+ && (amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_MO_DATA)) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_REJECT_ALL_SIGNALLING)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA))) {
+ continue;
+ }
+
+ if ((amf_data_p->overload_state == NGAP_OVERLOAD_ONLY_EMERGENCY_AND_MT)
+ && ((cause == NGAP_RRC_CAUSE_MO_SIGNALLING) || (cause == NGAP_RRC_CAUSE_MO_DATA)
+ || (cause == NGAP_RRC_CAUSE_HIGH_PRIO_ACCESS))) {
+ continue;
+ }
+
+ /* At this point, the RRC establishment can be handled by the AMF
+ * even if it is in overload state.
+ */
+ } else {
+ /* The AMF is not overloaded, association is simply not ready. */
+ continue;
+ }
+ }
+
+ /* Looking for AMF guami matching the one provided by NAS */
+ STAILQ_FOREACH(guami_p, &amf_data_p->served_guami, next) {
+ struct served_region_id_s *region_id_p = NULL;
+ struct amf_set_id_s *amf_set_id_p = NULL;
+ struct amf_pointer_s *pointer_p = NULL;
+ struct plmn_identity_s *served_plmn_p = NULL;
+
+ STAILQ_FOREACH(served_plmn_p, &guami_p->served_plmns, next) {
+ if ((served_plmn_p->mcc == guami.mcc) &&
+ (served_plmn_p->mnc == guami.mnc)) {
+ break;
+ }
+ }
+
+ STAILQ_FOREACH(region_id_p, &guami_p->served_region_ids, next) {
+ if (region_id_p->amf_region_id == guami.amf_region_id) {
+ break;
+ }
+ }
+ STAILQ_FOREACH(amf_set_id_p, &guami_p->amf_set_ids, next) {
+ if (amf_set_id_p->amf_set_id == guami.amf_set_id) {
+ break;
+ }
+ }
+ STAILQ_FOREACH(pointer_p, &guami_p->amf_pointers, next) {
+ if (pointer_p->amf_pointer == guami.amf_pointer) {
+ break;
+ }
+ }
+
+ /* The AMF matches the parameters provided by the NAS layer ->
+ * the AMF is knwown and the association is ready.
+ * Return the reference to the AMF to use it for this UE.
+ */
+ if ((region_id_p != NULL) &&
+ (amf_set_id_p != NULL) &&
+ (pointer_p != NULL) &&
+ (served_plmn_p != NULL)) {
+ return amf_data_p;
+ }
+ }
+ }
+
+ /* At this point no AMF matches the provided GUAMI. In this case, return
+ * NULL. That way the RRC layer should know about it and reject RRC
+ * connectivity. */
+ return NULL;
+}
+
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf_by_guami_no_cause(ngap_gNB_instance_t *instance_p,
+ ngap_guami_t guami)
+{
+ struct ngap_gNB_amf_data_s *amf_data_p = NULL;
+ struct ngap_gNB_amf_data_s *amf_highest_capacity_p = NULL;
+ uint8_t current_capacity = 0;
+
+
+ RB_FOREACH(amf_data_p, ngap_amf_map, &instance_p->ngap_amf_head) {
+ struct served_guami_s *guami_p = NULL;
+
+ if (amf_data_p->state != NGAP_GNB_STATE_CONNECTED) {
+ /* The association between AMF and gNB is not ready for the moment,
+ * go to the next known AMF.
+ */
+ if (amf_data_p->state == NGAP_GNB_OVERLOAD) {
+ /* AMF is overloaded. We have to check the RRC establishment
+ * cause and take decision to the select this AMF depending on
+ * the overload state.
+ */
+ } else {
+ /* The AMF is not overloaded, association is simply not ready. */
+ continue;
+ }
+ }
+
+ if (current_capacity < amf_data_p->relative_amf_capacity) {
+ /* We find a better AMF, keep a reference to it */
+ current_capacity = amf_data_p->relative_amf_capacity;
+ amf_highest_capacity_p = amf_data_p;
+ }
+
+ /* Looking for AMF guami matching the one provided by NAS */
+ STAILQ_FOREACH(guami_p, &amf_data_p->served_guami, next) {
+ struct served_region_id_s *region_id_p = NULL;
+ struct amf_set_id_s *amf_set_id_p = NULL;
+ struct plmn_identity_s *served_plmn_p = NULL;
+
+ STAILQ_FOREACH(served_plmn_p, &guami_p->served_plmns, next) {
+ if ((served_plmn_p->mcc == guami.mcc) &&
+ (served_plmn_p->mnc == guami.mnc)) {
+ break;
+ }
+ }
+ STAILQ_FOREACH(amf_set_id_p, &guami_p->amf_set_ids, next) {
+ if (amf_set_id_p->amf_set_id == guami.amf_set_id) {
+ break;
+ }
+ }
+ STAILQ_FOREACH(region_id_p, &guami_p->served_region_ids, next) {
+ if (region_id_p->amf_region_id == guami.amf_region_id) {
+ break;
+ }
+ }
+
+ /* The AMF matches the parameters provided by the NAS layer ->
+ * the AMF is knwown and the association is ready.
+ * Return the reference to the AMF to use it for this UE.
+ */
+ if ((region_id_p != NULL) &&
+ (amf_set_id_p != NULL) &&
+ (served_plmn_p != NULL)) {
+ return amf_data_p;
+ }
+ }
+ }
+
+ /* At this point no AMF matches the provided GUAMI. Select the one with the
+ * highest relative capacity.
+ * In case the list of known AMF is empty, simply return NULL, that way the RRC
+ * layer should know about it and reject RRC connectivity.
+ */
+
+ return amf_highest_capacity_p;
+}
diff --git a/openair3/NGAP/ngap_gNB_nnsf.h b/openair3/NGAP/ngap_gNB_nnsf.h
new file mode 100644
index 0000000000..7d43a890ea
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_nnsf.h
@@ -0,0 +1,57 @@
+/*
+ * 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 ngap_gNB_nnsf.h
+ * \brief ngap NAS node selection functions
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#ifndef NGAP_GNB_NNSF_H_
+#define NGAP_GNB_NNSF_H_
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause);
+
+struct ngap_gNB_amf_data_s *
+ngap_gNB_nnsf_select_amf_by_plmn_id(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ int selected_plmn_identity);
+
+struct ngap_gNB_amf_data_s*
+ngap_gNB_nnsf_select_amf_by_amf_setid(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ int selected_plmn_identity,
+ uint8_t amf_setid);
+
+struct ngap_gNB_amf_data_s*
+ngap_gNB_nnsf_select_amf_by_guami(ngap_gNB_instance_t *instance_p,
+ ngap_rrc_establishment_cause_t cause,
+ ngap_guami_t guami);
+
+struct ngap_gNB_amf_data_s*
+ngap_gNB_nnsf_select_amf_by_guami_no_cause(ngap_gNB_instance_t *instance_p,
+ ngap_guami_t guami);
+
+#endif /* NGAP_GNB_NNSF_H_ */
diff --git a/openair3/NGAP/ngap_gNB_overload.c b/openair3/NGAP/ngap_gNB_overload.c
new file mode 100644
index 0000000000..318a2124bd
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_overload.c
@@ -0,0 +1,79 @@
+/*
+ * 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 ngap_gNB_overload.c
+ * \brief ngap procedures for overload messages within gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+
+#include
+#include
+#include
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+
+#include "ngap_gNB.h"
+#include "ngap_gNB_ue_context.h"
+#include "ngap_gNB_encoder.h"
+#include "ngap_gNB_overload.h"
+#include "ngap_gNB_management_procedures.h"
+
+#include "assertions.h"
+
+int ngap_gNB_handle_overload_start(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu)
+{
+ //TODO
+ return 0;
+}
+
+int ngap_gNB_handle_overload_stop(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu)
+{
+ /* We received Overload stop message, meaning that the AMF is no more
+ * overloaded. This is an empty message, with only message header and no
+ * Information Element.
+ */
+ DevAssert(pdu != NULL);
+
+ ngap_gNB_amf_data_t *amf_desc_p;
+
+ /* Non UE-associated signalling -> stream 0 */
+ DevCheck(stream == 0, stream, 0, 0);
+
+ if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
+ /* No AMF context associated */
+ return -1;
+ }
+
+ amf_desc_p->state = NGAP_GNB_STATE_CONNECTED;
+ amf_desc_p->overload_state = NGAP_NO_OVERLOAD;
+ return 0;
+}
diff --git a/openair3/NGAP/ngap_gNB_overload.h b/openair3/NGAP/ngap_gNB_overload.h
new file mode 100644
index 0000000000..0b7ab52c26
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_overload.h
@@ -0,0 +1,53 @@
+/*
+ * 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 ngap_gNB_overload.h
+ * \brief ngap procedures for overload messages within gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#ifndef NGAP_GNB_OVERLOAD_H_
+#define NGAP_GNB_OVERLOAD_H_
+
+/**
+ * \brief Handle an overload start message
+ **/
+// int ngap_gNB_handle_overload_start(gNB_amf_desc_t *gNB_desc_p,
+// sctp_queue_item_t *packet_p,
+// struct ngap_message_s *message_p);
+int ngap_gNB_handle_overload_start(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+/**
+ * \brief Handle an overload stop message
+ **/
+// int ngap_gNB_handle_overload_stop(gNB_amf_desc_t *gNB_desc_p,
+// sctp_queue_item_t *packet_p,
+// struct ngap_message_s *message_p);
+int ngap_gNB_handle_overload_stop(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+#endif /* NGAP_GNB_OVERLOAD_H_ */
diff --git a/openair3/NGAP/ngap_gNB_trace.c b/openair3/NGAP/ngap_gNB_trace.c
new file mode 100644
index 0000000000..f3e216988c
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_trace.c
@@ -0,0 +1,66 @@
+/*
+ * 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 ngap_gNB_trace.c
+ * \brief ngap trace procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#include
+
+#include "assertions.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_gNB_default_values.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+
+#include "ngap_gNB.h"
+#include "ngap_gNB_ue_context.h"
+#include "ngap_gNB_encoder.h"
+#include "ngap_gNB_trace.h"
+#include "ngap_gNB_itti_messaging.h"
+#include "ngap_gNB_management_procedures.h"
+
+
+int ngap_gNB_handle_trace_start(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu)
+{
+ //TODO
+ return 0;
+}
+
+int ngap_gNB_handle_deactivate_trace(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *message_p)
+{
+ // NGAP_DeactivateTraceIEs_t *deactivate_trace_p;
+ //
+ // deactivate_trace_p = &message_p->msg.deactivateTraceIEs;
+
+ return 0;
+}
diff --git a/openair3/NGAP/ngap_gNB_trace.h b/openair3/NGAP/ngap_gNB_trace.h
new file mode 100644
index 0000000000..91ea07ae80
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_trace.h
@@ -0,0 +1,54 @@
+/*
+ * 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 ngap_gNB_trace.h
+ * \brief ngap trace procedures for gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#ifndef NGAP_GNB_TRACE_H_
+#define NGAP_GNB_TRACE_H_
+
+// int ngap_gNB_generate_trace_failure(sctp_data_t *sctp_data_p,
+// int32_t stream,
+// uint32_t gNB_ue_ngap_id,
+// uint32_t amf_ue_ngap_id,
+// E_UTRAN_Trace_ID_t *trace_id,
+// Cause_t *cause_p);
+
+// int ngap_gNB_handle_trace_start(gNB_amf_desc_t *gNB_desc_p,
+// sctp_queue_item_t *packet_p,
+// struct ngap_message_s *message_p);
+int ngap_gNB_handle_trace_start(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+// int ngap_gNB_handle_deactivate_trace(gNB_amf_desc_t *gNB_desc_p,
+// sctp_queue_item_t *packet_p,
+// struct ngap_message_s *message_p);
+int ngap_gNB_handle_deactivate_trace(uint32_t assoc_id,
+ uint32_t stream,
+ NGAP_NGAP_PDU_t *pdu);
+
+#endif /* NGAP_GNB_TRACE_H_ */
diff --git a/openair3/NGAP/ngap_gNB_ue_context.c b/openair3/NGAP/ngap_gNB_ue_context.c
new file mode 100644
index 0000000000..332abfee43
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_ue_context.c
@@ -0,0 +1,103 @@
+/*
+ * 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 ngap_gNB_ue_context.c
+ * \brief ngap UE context management within gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#include
+#include
+#include
+#include
+
+#include "tree.h"
+
+#include "intertask_interface.h"
+
+#include "ngap_common.h"
+#include "ngap_gNB_defs.h"
+#include "ngap_gNB_ue_context.h"
+
+int ngap_gNB_compare_gNB_ue_ngap_id(
+ struct ngap_gNB_ue_context_s *p1, struct ngap_gNB_ue_context_s *p2)
+{
+ if (p1->gNB_ue_ngap_id > p2->gNB_ue_ngap_id) {
+ return 1;
+ }
+
+ if (p1->gNB_ue_ngap_id < p2->gNB_ue_ngap_id) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Generate the tree management functions */
+RB_GENERATE(ngap_ue_map, ngap_gNB_ue_context_s, entries,
+ ngap_gNB_compare_gNB_ue_ngap_id);
+
+struct ngap_gNB_ue_context_s *ngap_gNB_allocate_new_UE_context(void)
+{
+ struct ngap_gNB_ue_context_s *new_p;
+
+ new_p = malloc(sizeof(struct ngap_gNB_ue_context_s));
+
+ if (new_p == NULL) {
+ NGAP_ERROR("Cannot allocate new ue context\n");
+ return NULL;
+ }
+
+ memset(new_p, 0, sizeof(struct ngap_gNB_ue_context_s));
+
+ return new_p;
+}
+
+struct ngap_gNB_ue_context_s *ngap_gNB_get_ue_context(
+ ngap_gNB_instance_t *instance_p,
+ uint32_t gNB_ue_ngap_id)
+{
+ ngap_gNB_ue_context_t temp;
+
+ memset(&temp, 0, sizeof(struct ngap_gNB_ue_context_s));
+
+ /* gNB ue ngap id = 24 bits wide */
+ temp.gNB_ue_ngap_id = gNB_ue_ngap_id & 0x00FFFFFF;
+
+ return RB_FIND(ngap_ue_map, &instance_p->ngap_ue_head, &temp);
+}
+
+void ngap_gNB_free_ue_context(struct ngap_gNB_ue_context_s *ue_context_p)
+{
+ if (ue_context_p == NULL) {
+ NGAP_ERROR("Trying to free a NULL context\n");
+ return;
+ }
+
+ /* TODO: check that context is currently not in the tree of known
+ * contexts.
+ */
+
+ free(ue_context_p);
+}
diff --git a/openair3/NGAP/ngap_gNB_ue_context.h b/openair3/NGAP/ngap_gNB_ue_context.h
new file mode 100644
index 0000000000..4b300c6fea
--- /dev/null
+++ b/openair3/NGAP/ngap_gNB_ue_context.h
@@ -0,0 +1,103 @@
+/*
+ * 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 ngap_gNB_ue_context.h
+ * \brief ngap UE context management within gNB
+ * \author Yoshio INOUE, Masayuki HARADA
+ * \date 2020
+ * \version 0.1
+ * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
+ */
+
+#include "tree.h"
+#include "queue.h"
+
+#include "ngap_gNB_defs.h"
+
+#ifndef NGAP_GNB_UE_CONTEXT_H_
+#define NGAP_GNB_UE_CONTEXT_H_
+
+// Forward declarations
+struct ngap_gNB_amf_data_s;
+struct ngap_ue_map;
+struct gNB_amf_desc_s;
+
+typedef enum {
+ /* UE has not been registered to a AMF or UE association has failed. */
+ NGAP_UE_DECONNECTED = 0x0,
+ /* UE ngap state is waiting for initial context setup request message. */
+ NGAP_UE_WAITING_CSR = 0x1,
+ /* UE association is ready and bearers are established. */
+ NGAP_UE_CONNECTED = 0x2,
+ NGAP_UE_STATE_MAX,
+} ngap_ue_state;
+
+typedef struct ngap_gNB_ue_context_s {
+ /* Tree related data */
+ RB_ENTRY(ngap_gNB_ue_context_s) entries;
+
+ /* Uniquely identifies the UE between AMF and gNB within the gNB.
+ * This id is encoded on 32bits.
+ */
+ uint32_t gNB_ue_ngap_id;
+
+ /* UE id for initial connection to NGAP */
+ uint16_t ue_initial_id;
+
+ /* Uniquely identifies the UE within AMF. Encoded on 32 bits. */
+ uint64_t amf_ue_ngap_id:40;
+
+ /* Stream used for this particular UE */
+ int32_t tx_stream;
+ int32_t rx_stream;
+
+ /* Current UE state. */
+ ngap_ue_state ue_state;
+
+ /* Reference to AMF data this UE is attached to */
+ struct ngap_gNB_amf_data_s *amf_ref;
+
+ /* Signaled by the UE in RRC Connection Setup Complete and used in NAS Uplink
+ * to route NAS messages correctly. 0-based, not 1-based as in TS 36.331
+ * 6.2.2 RRC Connection Setup Complete! */
+ int selected_plmn_identity;
+
+ /* Reference to gNB data this UE is attached to */
+ ngap_gNB_instance_t *gNB_instance;
+} ngap_gNB_ue_context_t;
+
+int ngap_gNB_compare_gNB_ue_ngap_id(
+ struct ngap_gNB_ue_context_s *p1, struct ngap_gNB_ue_context_s *p2);
+
+/* Generate the tree management functions prototypes */
+RB_PROTOTYPE(ngap_ue_map, ngap_gNB_ue_context_s, entries,
+ ngap_gNB_compare_gNB_ue_ngap_id);
+
+struct ngap_gNB_ue_context_s *ngap_gNB_allocate_new_UE_context(void);
+
+struct ngap_gNB_ue_context_s *ngap_gNB_get_ue_context(
+ ngap_gNB_instance_t *instance_p,
+ uint32_t gNB_ue_ngap_id);
+
+void ngap_gNB_free_ue_context(struct ngap_gNB_ue_context_s *ue_context_p);
+
+
+#endif /* NGAP_GNB_UE_CONTEXT_H_ */
diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c
index c703501847..2a153acaa2 100644
--- a/openair3/S1AP/s1ap_eNB.c
+++ b/openair3/S1AP/s1ap_eNB.c
@@ -89,6 +89,7 @@ uint32_t s1ap_generate_eNB_id(void) {
static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
net_ip_address_t *mme_ip_address,
+ uint16_t mme_port,
net_ip_address_t *local_ip_addr,
uint16_t in_streams,
uint16_t out_streams,
@@ -102,7 +103,7 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
DevAssert(mme_ip_address != NULL);
message_p = itti_alloc_new_message(TASK_S1AP, SCTP_NEW_ASSOCIATION_REQ);
sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req;
- sctp_new_association_req_p->port = S1AP_PORT_NUMBER;
+ sctp_new_association_req_p->port = mme_port;
sctp_new_association_req_p->ppid = S1AP_SCTP_PPID;
sctp_new_association_req_p->in_streams = in_streams;
sctp_new_association_req_p->out_streams = out_streams;
@@ -221,6 +222,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *
/* Trying to connect to provided list of MME ip address */
for (index = 0; index < s1ap_register_eNB->nb_mme; index++) {
net_ip_address_t *mme_ip = &s1ap_register_eNB->mme_ip_address[index];
+ uint16_t mme_port = s1ap_register_eNB->mme_port[index];
struct s1ap_eNB_mme_data_s *mme = NULL;
RB_FOREACH(mme, s1ap_mme_map, &new_instance->s1ap_mme_head) {
/* Compare whether IPv4 and IPv6 information is already present, in which
@@ -235,6 +237,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *
continue;
s1ap_eNB_register_mme(new_instance,
mme_ip,
+ mme_port,
&s1ap_register_eNB->enb_ip_address,
s1ap_register_eNB->sctp_in_streams,
s1ap_register_eNB->sctp_out_streams,
diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h
index d28c9acccb..cfb2c8cdfc 100644
--- a/openair3/UTILS/conversions.h
+++ b/openair3/UTILS/conversions.h
@@ -81,6 +81,23 @@ do { \
((buf)[1]); \
} while(0)
+/* Convert an integer on 24 bits to the given bUFFER */
+#define INT24_TO_BUFFER(x, buf) \
+do { \
+ (buf)[0] = (x) >> 16; \
+ (buf)[1] = (x) >> 8; \
+ (buf)[2] = (x); \
+} while(0)
+
+/* Convert an array of char containing vALUE to x */
+#define BUFFER_TO_INT24(buf, x) \
+do { \
+ x = ((buf)[0] << 16) | \
+ ((buf)[1] << 8 ) | \
+ ((buf)[2]); \
+} while(0)
+
+
/* Convert an integer on 32 bits to the given bUFFER */
#define INT32_TO_BUFFER(x, buf) \
do { \
@@ -126,6 +143,21 @@ do { \
(aSN)->bits_unused = 0; \
} while(0)
+
+#define INT24_TO_OCTET_STRING(x, aSN) \
+do { \
+ (aSN)->buf = calloc(3, sizeof(uint8_t)); \
+ INT24_TO_BUFFER(x, ((aSN)->buf)); \
+ (aSN)->size = 3; \
+} while(0)
+
+#define INT24_TO_BIT_STRING(x, aSN) \
+do { \
+ INT24_TO_OCTET_STRING(x, aSN); \
+ (aSN)->bits_unused = 0; \
+} while(0)
+
+
#define INT8_TO_OCTET_STRING(x, aSN) \
do { \
(aSN)->buf = calloc(1, sizeof(uint8_t)); \
@@ -137,6 +169,25 @@ do { \
#define M_TMSI_TO_OCTET_STRING INT32_TO_OCTET_STRING
#define MME_GID_TO_OCTET_STRING INT16_TO_OCTET_STRING
+#define AMF_REGION_TO_BIT_STRING(x, aSN) \
+ do { \
+ INT8_TO_OCTET_STRING(x, aSN); \
+ (aSN)->bits_unused = 0; \
+} while(0)
+
+#define AMF_SETID_TO_BIT_STRING(x, aSN) \
+ do { \
+ INT16_TO_OCTET_STRING(x, aSN); \
+ (aSN)->bits_unused = 6; \
+} while(0)
+
+#define AMF_POINTER_TO_BIT_STRING(x, aSN) \
+ do { \
+ INT8_TO_OCTET_STRING(x, aSN); \
+ (aSN)->bits_unused = 2; \
+} while(0)
+
+
#define ENCRALG_TO_BIT_STRING(encralg, bitstring) \
do { \
(bitstring)->size=2; \
@@ -197,6 +248,12 @@ do { \
BUFFER_TO_INT16((aSN)->buf, x); \
} while(0)
+#define OCTET_STRING_TO_INT24(aSN, x) \
+do { \
+ DevCheck((aSN)->size == 2 || (aSN)->size == 3, (aSN)->size, 0, 0); \
+ BUFFER_TO_INT24((aSN)->buf, x); \
+} while(0)
+
#define OCTET_STRING_TO_INT32(aSN, x) \
do { \
DevCheck((aSN)->size == 4, (aSN)->size, 0, 0); \
@@ -445,6 +502,19 @@ do { \
(bITsTRING)->size = 3; \
(bITsTRING)->bits_unused = 4; \
} while(0)
+
+
+#define MACRO_GNB_ID_TO_BIT_STRING(mACRO, bITsTRING) \
+do { \
+ (bITsTRING)->buf = calloc(4, sizeof(uint8_t)); \
+ (bITsTRING)->buf[0] = ((mACRO) >> 20); \
+ (bITsTRING)->buf[1] = (mACRO) >> 12; \
+ (bITsTRING)->buf[2] = (mACRO) >> 4; \
+ (bITsTRING)->buf[3] = ((mACRO) & 0x0f) << 4; \
+ (bITsTRING)->size = 4; \
+ (bITsTRING)->bits_unused = 4; \
+} while(0)
+
/* TS 36.413 v10.9.0 section 9.2.1.38:
* E-UTRAN CGI/Cell Identity
* The leftmost bits of the Cell
@@ -462,6 +532,19 @@ do { \
(bITsTRING)->bits_unused = 4; \
} while(0)
+#define MACRO_GNB_ID_TO_CELL_IDENTITY(mACRO, cELL_iD, bITsTRING) \
+do { \
+ (bITsTRING)->buf = calloc(5, sizeof(uint8_t)); \
+ (bITsTRING)->buf[0] = ((mACRO) >> 20); \
+ (bITsTRING)->buf[1] = (mACRO) >> 12; \
+ (bITsTRING)->buf[2] = (mACRO) >> 4; \
+ (bITsTRING)->buf[3] = (((mACRO) & 0x0f) << 4) | ((cELL_iD) >> 4); \
+ (bITsTRING)->buf[4] = ((cELL_iD) & 0x0f) << 4; \
+ (bITsTRING)->size = 5; \
+ (bITsTRING)->bits_unused = 4; \
+} while(0)
+
+
/* Used to format an uint32_t containing an ipv4 address */
#define IPV4_ADDR "%u.%u.%u.%u"
#define IPV4_ADDR_FORMAT(aDDRESS) \
diff --git a/targets/COMMON/openairinterface5g_limits.h b/targets/COMMON/openairinterface5g_limits.h
index a678197fde..ad98a6091b 100644
--- a/targets/COMMON/openairinterface5g_limits.h
+++ b/targets/COMMON/openairinterface5g_limits.h
@@ -20,7 +20,8 @@
# define NUMBER_OF_CONNECTED_gNB_MAX 1
# endif
# else
-# define NUMBER_OF_UE_MAX 1
+# define NUMBER_OF_UE_MAX 4
+# define NUMBER_OF_NR_UE_MAX 4
# define NUMBER_OF_UCI_VARS_MAX 56
# define NUMBER_OF_CONNECTED_eNB_MAX 1
# define NUMBER_OF_CONNECTED_gNB_MAX 1
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index 6f081fa24f..56078029af 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -23,7 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
-
+
servingCellConfigCommon = (
{
#spCellConfigCommon
@@ -247,8 +247,15 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
eNB_instances = [0];
- #beamforming 1x4 matrix:
- bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ bf_weights = [0x00007fff, 0x0000];
+ ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+ ## beamforming 2x2 matrix:
+ # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ ## beamforming 4x4 matrix:
+ #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
clock_src = "external";
}